当你要用到一些信息去统计画图,
或者你的输出太长了,出现了那种“折叠”,就是说“内容超过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 张量中的下标 j j j 以及下标 j j j 对应的张量值,同时输出到一个 log.txt 文件和控制台。
如图所示:
注意点
比如我刚用的时候,直接复制了输出到控制台语句 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 emit
msg = self.format(record)
File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/logging/__init__.py", line 869, in format
return fmt.format(record)
File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/logging/__init__.py", line 608, in format
record.message = record.getMessage()
File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/logging/__init__.py", line 369, in getMessage
msg = 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])