logging

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()

未完待续...

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • From:Python之日志处理(logging模块) - 云游道士 - 博客园 https://www.cnbl...
    vigny的先生阅读 2,671评论 3 5
  • 在现实生活中,记录日志非常重要。银行转账时会有转账记录;飞机飞行过程中,会有黑盒子(飞行数据记录器)记录飞行过程中...
    chliar阅读 754评论 1 0
  • 本文地址:https://www.jianshu.com/p/3be28b5d2ff8 1. 简介 在应用的开发过...
    王南北丶阅读 5,942评论 0 20
  • 今晚我们出去玩了,儿子自己在家。我手机没电了,我说不拿手机了在家充电吧,但是我要换密码,我怕孩子控制不住自己会...
    有凤来仪的简书阅读 121评论 0 1
  • 余七年漫无目的。 游游荡荡却到了一座凉亭附近。 溪水汇聚于此,一片怡人宁静的湖泊因此得来。凉亭架在湖面上,有石柱立...
    及扬寒风阅读 251评论 0 1