[关闭]
@nemos 2017-05-05T15:16:21.000000Z 字数 3807 阅读 797

logging

py


基本用法

  1. import logging
  2. import sys
  3. # 获取logger实例,如果参数为空则返回root logger
  4. logger = logging.getLogger("AppName")
  5. # 指定logger输出格式
  6. formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s')
  7. # 文件日志
  8. file_handler = logging.FileHandler("test.log")
  9. file_handler.setFormatter(formatter) # 可以通过setFormatter指定输出格式
  10. # 控制台日志
  11. console_handler = logging.StreamHandler(sys.stdout)
  12. console_handler.formatter = formatter # 也可以直接给formatter赋值
  13. # 为logger添加的日志处理器
  14. logger.addHandler(file_handler)
  15. logger.addHandler(console_handler)
  16. # 指定日志的最低输出级别,默认为WARN级别
  17. logger.setLevel(logging.INFO)
  18. # 输出不同级别的log
  19. logger.debug('this is debug info')
  20. logger.info('this is information')
  21. logger.warn('this is warning message')
  22. logger.error('this is error message')
  23. logger.fatal('this is fatal message, it is same as logger.critical')
  24. logger.critical('this is critical message')
  25. # 2016-10-08 21:59:19,493 INFO : this is information
  26. # 2016-10-08 21:59:19,493 WARNING : this is warning message
  27. # 2016-10-08 21:59:19,493 ERROR : this is error message
  28. # 2016-10-08 21:59:19,493 CRITICAL: this is fatal message, it is same as logger.critical
  29. # 2016-10-08 21:59:19,493 CRITICAL: this is critical message
  30. # 异常捕获
  31. try:
  32. 1 / 0
  33. except:
  34. # 等同于error级别,但是会额外记录当前抛出的异常堆栈信息
  35. logger.exception('this is an exception message')
  36. # 2016-10-08 21:59:19,493 ERROR : this is an exception message
  37. # Traceback (most recent call last):
  38. # File "D:/Git/py_labs/demo/use_logging.py", line 45, in
  39. # 1 / 0
  40. # ZeroDivisionError: integer division or modulo by zero

组成

logging_flow

Logger

输出日志的对象,为单例

  1. logger = logging.getLogger('name') # 获得实例
  2. logger.setLevel(logging.INFO)#指定最低的日志级别
  3. logger.addFilter()
  4. logger.removeFilter()
  5. logger.addHandler()
  6. logger.removeHandler()
  7. logger.debug()
  8. logger.info()
  9. logger.warning()
  10. logger.error()
  11. logger.critical()
  12. logger.log('debug', 'This is a bug') # 数直接输出内容并选择对应的告警级别

Handlers

对log进行分发

  1. handler = logging.FileHandler("test.log")
  2. handler.setLevel()
  3. handler.setFormatter()
  4. handler.addFilter()
  5. handler.removeFilter()
类型 说明
logging.StreamHandler([stream]) 参数默认是sys.stderr,向任意流中输出log
logging.FileHandler(filename[,mode]) mode为打开方式。默认为a,向一个文件输出日志。
logging.handlers.RotatingFileHandler(filename[, mode[, maxBytes[, backupCount]]]) 可以管理文件大小,文件大小超过一定值,新建文件继续
logging.handlers.TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]]) 间隔时间自动创建新文件
logging.handlers.SocketHandler(host, port) TCP
logging.handlers.DatagramHandler(host, port) UDP
logging.handlers.SysLogHandler
logging.handlers.NTEventLogHandler
logging.handlers.SMTPHandler
logging.handlers.MemoryHandler
logging.handlers.HTTPHandler

Formatters

输出格式

  1. formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s')
参数 说明
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s 用户输出的消息

Filter

在handler之上提供粒度判断

配置

  1. logging.basicConfig(level=logging.INFO,
  2. format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
  3. datefmt='[%Y-%m_%d %H:%M:%S]',
  4. filename='../log/my.log',
  5. filemode='a')
  1. logging.config.fileConfig(log_conf_file)
  1. ##############################################
  2. [loggers]
  3. keys=root, log02
  4. [logger_root]
  5. level=INFO
  6. handlers=handler01
  7. [logger_log02]
  8. level=DEBUG
  9. handler=handler02
  10. qualname=log02
  11. ##############################################
  12. [handlers]
  13. keys=handler01,handler02
  14. [handler_handler01]
  15. class=FileHandler
  16. level=INFO
  17. formatter=form01
  18. args=('../log/cv_parser_gm_server.log',"a")
  19. [handler_handler02]
  20. class=StreamHandler
  21. level=NOTSET
  22. formatter=form01
  23. args=(sys.stdout,)
  24. ##############################################
  25. [formatters]
  26. keys=form01,form02
  27. [formatter_form01]
  28. format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(process)d %(message)s
  29. datefmt=[%Y-%m-%d %H:%M:%S]
  30. [formatter_form02]
  31. format=(message)s
  32. ##############################################

多进程解决

解决方案

参考

Python中的logging模块


添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注