参考: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份文件