logging

作者: 一把猫粮 | 来源:发表于2018-08-24 20:40 被阅读0次

logging模块


日志

1 简介

  追踪某些软件运行时所发生事件的方法, 可以在代码中调用日志中某些方法来记录发生的事情

  • 一个事件可以用一个可包含可选变量数据的消息来描述
  • 事件有自己的重要性等级

2 作用

  通过对log的分析, 可以了解你想通过程序了解的事情

  • 系统或软件、应用的运行情况
  • 丰富的log还可以分析用户的操作行为、类型喜好、地域分布等其他信息
  • 在一个应用中对log进行多级区分,可以分析应用的健康状况,并可以快速定位问题,加以解决

3 日志等级

  等级区分可以让我们更好的‘避轻就重’,让我们在排查故障的时候免于淹没在日志的海洋里, 简单列举出所有的等级

  • DEBUG
  • INFO
  • NOTICE
  • WARNING
  • ERROR
  • CRITICAL
  • ALERT
  • EMERGENCY

4 日志字段信息和格式

  日志即记录, 需要知道

  • 时间
  • 位置
  • 严重级别
  • 内容
  • 其他

其中日志内容和级别需要明确指定, 其他字段信息只需要指出是否需要显示


logging

1 logging日志级别

  虽然可以自定义日志等级, 但是建议使用默认等级

  • DEBUG
      最详细日志信息, 多用于问题诊断

  • INFO
      仅次于DEBUG, 多用于记录关键点信息, 确保程序按预期执行

  • WARNING
      低等级故障, 但程序仍能运行, 如磁盘空间不足警告

  • ERROR
      由于比WARNING严重的问题, 导致某些功能不能正常运行时的记录

  • CRITICAL
      严重错误, 导致应用程序不能继续运行时的记录

  开发部署阶段, 使用DEBUG或INFO获取尽可能详尽的日志来进行开发;
  上线时应该使用WARNING或ERROR或CRITICAL级别日志来降低机器I/O压力, 提高获取日志信息的效率

DEBUG < INFO < WARNING < ERROR < CRITICAL

指定某级别后, 记录此级别以及更高级别的日志信息, 而不仅仅只记录指定级别


使用方式

1. 使用logging提供的模块级别函数
函数说明

a logging.五个级别(msg, *args, **kwargs)
创建这几个级别的日志记录
b logging.log(level, *args, **kwargs) 创建级别为level的日志记录
c logging.basicConfig(**kwargs)
进行一次性配置

其中basicConfig用于指定 日志级别 日志格式 日志输出位置 日志文件的打开模式;

2. 使用logging日志系统四大组件

a loggers
  提供应用程序代码直接使用的接口
b handlers
  用于将日志记录发送到指定的目的位置
c filters
  过滤, 决定哪些输出哪些日志记录, 其余忽略
d formatters
  控制日志输出格式

logging模块级别实际上是使用这四大组件加上一些基础配置实现的

模块级别函数使用

尝试使用:
In [1]: import logging

In [2]: logging.debug('debug')

In [3]: logging.info('info')

In [4]: logging.warning('warning')
WARNING:root:warning

In [5]: logging.error('error')
ERROR:root:error

In [6]: logging.critical('critical')
CRITICAL:root:critical

  发现当级别达到WARNING后才会输出, 正如我们前面所说, 模块级别是四大组件的小扩展, 这个扩展就配置了日志级别是WARNING, 所以小于这个级别的debug和info就会被忽略

WARNING:root:warning
日志级别:日志器名称:日志内容
这也是小扩展里的BASIC_FORMAT的值设置为了
%(levelname)s:%(name)s:%(message)s

以上这些可以通过修改logging.basicConfig(**kwargs)函数的参数

  • filename 输出目标文件文件名, 指定后不会输出到控制台
  • filemode 指定日志文件打开模式, 默认为'a', 添加模式, 且在filename指定后才生效
  • format 格式
  • datefmt 日期格式, format中包含时间字段(%(asctime)s)时生效
  • level 日志级别

format:

  • %(asctime)s 人类可读时间
  • %(created)f 时间戳, 等同于time.time()
  • %(relativeCreated)d 日志发生的时间相对于logging模块加载时间的相对毫秒数
  • %(msecs)d 日志时间发生的毫秒部分
  • %(levelname)s 日志级别str格式
  • %(levelno)s 日志级别数字形式(10, 20, 30, 40, 50)
  • %(name)s 日志器名称, 默认root
  • %(message)s 日志内容
  • %(pathname)s 日志全路径
  • %(filename)s 文件名含后缀
  • %(module)s 文件名不含后缀
  • %(lineno)d 调用日志记录函数源代码的行号
  • %(funcName)s 调用日志记录函数的函数名
  • %(process)d 进程id
  • %(processName)s 进程名称
  • %(thread)d 线程ID
  • %(threadName)s 线程名称
import logging

# 日志格式

LOG_FORMAT="%(lineno)d - %(asctime)s - %(levelno)s - %(levelname)s - %(name)s - %(message)s - %(process)d - %(thread)d - %(module)s - %(funcName)s"

# 日期格式

DATE

logging.basicConfig(filename='my.log', level=logging.DEBUG, format=LOG_FORMAT)

logging.debug('debug log')
logging.warning('warning log')


# my.log

12 - 08/24/2018 19:42:24 PM - 10 - DEBUG - root - debug log - 13144 - 4464 - test - <module>
13 - 08/24/2018 19:42:24 PM - 30 - WARNING - root - warning log - 13144 - 4464 - test - <module>

可以修改每个占位格式的占位宽度:%(lineno)-10d, 占10个宽度; 其他修改类似

  1. logging.basicConfig()只在第一次调用时起作用, 后续再调用无效
  2. 如果需要日志中包含变量, 可将格式字符串作为第一个参数msg的传入, 变量数据作为第二个参数*args的传入, 如logging.warning('%s - %d', 'book', 10)
  3. 对于**kwargs, 支持三个关键字
    exc_info: 布尔类型, 默认False, 为True则将异常信息添加到日志, 没有异常添加None
    stack_info: 布尔类型, 默认False, 如为True, 栈信息将会被添加到日志
    extra: 字典参数, 可自定义消息格式所包含字段, 但键不能与logging模块定义字段冲突
import logging

FORMAT = '%(asctime)-15s %(clientip)s %(user)-8s %(message)s'

logging.basicConfig(format=FORMAT)

d = {'clientip': '192.168.0.1', 'user': 'fbloggs'}

logging.warning('Protocol problem: %s', 'connection reset', extra=d)
logging.error('error log', exc_info=True, stack_info=True, extra=d)

# my.log

2018-08-24 20:03:00,927 192.168.0.1 fbloggs  Protocol problem: connection reset
2018-08-24 20:03:00,928 192.168.0.1 fbloggs  error log
NoneType: None
Stack (most recent call last):
  File "E:\1coding\temp\test\test.py", line 10, in <module>
    logging.error('error log', exc_info=True, stack_info=True, extra=d)

给FORMAT添加了自定义字段, 就要在每个logging里都加上该字段对应的关键字参数, 否则报错


日志模块四大组件

  1. 日志器 Logger : 提供应用程序使用接口
  2. 处理器 Handler: 创建日志记录, 发送到合适目的地
  3. 过滤器 Filter: 对日志进行过滤存储
  4. 格式器 Formatter: 决定日志输出格式

logging模块就是通过这些组件处理日志

日志器(logger)可以通过一个或多个处理器(handler)将一条日志信息输出到不同的目标位置
并且每个处理器(handler)都可以设置自己的过滤器(fileter)和格式器(formatter)来决定日志输出内容

  • Logger类

作用:

a. 设置日志等级
b. 提供写日志接口
c. 添加或移除处理器
d. 添加或移除过滤器

a> 设置等级:
Logger.setLevel(logging.级别) - `Logger.setLevel(logging.ERROR)

b> 接口
Logger.级别() - Logger.debug()

未完待续...

相关文章

网友评论

      本文标题:logging

      本文链接:https://www.haomeiwen.com/subject/rbluiftx.html