参考:https://blog.csdn.net/ying62506799/article/details/80785994
https://blog.csdn.net/WZ18810463869/article/details/81147167
日志级别:
从低到高依次是:
* DEBUG
* INFO
* NOTICE
* WARNING
* ERROR
* CRITICAL
* ALERT
* EMERGENCY
python中,logging由logger,handler,filter,formater四个部分组成,logger是提供我们记录日志的方法;handler是让我们选择日志的输出地方,如:控制台,文件,邮件发送等,一个logger添加多个handler;filter是给用户提供更加细粒度的控制日志的输出内容;formater用户格式化输出日志的信息。
配置日志的三种方式:链接https://ccyl.iteye.com/blog/1622453
1、在py程序中完成logger,handler,filter(可无),formater的配置,再使用logging取得logger进行日志操作
2、用配置文件的方式配置logging,使用fileConfig(filename,defaults=None,disable_existing_loggers=Ture )函数来读取配置文件。
3、使用一个字典方式来写配置信息,然后使用dictConfig(dict,defaults=None, disable_existing_loggers=Ture )函数来完成logging的配置
注:第三个参数默认值是True,当它为True的时候,在这之前定义的logging配置就是失效,不能再使用,也就是只有配置文件或者配置字典里有的内容才能使用。
vim logcleanpolicy.ini:
[loggers] #日志器
keys=root,rotatingFileLogger,TimedRotatingFileHandler
[logger_root] #定义logger的section必须指定level和handlers
level=DEBUG
handlers=consoleHandler
[logger_rotatingFileLogger] #对非root logger,qualname必选,表示在logger层级中的名字,在代码中通过它得到logger
level=DEBUG
handlers=consoleHandler,rotatingFileHandler
qualname=rotatingFileLogger
propagate=0
[logger_TimedRotatingFileHandler]
level=DEBUG
handlers=consoleHandler,TimedRotatingFileHandler
qualname=TimedRotatingFileHandler
propagate=0 #propagete=0,表示输出日志,但消息不传递;propagate=1是输出日志,同时消息往更高级别的地方传递 控制台会出现重复日志
[handlers] #处理器
keys=consoleHandler,rotatingFileHandler,TimedRotatingFileHandler
[handler_consoleHandler] #必须指定class和args,class:创建handler的类名,args:传给class所指定的handler类初始化方法参数
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)
[handler_rotatingFileHandler]
class=handlers.RotatingFileHandler
level=DEBUG
formatter=simpleFormatter
args=('/var/log/di/logcleanpolicy.log', 'a', 50*1024*1024, 10)
[handler_TimedRotatingFileHandler]
class=handlers.TimedRotatingFileHandler
level=DEBUG
formatter=simpleFormatter
args=('/var/log/di/logcleanpolicy.log', 'm', 1, 5)
[formatters] #格式器
keys=simpleFormatter
[formatter_simpleFormatter]
format = %(asctime)s %(levelname)-5.5s [%(filename)s:%(lineno)s][%(threadName)s] %(message)s
字段说明:
[loggers]
# 定义logger模块,root是父类,必需存在的,其它的是自定义。
# logging.getLogger(NAME)便相当于向logging模块注册了一种日志打印
# name 中用 . 表示 log 的继承关系
[logger_root]
# 实现上面定义的logger模块,必需是[logger_xxxx]这样的形式
# [logger_xxxx] logger_模块名称
# level 级别,级别有DEBUG、INFO、WARNING、ERROR、CRITICAL
# handlers 处理类,可以有多个,用逗号分开
# qualname logger名称,应用程序通过 logging.getLogger获取。对于不能获取的名称,则记录到root模块。
# propagate 是否继承父类的log信息,0:否 1:是
[handlers]
# 定义handler
[handler_infohandler]
# [handler_xxxx]
# class handler类名
# level 日志级别
# formatter,下面定义的formatter
# args handler初始化函数参数
[formatters]
# 定义格式化输出
[formatter_form01]
# 日志格式
#--------------------------------------------------
# %(asctime)s 年-月-日 时-分-秒,毫秒 2013-04-26 20:10:43,745
# %(filename)s 文件名,不含目录
# %(pathname)s 目录名,完整路径
# %(funcName)s 函数名
# %(levelname)s 级别名
# %(lineno)d 行号
# %(module)s 模块名
# %(message)s 消息体
# %(name)s 日志模块名
# %(process)d 进程id
# %(processName)s 进程名
# %(thread)d 线程id
# %(threadName)s 线程名
使用方式:
import logging
from logging.config import fileConfig
import os
log_file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'logcleanpolicy.conf') #不加这话会报错:KeyError: 'formatters'
print (log_file_path)
fileConfig(log_file_path)
# TimedRotatingFileHandler中的consoleHandler输出到控制台,TimedRotatingFileHandler输出日志到文件
logger= logging.getLogger(name="TimedRotatingFileHandler")
logger.error('error')
更改系统时间多次运行该脚本,看是否在指定目录生成5份文件