有没有办法通过配置文件设置Python日志格式化器以Unix时间戳记录时间?

7 投票
3 回答
3890 浏览
提问于 2025-04-17 12:58

我正在为十几个Python组件写一个中央的logging配置文件,我需要一个特定的日志记录器来以UNIX时间格式记录时间(可以是毫秒,也可以是带小数的秒,两个都可以)。

有没有办法在配置文件中设置一个格式化器,让%(asctime)s以那种方式输出?我想避免在多个独立的Python脚本中修改Formatter实例,而且后期处理日志文件也不太现实。

相关链接:Python日志:覆盖日志时间

3 个回答

3

LogRecord对象有一个属性叫做created,这个属性是用来生成asctime的,而且它的格式已经是你想要的(带小数的秒数)。所以,最简单的解决办法就是把格式字符串中所有的%(asctime)s替换成%(created)f

[formatter_generic]
format = %(created)f %(levelname)-5.5s [%(name)s] %(message)s
4

我刚刚找到了解决方案:

import logging

class UnixTimeStampFormatter(logging.Formatter):
    def formatTime(self, record, datefmt = None):
        return "{0:.6f}".format(record.created)

def main():
    logChannel = logging.StreamHandler()
    logChannel.setFormatter(UnixTimeStampFormatter("%(asctime)s %(levelname)-5.5s [%(name)s] %(message)s"))
    logging.getLogger().setLevel(logging.DEBUG)
    logging.getLogger().addHandler(logChannel)
    logging.debug('hello');

if __name__ == "__main__":
    main()
6

只需添加

datefmt = %s

到你对应的格式化器配置部分或格式化器构造函数调用中,例如:

[formatter_generic]
format = %(asctime)s %(levelname)-5.5s [%(name)s] %(message)s
datefmt = %s

另请参见 logging.Formatter 构造函数和 strftime(3)

撰写回答