当前位置: 首页 > 知识库问答 >
问题:

如何在每个记录器的基础上更改Python日志消息的格式?

虞华翰
2023-03-14

在阅读了log上的留档后,我知道我可以使用这样的代码来执行简单的日志记录:

import logging

def main():
    logging.basicConfig(filename="messages.log",
                        level=logging.WARNING,
                        format='%(filename)s: '    
                                '%(levelname)s: '
                                '%(funcName)s(): '
                                '%(lineno)d:\t'
                                '%(message)s')

    logging.debug("Only for debug purposes\n")
    logging.shutdown()

main()

然而,我意识到我不知道如何在每个记录器的基础上更改日志消息的格式,因为basicConfig是一个模块级函数。此代码用于创建具有不同级别、名称等的不同记录器。但是有没有一种方法可以在每个记录器的基础上以类似于basicConfig的方式更改这些日志消息的格式?

import inspect
import logging

def function_logger(level=logging.DEBUG):
    function_name = inspect.stack()[1][3]
    logger = logging.getLogger(function_name)
    logger.setLevel(level)
    logger.addHandler(logging.FileHandler("{0}.log".format(function_name)))
    return logger

def f1():
    f1_logger = function_logger()
    f1_logger.debug("f1 Debug message")
    f1_logger.warning("f1 Warning message")
    f1_logger.critical("f1 Critical message")

def f2():
    f2_logger = function_logger(logging.WARNING)
    f2_logger.debug("f2 Debug message")
    f2_logger.warning("f2 Warning message")
    f2_logger.critical("f2 Critical message")

def main():
    f1()
    f2()
    logging.shutdown()

main()

共有2个答案

邢和光
2023-03-14

您必须创建或使用日志记录的现有子类。处理程序并使用记录器的自定义子类的实例调用其实例的setformatter()方法。格式化程序。如果为已附加到要修改其输出的记录器的处理程序设置格式化程序,则可以,否则必须使用logging检索记录器对象。getLogger()并使用设置格式化程序的处理程序类的实例作为参数调用其addHandler()方法。

燕野
2023-03-14

试试这个

import logging

logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)
# create file handler that logs debug and higher level messages
fh = logging.FileHandler('spam.log')
fh.setLevel(logging.DEBUG)
# create console handler with a higher log level
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
# create formatter and add it to the handlers
formatter = logging.Formatter(
    '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
fh.setFormatter(formatter)
# add the handlers to logger
logger.addHandler(ch)
logger.addHandler(fh)

# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

看见http://docs.python.org/howto/logging-cookbook.html#multiple-有关详细信息,请参阅处理程序和格式化程序

 类似资料:
  • 问题内容: 在Python中(通过日志记录模块)临时更改日志记录消息格式的最简单方法是什么? 目标是具有某种标准的消息格式,同时能够临时添加有关正在读取的某些文件的信息(如文件名);当不再读取文件时,消息格式应恢复为其默认值。产生该消息的程序 不 知道正在读取哪个文件,因此,如果其消息自动包含相关的文件名(错误消息将是:“ 读取文件 ***时出错:…”,而不是该消息),将是很好的选择。 “错误:…

  • 问题内容: 我正在使用Python的机制将输出打印到屏幕上。我可以使用print语句来做到这一点,但是我想允许用户调整更好的粒度以禁用某些类型的输出。我喜欢为错误打印的格式,但是当输出级别为“信息”时,我希望使用更简单的格式。 例如: 在此示例中,我希望以不同的方式打印错误的格式: 是否可以在没有多个日志记录对象的情况下针对不同的日志级别使用不同的格式?我宁愿在创建记录器后就不修改它,因为有大量的

  • 我希望能够为每个日志消息执行一个方法,允许我在日志记录之前动态修改该消息。我知道有一些过滤器允许我指示是否应该记录消息,但我不想阻止记录消息,我只想在记录之前对其进行修改。我该怎么做呢? 注意:我问了这个关于log4j2的问题,但我也对其他流行Java日志框架持开放态度。

  • ,日志记录将进入一个文件; (路径)/service_name/service_name.log 我想用logback复制这种行为,但在logback.xml配置中获取“logger”名称时遇到了真正的困难。它可以在log encoder.pattern中看到,即“%d%-5level%logger{35}-%msg%n”。

  • 我使用的是播放框架,其中日志是默认的记录器引擎。为了便于跟踪,我希望将两个不同的活动(和)记录在两个单独的文件中。为此,我有两个追加器和两个记录器。每个记录器都用特定的appender标记。 我希望通过事务记录器(如登录或注册相关活动(如 但不管用。有什么想法吗? 我所说的“不工作”是指相同的日志被附加到两个记录器中,而不是特定于特定的日志。例如。如果我从播放代码调用,事务和登录记录器都将用户X已

  • 问题内容: 对于以下代码: 产生以下警告: 日志记录格式插值(W1202): 在日志记录函数中使用%格式,并将%参数作为参数传递。在日志记录语句的调用形式为“ logging。(format_string.format(format_args …))”时使用。这样的调用应改为使用%格式,但通过将参数作为参数传递,将插值留给日志记录函数。 我知道我可以关闭此警告,但我想理解它。我假定使用是在Pyth