用 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 对象中。

在 Python 的 logging 模块中,日志级别是指记录日志的详细程度
常见的日志级别包括:DEBUG、INFO、WARNING、ERROR、CRITICAL。
它们的关系是:
DEBUG < INFO < WARNING < ERROR < CRITICAL

也就是说,如果将日志级别设置为 DEBUG,则所有级别的日志都会被记录;如果设置为 INFO,则 INFO、WARNING、ERROR、CRITICAL 这四个级别及以上的日志都会被记录,以此类推。

在实际应用中,我们通常根据需要选择合适的日志级别来记录日志。

例如,如果一个程序有多个模块,我们可以将其中一些模块的日志级别设置为 DEBUG,以便查看更详细的日志信息;
将另外一些模块的日志级别设置为 INFO 或更高级别,以便快速定位问题所在。

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

你可能感兴趣的:(飞桨深度学习,aistudio,log,飞桨)