Python打印日志库(logging)

一、日志等级

级别何时使用
DEBUG细节信息,仅当诊断问题时使用
INFO确认程序按预期运行
WARNING表明已经或即将发生的意外(例如:磁盘空间不足)。程序仍按预期进行
ERROR由于严重的问题,程序的某些功能已经不能正常执行
CRITICAL严重的错误,表明程序已不能继续执行

默认等级是“WARNING”,意味着只会跟踪该级别及以上的事件(由上倒下等级以此递增),除非更改日志配置。

二、基本用法

1. quick start

>>> import logging
>>> logging.warning("warning")
WARNING:root:warning
>>> logging.info("information")
>>>

注意这里只有warning的信息打印出来了。如前面所说,默认等级是“WARNING”,只会追踪该级别及以上的事件,所以info信息没有被打印出来。

其中WARNING是记录级别;root代表打印的模块来源(没有显示设置,显然是默认值,甚至不是当前模块的名称);warning就是我们显示打印的数据信息了。

2. 记录日志到文件

import logging

logging.basicConfig(filename='pycode.log', level=logging.DEBUG)
logging.warning('warning')
logging.info('information')
logging.debug('debug')

 通过设置logging的基本配置可以将记录重定向到文件中。同时可以通过level指定打印级别。

# pycode.log
WARNING:root:warning
INFO:root:information
DEBUG:root:debug

注意到,此时在文件中的打印级别已经降为 DEBUG了。该方法也适用在命令行中修改打印级别。

但有个需要注意的点:对basicConfig的调用应该在debug(),info()等函数前面。basicConfig是一次性的配置,只有第一次调用会进行操作,随后的调用不会产生有效操作。

什么意思呢?举个例子:

>>> import logging
>>> logging.warning("123")
WARNING:root:123
>>> logging.info("123") # 不会有输出
>>> logging.basicConfig(level=logging.DEBUG)
>>> logging.info("123") # 依旧不会有输出

 另一个例子:

>>> import logging
>>> logging.basciConfig(level=loggin.DEBUG)
>>> logging.warning("123")
WARNING:root:123
>>> logging.info("123")
INFO:root:123

在第一次调用logging.info()、warning()等函数的时候,就会调用内置的basicConfig。此时就已经固化打印级别为WARNING了,即使后面再次显式调用basicConfig也不会有效。 

命令行指定级别:除了通过basicConfig设置level,也可以在执行Python程序的时候,通过命令行参数指定。

$ 设置logging打印级别为INFO 
$ python3 pycode.py --log=INFO

追加打印:此外,记录输出到文件中,默认是追加打印的。如果希望重新记录,可以这样:

logging.basicConfig(filename='pycode.log', filemode='w', level=logging.DEBUG)

3. 多模块打印 

# main.py
import logging
import somelib

logging.basicConfig(level=logging.INFO)

def main():
    logging.info("py01")
    py02.do_something()

if __name__ == '__main__':
    main()

# ---------------------------
# somelib.py
import logging

def do_something():
    logging.info("py02")

输出:

# pycode.log
INFO:root:py01
INFO:root:py02

可以看到,多模块的信息都能正常打印到日志文件中。但很明显可以发现不论是从哪个模块输出,日志记录中显示的都是root。所以目前还不能跟踪记录打印的模块来源。

4. 定义打印格式

前面出现的打印信息基本上是:记录级别:模块来源:记录信息

同样可以在basicConfig中定义打印的格式:

>>> import logging
>>> logging.basicConfig(format='%(asctime)s : %(name)s : %(message)s', level=logging.INFO)
>>> logging.info("123")
2020-06-19 22:38:16,048 : root : 123

可以看到,此时展示了打印时间,模块来源及记录信息。

格式配置属性

格式描述
%(asctime)s调用消息记录打印时的时间(格式化后的时间)
%(created)f调用消息记录打印时的时间(未格式化的描述,相当于time.time())
%(filename)s调用消息记录打印的文件名称(在哪个文件里面)
%(funcName)s调用消息记录打印的函数名称(在哪个函数里面)
%(levelname)s消息记录级别(DEBUG,INFO,WARNING,ERROR,CRITICAL)
%(levelno)s消息记录级别的数字号(DEBUG=10,INFO=20,WARNING=30,ERROR=40,CRITICAL=50)
%(lineno)d调用消息记录打印的行数(在哪一行打印的)
%(message)s待打印的自定义消息
%(module)s调用消息记录的模块名
%(msecs)d调用消息记录打印时间的毫秒部分
%(name)s打印消息的logger对象名称(自定义的,默认是root)
%(pathname)s调用消息记录的文件路径
%(process)d进程ID
%(processName)s进程名
%(relativeCreated)d相对logging模块被加载到打印消息记录时的相对时间(毫秒)
%(thread)d线程ID
%(threadName)s线程名

此时,为了跟踪打印消息的来源,我们可以组织一个这样的格式串:

# main.py
import logging
import somelib

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s: %(name)s: %(levelname)s: %(message)s")
logger = logging.getLogger("main123")

def main():
    logger.info("py01")
    somelib.do_something()

if __name__ == '__main__':
    main()

# ------------------------------
# somelib.py
import logging

logger = logging.getLogger("pylib")

def do_something():
    logger.info("py02")

# ------------------------------
# 输出
2020-06-19 23:26:27,263: main123: INFO: py01
2020-06-19 23:26:27,264: pylib: INFO: py02

 有其他的需求,也可以根据上面列出来的属性自行搭配。

参考资料:

[1] 日志基础教程-官方文档

[2] LogRecord属性-官方文档

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,打印日志可以使用标准中的`logging`模块。`logging`模块提供了一个灵活的方式来记录程序运行时产生的信息,可以控制日志的级别、输出位置以及格式等。 以下是一个简单的打印日志的示例: ```python import logging # 配置日志输出的格式 logging.basicConfig(format='%(asctime)s %(levelname)s: %(message)s', level=logging.INFO) # 输出日志信息 logging.debug('This is a debug message.') logging.info('This is an info message.') logging.warning('This is a warning message.') logging.error('This is an error message.') logging.critical('This is a critical message.') ``` 输出的日志格式为`时间 日志级别: 日志信息`,如下所示: ``` 2021-10-08 17:26:46,229 INFO: This is an info message. 2021-10-08 17:26:46,229 WARNING: This is a warning message. 2021-10-08 17:26:46,229 ERROR: This is an error message. 2021-10-08 17:26:46,229 CRITICAL: This is a critical message. ``` 可以看出,日志信息按照级别进行输出,级别从低到高依次是`DEBUG`、`INFO`、`WARNING`、`ERROR`和`CRITICAL`,默认的级别是`WARNING`,可以通过`basicConfig()`函数的`level`参数来设置输出的最低级别。 除了上面的方式外,还可以使用`Logger`类来记录日志,可以更加灵活地控制日志的输出。例如,可以创建一个名为`mylogger`的日志记录器,并设置其输出级别为`DEBUG`: ```python import logging # 创建一个名为'mylogger'的Logger对象 logger = logging.getLogger('mylogger') logger.setLevel(logging.DEBUG) # 配置日志输出的格式 formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s') # 创建一个输出到控制台的Handler对象 console_handler = logging.StreamHandler() console_handler.setLevel(logging.DEBUG) console_handler.setFormatter(formatter) # 将Handler对象添加到Logger对象中 logger.addHandler(console_handler) # 输出日志信息 logger.debug('This is a debug message.') logger.info('This is an info message.') logger.warning('This is a warning message.') logger.error('This is an error message.') logger.critical('This is a critical message.') ``` 输出结果与前面的示例相同,但是使用的是`mylogger`这个记录器,并且可以更加灵活地控制日志的输出方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值