配置文件写入logging日志

参考:https://blog.csdn.net/ying62506799/article/details/80785994

           https://blog.csdn.net/WZ18810463869/article/details/81147167

日志级别:

从低到高依次是:

  1. * DEBUG
  2. * INFO
  3. * NOTICE
  4. * WARNING
  5. * ERROR
  6. * CRITICAL
  7. * ALERT
  8. * EMERGENCY

python中,logging由logger,handler,filter,formater四个部分组成logger是提供我们记录日志的方法;handler是让我们选择日志的输出地方,如:控制台,文件,邮件发送等,一个logger添加多个handler;filter是给用户提供更加细粒度的控制日志的输出内容;formater用户格式化输出日志的信息

 

配置日志的三种方式:链接https://ccyl.iteye.com/blog/1622453

  1. 1、在py程序中完成logger,handler,filter(可无),formater的配置,再使用logging取得logger进行日志操作
  2. 2、用配置文件的方式配置logging,使用fileConfig(filename,defaults=None,disable_existing_loggers=Ture )函数来读取配置文件。
  3. 3、使用一个字典方式来写配置信息,然后使用dictConfig(dict,defaults=None, disable_existing_loggers=Ture )函数来完成logging的配置
  4. 注:第三个参数默认值是True,当它为True的时候,在这之前定义的logging配置就是失效,不能再使用,也就是只有配置文件或者配置字典里有的内容才能使用。

vim logcleanpolicy.ini:

  1. [loggers] #日志器
  2. keys=root,rotatingFileLogger,TimedRotatingFileHandler
  3. [logger_root] #定义logger的section必须指定level和handlers
  4. level=DEBUG
  5. handlers=consoleHandler
  6. [logger_rotatingFileLogger] #对非root logger,qualname必选,表示在logger层级中的名字,在代码中通过它得到logger
  7. level=DEBUG
  8. handlers=consoleHandler,rotatingFileHandler
  9. qualname=rotatingFileLogger
  10. propagate=0
  11. [logger_TimedRotatingFileHandler]
  12. level=DEBUG
  13. handlers=consoleHandler,TimedRotatingFileHandler
  14. qualname=TimedRotatingFileHandler
  15. propagate=0 #propagete=0,表示输出日志,但消息不传递;propagate=1是输出日志,同时消息往更高级别的地方传递 控制台会出现重复日志
  16. [handlers] #处理器
  17. keys=consoleHandler,rotatingFileHandler,TimedRotatingFileHandler
  18. [handler_consoleHandler] #必须指定class和args,class:创建handler的类名,args:传给class所指定的handler类初始化方法参数
  19. class=StreamHandler
  20. level=DEBUG
  21. formatter=simpleFormatter
  22. args=(sys.stdout,)
  23. [handler_rotatingFileHandler]
  24. class=handlers.RotatingFileHandler
  25. level=DEBUG
  26. formatter=simpleFormatter
  27. args=('/var/log/di/logcleanpolicy.log', 'a', 50*1024*1024, 10)
  28. [handler_TimedRotatingFileHandler]
  29. class=handlers.TimedRotatingFileHandler
  30. level=DEBUG
  31. formatter=simpleFormatter
  32. args=('/var/log/di/logcleanpolicy.log', 'm', 1, 5)
  33. [formatters] #格式器
  34. keys=simpleFormatter
  35. [formatter_simpleFormatter]
  36. format = %(asctime)s %(levelname)-5.5s [%(filename)s:%(lineno)s][%(threadName)s] %(message)s

字段说明:

  1. [loggers]
  2. # 定义logger模块,root是父类,必需存在的,其它的是自定义。
  3. # logging.getLogger(NAME)便相当于向logging模块注册了一种日志打印
  4. # name 中用 . 表示 log 的继承关系
  5. [logger_root]
  6. # 实现上面定义的logger模块,必需是[logger_xxxx]这样的形式
  7. # [logger_xxxx] logger_模块名称
  8. # level 级别,级别有DEBUG、INFO、WARNING、ERROR、CRITICAL
  9. # handlers 处理类,可以有多个,用逗号分开
  10. # qualname logger名称,应用程序通过 logging.getLogger获取。对于不能获取的名称,则记录到root模块。
  11. # propagate 是否继承父类的log信息,0:否 1:是
  12. [handlers]
  13. # 定义handler
  14. [handler_infohandler]
  15. # [handler_xxxx]
  16. # class handler类名
  17. # level 日志级别
  18. # formatter,下面定义的formatter
  19. # args handler初始化函数参数
  20. [formatters]
  21. # 定义格式化输出
  22. [formatter_form01]
  23. # 日志格式
  24. #--------------------------------------------------
  25. # %(asctime)s       年-月-日 时-分-秒,毫秒 2013-04-26 20:10:43,745
  26. # %(filename)s      文件名,不含目录
  27. # %(pathname)s      目录名,完整路径
  28. # %(funcName)s      函数名
  29. # %(levelname)s     级别名
  30. # %(lineno)d        行号
  31. # %(module)s        模块名
  32. # %(message)s       消息体
  33. # %(name)s          日志模块名
  34. # %(process)d       进程id
  35. # %(processName)s   进程名
  36. # %(thread)d        线程id
  37. # %(threadName)s    线程名

使用方式:

  1. import logging
  2. from logging.config import fileConfig
  3. import os
  4. log_file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'logcleanpolicy.conf')  #不加这话会报错:KeyError: 'formatters'
  5. print (log_file_path)
  6. fileConfig(log_file_path)
  7. # TimedRotatingFileHandler中的consoleHandler输出到控制台,TimedRotatingFileHandler输出日志到文件
  8. logger= logging.getLogger(name="TimedRotatingFileHandler")
  9. logger.error('error')

更改系统时间多次运行该脚本,看是否在指定目录生成5份文件