> 文章列表 > 用 logging 模块将信息输出到日志文件

用 logging 模块将信息输出到日志文件

用 logging 模块将信息输出到日志文件

当你要用到一些信息去统计画图

或者你的输出太长了,出现了那种“折叠”,就是说“内容超过1000行”,结果等下一次进入环境,你只能看到结尾的输出,却看不到开头的输出了,

那么你可以使用 Python 内置的 logging 模块将一些信息输出到日志文件中

具体来说,

  • 你首先需要创建一个 logger 对象
  • 然后在需要记录信息的地方调用 logger 对象的相应方法,比如 logger.info()、logger.debug() 等。

Step1. 创建一个 logger 对象

如下所示:

import logging# 创建 logger 对象
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)# 创建文件 handler 并设置级别为 INFO
file_handler = logging.FileHandler('log.txt')
file_handler.setLevel(logging.INFO)# 创建控制台 handler 并设置级别为 DEBUG
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)# 创建 formatter 对象并设置格式
formatter = logging.Formatter('%(asctime)s [%(levelname)s] %(message)s')
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)# 将 handler 添加到 logger 对象中
logger.addHandler(file_handler)
logger.addHandler(console_handler)
  • 通过 getLogger() 方法获取名字为__name__(即当前模块)的 logger 对象,并设置它的日志级别为 INFO。
  • 接着,创建一个输出日志到文件的 FileHandler 和一个输出日志到控制台的 StreamHandler,分别将它们的日志级别设置为 INFO 和 DEBUG,并为它们设置相同的格式化字符串。
  • 最后,将这两个 handler 添加到 logger 对象中。

Step2. 调用 logger 对象的相应方法

在你需要用 Logger 的地方用如下代码:

# 在需要记录信息的地方使用 logger 对象
for j in range(num_batches):logger.info('j: %d', j)logger.info('indexes[j]: %s', indexes[j])
  • 在 for 循环中,通过 logger 对象的 info() 方法记录 j 和 indexes[j],其中第二个参数表示要记录的信息,可以使用占位符来指定格式
  • 例如,‘%d’ 表示将输出一个整数,‘%s’ 表示将输出一个字符串。

日志信息将同时输出到文件和控制台。

上述代码会把 indexes 张量中的下标 jjj 以及下标 jjj 对应的张量值,同时输出到一个 log.txt 文件和控制台。

如图所示:

用 logging 模块将信息输出到日志文件

注意点

比如我刚用的时候,直接复制了输出到控制台语句 print('j: ', j) ,把 logger.info 写成了 logger.info('j: ', j) ,有参数,但是没写占位符,于是报错:

--- Logging error ---
Traceback (most recent call last):File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/logging/__init__.py", line 1025, in emitmsg = self.format(record)File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/logging/__init__.py", line 869, in formatreturn fmt.format(record)File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/logging/__init__.py", line 608, in formatrecord.message = record.getMessage()File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/logging/__init__.py", line 369, in getMessagemsg = msg % self.args
TypeError: not all arguments converted during string formatting

这个错误的原因是在使用格式化字符串时,参数的数量和占位符的数量不匹配。改成 logger.info('j: %d', j) 就 OK 了。

以下是一些常见的错误:

  • 格式化字符串使用了 % 操作符,但提供的参数数量不够或过多
  • 在使用 logging 模块时,格式化字符串中的占位符和参数数量不匹配
  • 参数传递错误,例如传递了一个列表或元组,但却把它作为单个参数传递。

例如,在 logging 中,如果你使用了类似于以下的代码:

logger.error("Error %s", error_message)

但是 error_message 是一个 tuple 类型,那么就会出现上述错误。要解决这个问题,可以将 error_message 拆分开来:

logger.error("Error %s: %s", error_message[0], error_message[1])