logging 模块 - 图1


一 日志级别

  1. CRITICAL = 50 #FATAL = CRITICAL
  2. ERROR = 40
  3. WARNING = 30 #WARN = WARNING
  4. INFO = 20
  5. DEBUG = 10
  6. NOTSET = 0 #不设置

二 默认级别为warning,默认打印到终端

  1. import logging
  2. logging.debug('调试debug')
  3. logging.info('消息info')
  4. logging.warning('警告warn')
  5. logging.error('错误error')
  6. logging.critical('严重critical')
  7. '''
  8. WARNING:root:警告warn
  9. ERROR:root:错误error
  10. CRITICAL:root:严重critical
  11. '''

三 为logging模块指定全局配置,针对所有logger有效,控制打印到文件中

  1. # 可在logging.basicConfig()函数中通过具体参数来更改logging模块默认行为,可用参数有
  2. # filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。
  3. # filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
  4. # format:指定handler使用的日志显示格式。
  5. # datefmt:指定日期时间格式。
  6. # level:设置rootlogger(后边会讲解具体概念)的日志级别
  7. # stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。

logging.basicConfig()

  1. import logging
  2. logging.basicConfig(filename='access.log',
  3. format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
  4. datefmt='%Y-%m-%d %H:%M:%S %p',
  5. level=10)
  6. logging.debug('调试debug')
  7. logging.info('消息info')
  8. logging.warning('警告warn')
  9. logging.error('错误error')
  10. logging.critical('严重critical')

format参数中可能用到的格式化串:

  1. %(name)sLogger的名字,并非用户名,详细查看
  2. %(levelno)s:数字形式的日志级别
  3. %(levelname)s:文本形式的日志级别
  4. %(pathname)s:调用日志输出函数的模块的完整路径名,可能没有
  5. %(filename)s:调用日志输出函数的模块的文件名
  6. %(module)s:调用日志输出函数的模块名
  7. %(funcName)s:调用日志输出函数的函数名
  8. %(lineno)d:调用日志输出函数的语句所在的代码行
  9. %(created)f:当前时间,用UNIX标准的表示时间的浮 点数表示
  10. %(relativeCreated)d:输出日志信息时的,自Logger创建以 来的毫秒数
  11. %(asctime)s:字符串形式的当前时间。默认格式是 2003-07-08 16:49:45,896”。逗号后面的是毫秒
  12. %(thread)d:线程ID。可能没有
  13. %(threadName)s:线程名。可能没有
  14. %(process)d:进程ID。可能没有
  15. %(message)s:用户输出的消息

%(name)s:Logger的名字,并非用户名,详细查看

  1. import logging
  2. logging.basicConfig(
  3. format='%(name)s',
  4. level=10)
  5. logging.debug('调试debug')
  6. # root

%(levelno)s:数字形式的日志级别

  1. import logging
  2. logging.basicConfig(
  3. format='%(levelno)s',
  4. level=10)
  5. logging.debug('调试debug')
  6. # 10

%(levelname)s:文本形式的日志级别

  1. import logging
  2. logging.basicConfig(
  3. format='%(levelname)s',
  4. level=10)
  5. logging.debug('调试debug')
  6. # DEBUG

%(pathname)s:调用日志输出函数的模块的完整路径名,可能没有

  1. import logging
  2. logging.basicConfig(
  3. format='%(pathname)s',
  4. level=10)
  5. logging.debug('调试debug')
  6. # F:/学习课件/python/pycharm/测试.py

%(filename)s:调用日志输出函数的模块的文件名

  1. import logging
  2. logging.basicConfig(
  3. format='%(filename)s',
  4. level=10)
  5. logging.debug('调试debug')
  6. # 测试.py

%(module)s:调用日志输出函数的模块名

  1. import logging
  2. logging.basicConfig(
  3. format='%(module)s',
  4. level=10)
  5. logging.debug('调试debug')
  6. # 测试

%(funcName)s:调用日志输出函数的函数名

  1. import logging
  2. logging.basicConfig(
  3. format='%(funcName)s',
  4. level=10)
  5. logging.debug('调试debug')
  6. # <module>

%(lineno)d:调用日志输出函数的语句所在的代码行

  1. import logging
  2. logging.basicConfig(
  3. format='%(lineno)d',
  4. level=10)
  5. logging.debug('调试debug')
  6. # 7

%(created)f:当前时间,用UNIX标准的表示时间的浮 点数表示`

  1. import logging
  2. logging.basicConfig(
  3. format='%(created)f',
  4. level=10)
  5. logging.debug('调试debug')
  6. # 1607770646.867305

%(relativeCreated)d:输出日志信息时的,自Logger创建以 来的毫秒数

  1. import logging
  2. import time
  3. logging.basicConfig(
  4. format='%(relativeCreated)d',
  5. level=10)
  6. time.sleep(2)
  7. logging.debug('调试debug') # 2002
  8. time.sleep(2)
  9. logging.debug('调试debug') # 4003

%(asctime)s:字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒

  1. import logging
  2. logging.basicConfig(
  3. format='%(asctime)s',
  4. level=10)
  5. logging.debug('调试debug')
  6. # 2020-12-12 19:01:19,503

%(thread)d:线程ID。可能没有

  1. import logging
  2. logging.basicConfig(
  3. format='%(thread)d',
  4. level=10)
  5. logging.debug('调试debug')
  6. # 12592

%(threadName)s:线程名。可能没有

  1. import logging
  2. logging.basicConfig(
  3. format='%(threadName)s',
  4. level=10)
  5. logging.debug('调试debug')
  6. # MainThread

%(process)d:进程ID。可能没有

  1. import logging
  2. logging.basicConfig(
  3. format='%(process)d',
  4. level=10)
  5. logging.debug('调试debug')
  6. # 2984

%(message)s:用户输出的消息

  1. import logging
  2. logging.basicConfig(
  3. format='%(message)s',
  4. level=10)
  5. logging.debug('调试debug')
  6. # 调试debug

四 logging模块的Formatter,Handler,Logger,Filter对象

  1. # logger:产生日志的对象
  2. # Filter:过滤日志的对象
  3. # Handler:接收日志然后控制打印到不同的地方,FileHandler用来打印到文件中,StreamHandler用来打印到终端
  4. # Formatter对象:可以定制不同的日志格式对象,然后绑定给不同的Handler对象使用,以此来控制不同的Handler的日志格式
  1. '''
  2. critical=50
  3. error =40
  4. warning =30
  5. info = 20
  6. debug =10
  7. '''
  8. import logging
  9. #1、logger对象:负责产生日志,然后交给Filter过滤,然后交给不同的Handler输出
  10. logger=logging.getLogger(__file__)
  11. #2、Filter对象:不常用,略
  12. #3、Handler对象:接收logger传来的日志,然后控制输出
  13. h1=logging.FileHandler('t1.log') #打印到文件
  14. h2=logging.FileHandler('t2.log') #打印到文件
  15. h3=logging.StreamHandler() #打印到终端
  16. #4、Formatter对象:日志格式
  17. formmater1=logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
  18. datefmt='%Y-%m-%d %H:%M:%S %p',)
  19. formmater2=logging.Formatter('%(asctime)s : %(message)s',
  20. datefmt='%Y-%m-%d %H:%M:%S %p',)
  21. formmater3=logging.Formatter('%(name)s %(message)s',)
  22. #5、为Handler对象绑定格式
  23. h1.setFormatter(formmater1)
  24. h2.setFormatter(formmater2)
  25. h3.setFormatter(formmater3)
  26. #6、将Handler添加给logger并设置日志级别
  27. logger.addHandler(h1)
  28. logger.addHandler(h2)
  29. logger.addHandler(h3)
  30. logger.setLevel(10)
  31. #7、测试
  32. logger.debug('debug')
  33. logger.info('info')
  34. logger.warning('warning')
  35. logger.error('error')
  36. logger.critical('critical')

五 配置文件

程序文件

  1. """
  2. settings.py
  3. logging配置
  4. """
  5. import os
  6. import logging.config
  7. # 定义三种日志输出格式 开始
  8. standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d][%(levelname)s][%(message)s]' #其中name为getlogger指定的名字
  9. simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
  10. id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
  11. # 定义日志输出格式 结束
  12. logfile_dir = os.path.dirname(os.path.abspath(__file__)) # log文件的目录
  13. logfile_name = 'all2.log' # log文件名
  14. # 如果不存在定义的日志目录就创建一个
  15. if not os.path.isdir(logfile_dir):
  16. os.mkdir(logfile_dir)
  17. # log文件的全路径
  18. logfile_path = os.path.join(logfile_dir, logfile_name)
  19. # log配置字典
  20. LOGGING_DIC = {
  21. 'version': 1,
  22. 'disable_existing_loggers': False,
  23. 'formatters': {
  24. 'standard': {
  25. 'format': standard_format
  26. },
  27. 'simple': {
  28. 'format': simple_format
  29. },
  30. },
  31. 'filters': {},
  32. 'handlers': {
  33. #打印到终端的日志
  34. 'console': {
  35. 'level': 'DEBUG',
  36. 'class': 'logging.StreamHandler', # 打印到屏幕
  37. 'formatter': 'simple'
  38. },
  39. #打印到文件的日志,收集info及以上的日志
  40. 'default': {
  41. 'level': 'DEBUG',
  42. 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
  43. 'formatter': 'standard',
  44. 'filename': logfile_path, # 日志文件
  45. 'maxBytes': 1024*1024*5, # 日志大小 5M
  46. 'backupCount': 5,
  47. 'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
  48. },
  49. },
  50. 'loggers': {
  51. #logging.getLogger(__name__)拿到的logger配置
  52. '': {
  53. 'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
  54. 'level': 'DEBUG',
  55. 'propagate': True, # 向上(更高level的logger)传递
  56. },
  57. },
  58. }
  59. def load_my_logging_cfg():
  60. logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的logging配置
  61. logger = logging.getLogger(__name__) # 生成一个log实例
  62. logger.info('It works!') # 记录该文件的运行状态
  63. if __name__ == '__main__':
  64. load_my_logging_cfg()

调用程序

  1. '''
  2. common.py
  3. '''
  4. import settings
  5. # !!!强调!!!
  6. # 1、logging是一个包,需要使用其下的config、getLogger,可以如下导入
  7. # from logging import config
  8. # from logging import getLogger
  9. # 2、也可以使用如下导入
  10. import logging.config # 这样连同logging.getLogger都一起导入了,然后使用前缀logging.config.
  11. # 3、加载配置
  12. logging.config.dictConfig(settings.LOGGING_DIC)
  13. # 4、输出日志
  14. logger1=logging.getLogger('用户交易')
  15. logger1.info('xiaowo转入666')
  16. # logger2=logging.getLogger('专门的采集') # 名字传入的必须是'专门的采集',与LOGGING_DIC中的配置唯一对应
  17. # logger2.debug('专门采集的日志')

logging 配置文件格式

  1. # 日志级别与配置
  2. import logging
  3. # 一:日志配置
  4. logging.basicConfig(
  5. # 1、日志输出位置:1、终端 2、文件
  6. # filename='access.log', # 不指定,默认打印到终端
  7. # 2、日志格式
  8. format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
  9. # 3、时间格式
  10. datefmt='%Y-%m-%d %H:%M:%S %p',
  11. # 4、日志级别
  12. # critical => 50
  13. # error => 40
  14. # warning => 30
  15. # info => 20
  16. # debug => 10
  17. level=30,
  18. )
  19. # 二:输出日志
  20. logging.debug('调试debug')
  21. logging.info('消息info')
  22. logging.warning('警告warn')
  23. logging.error('错误error')
  24. logging.critical('严重critical')