当前位置:   article > 正文

python日志输出_python 输出日志

python 输出日志

1、输出到控制台

1.1日志级别

日志级别有5个级别,默认输出的是waring级别的,可以通过logging.basicConfig(level=logging.DEBUG)对输出的级别进行设置

import logging


if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG)  # 配置日志级别
    logging.debug('debug级别,一般用来打印一些调试信息,级别最低')
    logging.info('info级别,一般用来打印一些正常的操作信息')
    logging.warning('waring级别,一般用来打印警告信息')
    logging.error('error级别,一般用来打印一些错误信息')
    logging.critical('critical级别,一般用来打印一些致命的错误信息,等级最高')

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

输出

DEBUG:root:debug级别,一般用来打印一些调试信息,级别最低
INFO:root:info级别,一般用来打印一些正常的操作信息
WARNING:root:waring级别,一般用来打印警告信息
ERROR:root:error级别,一般用来打印一些错误信息
CRITICAL:root:critical级别,一般用来打印一些致命的错误信息,等级最高
  • 1
  • 2
  • 3
  • 4
  • 5

1.2日志格式

可以对输出的日志格式进行设置

import logging


if __name__ == '__main__':
    logging.basicConfig(format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s',
                        level=logging.DEBUG)     # 配置输出格式、配置日志级别
    logging.debug('debug级别,一般用来打印一些调试信息,级别最低')
    logging.info('info级别,一般用来打印一些正常的操作信息')
    logging.warning('waring级别,一般用来打印警告信息')
    logging.error('error级别,一般用来打印一些错误信息')
    logging.critical('critical级别,一般用来打印一些致命的错误信息,等级最高')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

输出

2024-01-25 16:19:30,409 - 111.py[line:17] - DEBUG: debug级别,一般用来打印一些调试信息,级别最低
2024-01-25 16:19:30,410 - 111.py[line:18] - INFO: info级别,一般用来打印一些正常的操作信息
2024-01-25 16:19:30,410 - 111.py[line:19] - WARNING: waring级别,一般用来打印警告信息
2024-01-25 16:19:30,410 - 111.py[line:20] - ERROR: error级别,一般用来打印一些错误信息
2024-01-25 16:19:30,410 - 111.py[line:21] - CRITICAL: critical级别,一般用来打印一些致命的错误信息,等级最高
  • 1
  • 2
  • 3
  • 4
  • 5

format的内置参数有

%(name)s:Logger的名字
%(levelno)s:打印日志级别的数值
%(levelname)s:打印日志级别的名称
%(pathname)s:打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s:打印当前执行程序名
%(funcName)s:打印日志的当前函数
%(lineno)d:打印日志的当前行号
%(asctime)s:打印日志的时间
%(thread)d:打印线程ID
%(threadName)s:打印线程名称
%(process)d:打印进程ID
%(message)s:打印日志信息

2、输出到文件

输出日志到文件步骤:

  • 1.创建日志器logging.getLogger()

  • 2.设置日志级别

  • 3.设置日志的格式

  • 4.设置handler,handler的作用是将消息分别发送到指定的位置(如文件、控制台)

  • 5.为logger增加handler,logger对象可以通过addHandler()为自己添加一个或多个handler,可以同时将日志输出到控制台、文件等,添加几种handler就会输出几种类型;

    日志器(logger)是入口,真正干活儿的是处理器(handler),处理器(handler)还可以通过过滤器(filter)和格式器(formatter)对要输出的日志内容做过滤和格式化等处理操作

    • 常用的handler
    Handler描述
    logging.StreamHandler将日志消息发送到控制台
    logging.FileHandler将日志消息发送到磁盘文件,默认情况下文件大小会无限增长
    logging.handlers.RotatingFileHandler将日志消息发送到磁盘文件,并支持日志文件按大小切割
    logging.hanlders.TimedRotatingFileHandler将日志消息发送到磁盘文件,并支持日志文件按时间切割
    logging.handlers.HTTPHandler将日志消息以GET或POST的方式发送给一个HTTP服务器
    logging.handlers.SMTPHandler将日志消息发送给一个指定的email地址
    logging.NullHandler该Handler实例会忽略error messages
import logging


if __name__ == '__main__':
    #创建日志器
    logger = logging.getLogger()
    # 设置日志级别
    logger.setLevel(level=logging.DEBUG)
    # 设置日志格式
    formatter = logging.Formatter('%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')

    # 设置文件处理器,指定保存到demo2.txt文件中
    file_handler = logging.FileHandler('demo2.txt')
    # 设置文件处理器输出日志的级别
    file_handler.setLevel(level=logging.INFO)
    # 设置文件处理器日志的格式
    file_handler.setFormatter(formatter)

    # 设置控制台处理器
    stream_handler = logging.StreamHandler()
    # 设置控制台处理器输出日志的级别
    stream_handler.setLevel(logging.DEBUG)
    # 设置控制台处理器日志的格式
    stream_handler.setFormatter(formatter)

    # 为logger对象增加一个 文件handle
    logger.addHandler(file_handler)
    # 为logger对象增加一个 控制台handle
    logger.addHandler(stream_handler)

    logger.debug('debug级别,一般用来打印一些调试信息,级别最低')
    logger.info('info级别,一般用来打印一些正常的操作信息')
    logger.warning('waring级别,一般用来打印警告信息')
    logger.error('error级别,一般用来打印一些错误信息')
    logger.critical('critical级别,一般用来打印一些致命的错误信息,等级最高')

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

在控制台和文件中都有输出日志信息

3、代码封装

3.1封装代码

import logging


def test_log2():
    # 创建日志器
    logger = logging.getLogger()
    # 设置日志级别
    logger.setLevel(logging.INFO)
    # 设置格式  创建格式器
    formatter = logging.Formatter('%(asctime)s %(filename)s %(funcName)s %(levelname)s %(message)s')
    # 日志信息显示在控制台  
    if not logger.handlers:
        # 设置handler,这里设置一个控制台handler
        sh = logging.StreamHandler()
        # 给控制台加格式
        sh.setFormatter(formatter)
        # 日志信息放入控制台中
        logger.addHandler(sh)

        # 设置handler,这里设置一个文件handler
        fh = logging.FileHandler('log1.txt', encoding='utf-8')
        # 给文件handler加格式
        fh.setFormatter(formatter)
        # 把日志信息添加到文件中去
        logger.addHandler(fh)

    return logger
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

3.2调用

创建一个base.py文件导入上面封装好的test_log2()类,在需要日志的代码中加上 实例化类.info实例化类.error输出日志信息

import time
from class06.demo02 import test_log2
from selenium import webdriver

a = test_log2()
class BasePage:

    def __init__(self, driver):
        self.driver = driver

    def open(self, txt):
        try:
            # 记录正常的日志
            a.info(f'访问{txt}')
            self.driver.get(txt)
        except Exception as e:
            # 记录报错的日志
            a.error('没有访问到网址')

    def locaotr(self, name, value):
        return self.driver.find_element(name, value)

    def on_input(self, name, value, txt):
        try:
            a.info(f'通过{name}{value}输入{txt}')
            self.locaotr(name, value).send_keys(txt)
        except Exception as e:
            a.error('输入错误了%s' % e)

    def on_click(self, name, value):
        a.info(f'通过{name}{value}进行了点击')
        self.locaotr(name, value).click()

    def wait(self):
        time.sleep(3)

    def close(self):
        self.driver.quit()


if __name__ == '__main__':
    b = BasePage(webdriver.Chrome())
    b.open('http://www.baidu.com')
    b.on_input('id', 'kw', '测试')
    b.wait()
    b.on_click('id', 'su')
    b.wait()
    b.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

4、luckylog模块

luckylog可以直接使用无需封装;

安装:pip install luckylog

from selenium import webdriver
from luckylog.luckylog import *

log_conf.path = './test.log'  # 设置保存的日志路径
log_conf.module = ['success', 'error', 'tip', 'warning']  # 设置需要保存那些类型的日志
log_conf.error_file = './error.log'  # 设置装饰器错误信息保存路径
log_conf.detail = False


class BasePage:

    def __init__(self, driver):
        self.driver = driver

    @logger(passed='成功打开网址', fail='失败网址')
    def open(self, txt):
        self.driver.get(txt)

    def locaotr(self, name, value):
        return self.driver.find_element(name, value)

    @logger(passed='成功输入内容', fail='失败输入内容')
    def on_input(self, name, value, txt):
        self.locaotr(name, value).send_keys(txt)

    @logger(passed='成功点击', fail='失败点击')
    def on_click(self, name, value):
        self.locaotr(name, value).click()

    def wait(self):
        time.sleep(3)

    def close(self):
        self.driver.quit()


if __name__ == '__main__':
    b = BasePage(webdriver.Chrome())
    b.open('http://www.baidu.com')
    b.on_input('id', 'kw', '测试')
    b.wait()
    b.on_click('id', 'su')
    b.wait()
    b.close()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号