Python logging 打印时追加系统时间

介绍

在Python中,logging是一个非常有用的模块,用于记录程序的运行状态、调试信息和错误日志。logging模块提供了灵活的配置选项,可以将日志记录到不同的目标,如控制台、文件或网络。但是,默认情况下,logging模块并不会在日志中包含系统时间。本文将介绍如何使用logging模块实现在打印日志时追加系统时间的功能。

logging模块简介

logging是Python内置的标准库,用于记录程序的运行状态以及错误信息。使用logging模块可以代替print语句,可以灵活地控制日志的输出内容和输出目标。logging模块的主要组成部分包括:

  • Logger:用于记录日志的主要对象,可以通过调用其方法来输出不同级别的日志信息。
  • Handler:用于指定日志输出的目标,如控制台、文件或网络。
  • Formatter:用于设置日志输出的格式。
  • Filter:用于过滤日志信息。

logging模块提供了5个不同级别的日志记录方法,按照严重程度递增分别为:DEBUG、INFO、WARNING、ERROR和CRITICAL。可以根据需要选择不同级别的日志记录方法,以便更好地了解程序的运行状态。

如何追加系统时间

为了在日志中追加系统时间,可以自定义一个Formatter类,并在其中添加时间信息。下面是一个示例代码:

import logging
import datetime

class MyFormatter(logging.Formatter):
    def format(self, record):
        time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        record.message = f"[{time}] {record.message}"
        return super().format(record)

logger = logging.getLogger()
handler = logging.StreamHandler()
formatter = MyFormatter("%(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.INFO)

logger.info("Hello, world!")

在上面的代码中,我们定义了一个名为MyFormatter的自定义Formatter类。在format方法中,我们使用datetime模块获取当前系统时间,并将其格式化为"%Y-%m-%d %H:%M:%S"的形式。然后,我们将时间信息与日志消息拼接起来,并返回格式化后的字符串。

接下来,我们创建一个Logger对象,并设置日志级别为INFO。然后,我们创建一个StreamHandler对象,并将其添加到Logger对象中。StreamHandler用于将日志输出到控制台。

最后,我们通过调用Logger对象的info方法来记录日志。打印结果类似于:[2022-01-01 12:00:00] Hello, world!

进一步优化

上述代码实现了在打印日志时追加系统时间的功能,但还可以进一步优化。我们可以使用装饰器来简化日志记录的过程,使其更加方便。

import logging
import datetime

def log_with_time(fn):
    def wrapper(*args, **kwargs):
        logger = logging.getLogger()
        handler = logging.StreamHandler()
        formatter = logging.Formatter("%(asctime)s - %(message)s", "%Y-%m-%d %H:%M:%S")
        handler.setFormatter(formatter)
        logger.addHandler(handler)
        logger.setLevel(logging.INFO)
        logger.info(fn.__name__)
        result = fn(*args, **kwargs)
        logger.removeHandler(handler)
        return result
    return wrapper

@log_with_time
def say_hello():
    print("Hello, world!")

say_hello()

在上面的代码中,我们定义了一个名为log_with_time的装饰器函数。装饰器函数接受一个函数作为参数,并返回一个新的函数。在新的函数中,我们首先创建Logger对象,并设置日志级别为INFO。然后,我们创建一个StreamHandler对象,并将其添加到Logger对象中。在装饰的函数执行之前,我们使用Logger对象记录日志,并将日志消息设置为函数的名称。在装饰的函数执行完毕后,我们从Logger对象中移除StreamHandler。

最后,我们通过在say_hello函数上应用装饰器来记录日志。当我们调用say_hello函数时,日志消息将自动包含系统时间。

总结

本文介绍了如何使用Python的logging模块实现