I.日志级别
低到高分别为:
(1)DEBUG:输出详细的运行情况,主要用于调试---》debug()
(2)INFO:确认一切按预期运行,一般用于输出重要运行情况---》info()
(3)WARNING:一些意想不到的事情发生了(比如:警告),但是这个软件还能按预期工作 ---》warning()
(4)ERROR:发生了错误,软件没能执行一些功能,还可以继续执行 ---》error()
(5)CRITICAL:一个严重的错误,表名程序本身可能无法继续运行 ---》ctritical()
注意:logging模块默认收集的日志:warning以上等级
II.日志原理
py文件中记录日志 ---收集日志---》日志收集器---输出日志---》控制台/文件
III.写日志过程
(1)创建一个收集器,名称自定义: logger = logging.getLogger('name')
(2)设置日志收集器的等级: logger.setLevel(LEVEL)
(3)输出到日志
- 创建一个输出渠道
-
输出到日志文件
-
输出到日志文件
fh = logging.FileHandler(LOG_PATH ,encoding='utf-8') # 输出模式默认a(追加)
-
- 输出到控制台
- 输出到控制台
sh = logging.StreamHandler()
- 设置输出级别:fh.setLevel(FHLEVEL) 或 sh.setLevel(SHLEVEL)
(4)设置输出格式
formatter = logging.Formatter('%(asctime)s - [%(filename)s-->line:%(lineno)d] - %(levelname)s: %(message)s') # 时间-文件名-行号-日志级别-输出信息
详细说明:
%(name)s | 收集器名称 |
---|---|
%(levelno)s | 打印日志级别的数值【数字形式】 |
%(levelname)s | 打印日志级别名称【文本形式】 |
%(pathname)s | 打印当前执行程序的路径,其实就是sys.argv[0] |
%(filename)s | 打印当前执行程序名 |
%(module)s | 打印当前模块名 |
%(lineno)d | 打印日志输出函数的语句所在的代码行 |
%(funcName)s | 打印日志当前函数名 |
%(thread)d | 打印线程ID |
%(threadName)s | 打印线程名称 |
%(process)d | 打印进程ID |
%(message)s | 打印日志信息 |
%(name)s | Logger的名字 |
%(created)f | 当前时间,用unix标准表示时间的浮点数表示 |
%(relativeCreated)d | 输出日志信息时,自Logger创建的毫秒数 |
%(asctime)s | 字符串形式的当前时间,默认格式为"年-月-日 时:分:秒,毫秒" |
(5)收集器对接输出渠道,并格式化
#输出到日志文件 logger.addHandler(fh) fh.setFormatter(formatter) #输出到控制台 logger.addHandler(sh) sh.setFormatter(formatter)
(6)收集日志
if level == 'DEBUG': logger.debug(msg) elif level == 'ERROR': logger.error(msg) elif level == 'INFO': logger.info(msg) elif level == 'WARNING': logger.warning(msg) elif level == 'CRITICAL': logger.critical(msg)
(7)关闭日志渠道
logger.removeHandler(fh) logger.removeHandler(sh)
日志文件完整代码
import os import time import logging from logging.handlers import TimedRotatingFileHandler,RotatingFileHandler # 日志轮转 from com.contants import LOG_DIR # 日志文件路径 from com.myconf import conf # 配置文件对象 log_path = os.path.join(LOG_DIR,'log' + time.strftime('%Y-%m-%d') +'.log') # 输出日志文件名称 class MyLogger(object): @staticmethod def get_log(): # 1. 定义一个日志收集器,默认名称为root logger = logging.getLogger() # 2. 设置日志收集器的等级 logger.setLevel(conf.get('logging', 'level')) # 3. 输出到日志 # (1) 创建一个输出到日志文件的输出渠道 fh = logging.FileHandler(log_path ,encoding='utf-8') """ # 按文件大小进行轮转,保留最新的日志信息 fh = RotatingFileHandler(filename= 'test.logs', maxBytes =1024*1024, # 设置文件大小:字节--1MB = 1024*1024byte backupCount= 3 ) # 轮转的文件数量 # 按时间进行轮转 fh = TimedRotatingFileHandler(filename='test.logs', encoding='utf8', when='D', # D:表示天 interval = 1, # 时间间隔 backupCount=30) # 轮转的文件数量 """ # (2) 设置输出级别 fh.setLevel(conf.get('logging', 'fhlevel')) # 4. 输出到控制台 # (1) 创建一个输出到控制台的输出渠道 sh = logging.StreamHandler() # (2) 设置输出级别 sh.setLevel(conf.get('logging', 'shlevel')) # 5. 设置输出格式 formatter = logging.Formatter('%(asctime)s - [%(filename)s-->line:%(lineno)d] - %(levelname)s: %(message)s') # 6. 收集器对接输出渠道,并格式化 logger.addHandler(fh) fh.setFormatter(formatter) logger.addHandler(sh) sh.setFormatter(formatter) return logger # 调用类的静态方法,创建一个日志收集器 my_log = MyLogger.get_log()