2012-02-02 174 views
18

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

我打开该文件是这样的:

logging.basicConfig(format='%(asctime)s:%(filename)s:%(levelname)s:%(message)s',filename=log_file, level=logging.INFO) 

像这样写的:

logging.log(level,"%s" % (msg)) 

日志记录模块看起来很强大,但也势不可挡。谢谢。

回答

14

您可能想要查看WatchedFileHandler来执行此操作,或者作为替代方案,使用RotatingFileHandler执行日志轮转,两者均位于logging.handlers module中。

+0

谢谢!如果我需要我可以去这条路线,但目前该文件已被旋转在我的代码之外。我希望有一种方法可以关闭日志并重新打开它。 – fredsnertz 2012-02-02 18:38:38

+0

啊... WatchedFileHandler ...现在我明白了。 – fredsnertz 2012-02-02 22:19:07

4
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 

这会帮助你在由于旋转已经被logrotate完成的,在信号处理程序,你应该再打电话logging.basicConfig(...),并应重新打开日志文件处理旋转日志

7

13

请勿使用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!') 
+0

谢谢你的例子!非常类似于我试图做的:) – houcros 2016-09-28 14:37:48

+0

请注意,根据文档,这只适用于* nix。 – 2017-11-03 11:53:17