我有一个python程序正在写入由Linux的logrotate命令轮换的日志文件。当发生这种情况时,我需要发信号通知我的程序停止写入旧文件并开始写入新文件。我可以处理信号但是如何告诉python写入新文件?
我打开这样的文件:
logging.basicConfig(format='%(asctime)s:%(filename)s:%(levelname)s:%(message)s',filename=log_file, level=logging.INFO)
并像这样写信:
logging.log(level,"%s" % (msg))
日志记录模块看起来非常强大但也非常强大。感谢。
答案 0 :(得分:18)
您可能希望查看WatchedFileHandler来实现此功能,或者作为替代方案,使用RotatingFileHandler实现日志轮换,这两者都位于logging.handlers module。
答案 1 :(得分:16)
请勿使用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!')
答案 2 :(得分:7)
由于logrotate
已经完成了轮换,因此在信号处理程序中,您应该再次调用logging.basicConfig(...)
并重新打开日志文件。
答案 3 :(得分: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
这可以帮助您处理旋转日志