Python: Logging 模块使用简介

python struggling 939次浏览 0个评论
文章目录

logging

本文介绍 logging 模块的功能,使用方法以及在实际环境中如何使用

logging 模块是 python 的一个内置模块,logging 的主要功能在于可以在各个模块之间共用,并且提供了不同的日志级别,各模块将日志发送到同一文件或其他地方,最常见的情形是把信息记录在 log 文件里。

1. logging 的日志级别

```python

In [6]: import logging

In [7]: logging.NOTSET
Out[7]: 0

In [8]: logging.DEBUG
Out[8]: 10

In [9]: logging.INFO
Out[9]: 20

In [10]: logging.WARN
Out[10]: 30

In [11]: logging.ERROR
Out[11]: 40

In [12]: logging.CRITICAL
Out[12]: 50

In [13]: logging._levelNames
Out[13]: 
{0: 'NOTSET',
 10: 'DEBUG',
 20: 'INFO',
 30: 'WARNING',
 40: 'ERROR',
 50: 'CRITICAL',
 'CRITICAL': 50,
 'DEBUG': 10,
 'ERROR': 40,
 'INFO': 20,
 'NOTSET': 0,
 'WARN': 30,
 'WARNING': 30}
```

logging 模块共有 6 个 level,如下所示:

Level Value Usage
CRITICAL 50 严重错误,表明程序已不能继续运行了
ERROR 40 严重的问题,程序已不能执行一些功能了
WARNING 30 将来可能会发生问题,但可以运行
INFO 20 证明程序按预期的工作
DEBUG 10 用于调试时使用
NOTSET 0 可存放程序输出的全部信息

示例:



#!/usr/bin/env python
# coding:utf-8

import logging

# 设置使用的日志文件,日志级别,文件读写模式
logging.basicConfig(filename='example.log',level=logging.DEBUG,filemode='w')
logging.debug('This is debug level')
logging.info('This is info level')
logging.warning('This is warning level')
logging.error('This is error level')
logging.critical('This is critical level')

查看日志

# cat example.log 
DEBUG:root:This is debug level
INFO:root:This is info level
WARNING:root:This is warning level
ERROR:root:This is error level
CRITICAL:root:This is critical level

注意:logging 模块的日志输出级别默认是 warning 级别,所以小于默认级别的统统不会写入到文件。root 表示 log 级别的根节点。

2. 自定义 Log 的输出格式

通过format参数,可以定制写入log文件的格式。



import logging
logging.basicConfig(format='%(levelname)s:%(message)s',level=logging.DEBUG)

或者更详细的使用以下方法,这也是我常使用的方法:

logging.basicConfig(
        level=logging.DEBUG,
        format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S',
        filename=os.path.join(LOG_PATH, 'example.log'),
        filemode='a'
    )

输出格式如下所示:

2016-07-25 23:43:23 log.py[line:23] DEBUG This is debug level

3. 从多个不同的模块中记录日志

logging 模块提供了一些更强大的组件用于在多个不同模块中记录日志,loggers, handlers, filtersformatters

  • Logger 记录器,暴露了应用程序代码能直接使用的接口。
  • Handler 处理器,将(记录器产生的)日志记录发送至合适的目的地。
  • Filter 过滤器,提供了更好的粒度控制,它可以决定输出哪些日志记录。
  • Formatter 格式化器,指明了最终输出中日志记录的布局。

日志记录是通过调用 logger 对象的方法来执行的,每一个模块都需要创建一个 logger 对象。为了便于区分每个模块的日志,一个非常好的命名风格是使用模块名,在每一个使用 logger 的模块中,这样来命名:


logger = logging.getLogger(__file__)

这意味着 logger 的名称可以被跟踪为 包/模块 的级别,而且可以直观地观察到是哪一个模块输出了该事件。

利用上面的组件可以把日志同时输出到 terminallog.txt 文件里。


import logging

# 如果没有指定, 将使用 root
logger = logging.getLogger(__file__)
logger.setLevel(logging.DEBUG)

# 创建一个 handler, 并写到 log.txt
# logging.FileHandler(self, filename, mode='a', encoding=None, delay=0)
handle = logging.FileHandler('log.txt')
handle.setLevel(logging.DEBUG)

# 创建一个 handler, 输出日志到 terminal
terminal = logging.StreamHandler()
terminal.setLevel(logging.DEBUG)

# 指定输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handle.setFormatter(formatter)
terminal.setFormatter(formatter)

# 添加 handler 到 logger
logger.addHandler(handle)
logger.addHandler(terminal)

# 写入日志
logger.debug('Debug')
logger.info('Info')

输出:

2016-07-26 00:09:05,212 - b.py - DEBUG - Debug
2016-07-26 00:09:05,213 - b.py - INFO - Info

多模块使用示例:

`log.py` 文件:

#!/usr/bin/env python
# coding=utf-8

__author__ = 'tianfeiyu'


import os
import logging


LOG_PATH = os.path.abspath(os.path.join(__file__,'..'))

logging.basicConfig(
        level=logging.INFO,
        format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S',
        filename=os.path.join(LOG_PATH, 'chatroom.log'),
        filemode='a'
    )
        
`client.py`  文件:


import logging

logger = logging.getLogger(__name__)
logger.error('This is error level')


DevOps-田飞雨 》》转载请注明源地址
喜欢 (2)or分享 (0)
发表我的评论
取消评论
*

表情 贴图 加粗 链接 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址