python logging包的用法

Python的logging模块是一个功能强大且灵活的日志记录工具,用于在程序中输出运行时的信息、警告、错误等。它能够帮助开发者跟踪代码的执行过程、调试问题,并记录运行中的重要事件。

1. 基本用法

import logging

# 设置日志的基本配置
logging.basicConfig(level=logging.DEBUG)

# 打印不同级别的日志
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.")

输出:

DEBUG:root:This is a debug message.
INFO:root:This is an info message.
WARNING:root:This is a warning message.
ERROR:root:This is an error message.
CRITICAL:root:This is a critical message.

logging.basicConfig(level=logging.DEBUG)设置了日志的最低级别为DEBUG,所以从DEBUGCRITICAL 的所有日志都会被记录。
默认情况下,只有WARNING级别及以上的日志会显示在控制台。如果要显示更低级别(如 DEBUGINFO),需要通过basicConfig设置日志级别。

2. 日志级别

logging模块提供了5个标准的日志级别,从低到高分别为:

DEBUG:用于调试,详细信息,通常只出现在诊断问题时。
INFO:用于确认一切按预期工作。
WARNING:表示某些问题,但并不影响程序运行。
ERROR:严重问题,程序部分功能无法正常运行。
CRITICAL:非常严重的错误,可能导致程序崩溃。

3. 配置日志格式

可以自定义日志的输出格式,包括时间、日志级别、模块名等信息。

import logging

# 配置日志级别及格式
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

# 打印不同级别的日志
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.")

输出:

2024-10-03 15:38:45,690 - DEBUG - This is a debug message.
2024-10-03 15:38:45,690 - INFO - This is an info message.
2024-10-03 15:38:45,690 - WARNING - This is a warning message.
2024-10-03 15:38:45,690 - ERROR - This is an error message.
2024-10-03 15:38:45,690 - CRITICAL - This is a critical message.

%(asctime)s:记录日志的时间。
%(levelname)s:日志的级别名(如DEBUGINFO,等)。
%(message)s:日志消息。

4. 将日志输出到文件

可以通过filename参数将日志输出到文件,而不是控制台。

import logging

# 将日志输出到文件
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s', filename='train.log')

# 注意,每执行一次logging.debug(info/warning/error/critical)操作都是往之前的train.log中追加信息,程序重新运行也是追加信息(已有信息不会清空)
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.")

这个示例中,所有日志信息都会被写入名为train.log的文件,而不是在控制台输出。

5. 日志记录器(Logger)与处理器(Handler)

import logging

# 创建训练log
train_logger = logging.getLogger("train_logger")
train_logger.setLevel(logging.DEBUG)

# 创建一个控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.WARNING)  # 最终输出的日志级别由train_logger和console_handler综合的最严格的级别执行

# 创建一个文件处理器
file_handler = logging.FileHandler(filename='train.log')
file_handler.setLevel(logging.DEBUG)  # 最终输出的日志级别由train_logger和file_handler综合的最严格的级别执行

# 设置日志格式
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

# 将处理器添加到train_logger
train_logger.addHandler(console_handler)   # 如果不添加这句,控制台不会有任何日志输出
train_logger.addHandler(file_handler)

# 使用 Logger 记录日志
train_logger.debug("This is a debug message.")
train_logger.info("This is an info message.")
train_logger.warning("This is a warning message.")
train_logger.error("This is an error message.")
train_logger.critical("This is a critical message.")

控制台输出:

2024-09-30 16:08:17,986 - train_logger - WARNING - This is a warning message.
2024-09-30 16:08:17,986 - train_logger - ERROR - This is an error message.
2024-09-30 16:08:17,986 - train_logger - CRITICAL - This is a critical message.

生成的日志文件train.log中的内容:

2024-09-30 16:09:39,996 - train_logger - DEBUG - This is a debug message.
2024-09-30 16:09:39,996 - train_logger - INFO - This is an info message.
2024-09-30 16:09:39,996 - train_logger - WARNING - This is a warning message.
2024-09-30 16:09:39,996 - train_logger - ERROR - This is an error message.
2024-09-30 16:09:39,996 - train_logger - CRITICAL - This is a critical message.

6. 日志中的异常信息

except语句中记录日志时,logging可以自动捕获异常的详细信息。
exc_info=True 会记录异常的详细堆栈信息,帮助调试程序中的错误。

import logging

try:
    result = 10/0
except ZeroDivisionError:
    logging.error("ZeroDivisionError", exc_info=True)

输出:

ERROR:root:ZeroDivisionError
Traceback (most recent call last):
  File "E:\02.Projects\13.PyTorch\08.logging.py", line 77, in <module>
    result = 10/0
             ~~^~
ZeroDivisionError: division by zero
Python logging模块是一个非常强大的日志记录模块,可以帮助你记录程序运行时产生的各种日志信息。下面是Python logging的一些用法: #### 1. 基本用法 使用Python logging最基本的方法是使用`logging`模块中的`basicConfig()`方法,来配置日志记录器的格式和级别: ```python import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s:%(message)s') ``` 在这个例子中,我们指定了日志记录器的级别为DEBUG,格式为`%(asctime)s %(levelname)s:%(message)s`。使用`basicConfig()`方法只需要在程序开始时调用一次即可。 如果你想记录某一级别以上的日志信息,可以将`level`参数设置为相应级别,例如`logging.WARNING`、`logging.ERROR`等。 #### 2. 记录日志 使用Python logging模块记录日志非常简单,只需要调用相应级别的方法即可,例如: ```python logging.debug('Debugging information') logging.info('Informational message') logging.warning('Warning') logging.error('Error occurred') logging.critical('Critical error') ``` #### 3. 使用不同的日志记录器 在一个Python程序中,你可以使用不同的日志记录器来记录不同的日志信息。例如,你可以为某一个模块或者某一部分程序代码使用一个独立的日志记录器,这样可以更好地管理日志信息。 ```python import logging logger1 = logging.getLogger('module1') logger2 = logging.getLogger('module2') logger1.debug('Debugging information') logger2.error('Error occurred') ``` 在这个例子中,我们为两个不同的模块创建了两个不同的日志记录器,分别是`logger1`和`logger2`。然后,我们分别使用这两个日志记录器来记录不同的日志信息。 #### 4. 日志输出到文件 除了将日志输出到控制台,你还可以将日志输出到文件中。使用Python logging模块输出日志到文件也非常简单,只需要将`basicConfig()`方法中的`filename`参数设置为你想要输出日志的文件名即可: ```python import logging logging.basicConfig(filename='example.log', level=logging.DEBUG, format='%(asctime)s %(levelname)s:%(message)s') logging.debug('Debugging information') ``` 在这个例子中,我们将日志输出到了名为`example.log`的文件中。 #### 5. 记录异常信息 当程序遇到异常时,你可以使用Python logging模块来记录异常信息,例如: ```python import logging try: # 这里是你的程序代码 pass except Exception as e: logging.exception("Exception occurred") ``` 在这个例子中,我们使用`logging.exception()`方法来记录异常信息,这个方法会记录完整的异常堆栈信息,非常方便排查问题。 #### 6. 使用日志回滚 当日志文件变得过大时,你可能需要使用日志回滚来分割日志文件。Python logging模块提供了多种日志回滚方式,例如按文件大小回滚、按时间回滚等。 ```python import logging from logging.handlers import RotatingFileHandler handler = RotatingFileHandler('example.log', maxBytes=10000, backupCount=5) logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s:%(message)s', handlers=[handler]) ``` 在这个例子中,我们使用`RotatingFileHandler`来实现按文件大小回滚日志。`maxBytes`参数指定了每个日志文件的最大大小(这里是10KB),`backupCount`参数指定了最多保存多少个回滚日志文件(这里是5个)。 #### 7. 配置日志记录器 你可以使用Python logging模块中的`Logger`类来创建和配置日志记录器,例如: ```python import logging logger = logging.getLogger('my_logger') logger.setLevel(logging.DEBUG) formatter = logging.Formatter('%(asctime)s %(levelname)s:%(message)s') file_handler = logging.FileHandler('my.log') file_handler.setFormatter(formatter) logger.addHandler(file_handler) logger.debug('Debugging information') ``` 在这个例子中,我们使用`getLogger()`方法创建了一个名为`my_logger`的日志记录器,然后通过`setLevel()`方法来设置日志记录器的级别为DEBUG。接着,我们使用`Formatter`类来定义日志的格式,然后创建了一个`FileHandler`来将日志输出到`my.log`文件中,并使用`setFormatter()`方法来设置日志的格式。最后,我们使用`addHandler()`方法将`FileHandler`添加到`my_logger`日志记录器中,从而实现了将日志输出到文件中。 以上就是Python logging模块的一些基本用法,你可以根据需要来选择和使用相应的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值