Python记录和旋转文件

fre*_*rtz 29 python logging

我有一个python程序正在写入由Linux的logrotate命令旋转的日志文件.当发生这种情况时,我需要发信号通知我的程序停止写入旧文件并开始写入新文件.我可以处理信号但是如何告诉python写入新文件?

我打开这样的文件:

logging.basicConfig(format='%(asctime)s:%(filename)s:%(levelname)s:%(message)s',filename=log_file, level=logging.INFO)
Run Code Online (Sandbox Code Playgroud)

并写这样的:

logging.log(level,"%s" % (msg))
Run Code Online (Sandbox Code Playgroud)

日志记录模块看起来非常强大但也非常强大.谢谢.

And*_*ker 22

您可能希望查看WatchedFileHandler来实现它,或者作为替代方法,使用RotatingFileHandler实现日志轮换,两者都在logging.handlers模块中.


pro*_*ski 21

不要使用logging.basicConfig,使用WatchedFileHandler.这是如何使用它.

import time
import logging
import logging.handlers

def log_setup():
    log_handler = logging.handlers.WatchedFileHandler('my.log')
    formatter = logging.Formatter(
        '%(asctime)s program_name [%(process)d]: %(message)s',
        '%b %d %H:%M:%S')
    formatter.converter = time.gmtime  # if you want UTC time
    log_handler.setFormatter(formatter)
    logger = logging.getLogger()
    logger.addHandler(log_handler)
    logger.setLevel(logging.DEBUG)

log_setup()
logging.info('Hello, World!')
import os
os.rename('my.log', 'my.log-old')
logging.info('Hello, New World!')
Run Code Online (Sandbox Code Playgroud)


Ala*_*ine 7

由于旋转已经完成logrotate,在您的信号处理程序中,您应该logging.basicConfig(...)再次调用,并且应该重新打开日志文件.

  • `basicConfig` 是一个空操作,如果它已经运行了。要强制它再次重新配置所有内容,您必须先设置 `logging.root.handlers = []`。 (2认同)

ava*_*sal 6

from logging import handlers

handler = handlers.TimedRotatingFileHandler(filename, when=LOG_ROTATE)

handler.setFormatter(logging.Formatter(log_format, datefmt="%d-%m-%Y %H:%M:%S"))

#LOG_ROTATE = midnight    
#set your log format
Run Code Online (Sandbox Code Playgroud)

这应该可以帮助您处理旋转日志