7

我通过这种方式创建日志文件:

    global logger
    logger = logging.getLogger("plus_dig_cname")
    logger.setLevel(logging.DEBUG)

    fh = logging.FileHandler( fdoc_log + "/plus_dig_cname.log" )

    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    fh.setFormatter(formatter)

    logger.addHandler(fh)

而当 plus_dig_cname.log 的大小大于 300MB 时,我通过 shell 脚本处理,主要过程是:

 mv $LOG_DIR/$1 $LOG_DIR/$1.bk
 [ $? -ne 0 ] && return 1
 touch $LOG_DIR/$1
 [ $? -ne 0 ] && return 1
 chmod 666 $LOG_DIR/$1
 [ $? -ne 0 ] && return 1

只需 mv 并触摸一个新的。
问题是记录器无法在 plus_dig_cname.log 文件中写入任何内容。日志无法工作。
也许可以通过以下方式解决:

with open( "plus_dig_cname.log", "w" ):
               pass

这种方式可以通过 Python 获取新的日志文件。但我想通过 Bash 获取新的日志文件。

那么,为什么在“mv touch chmod”之后无法进行日志记录呢?

谢谢

4

2 回答 2

6

使用RotatingFileHandler为您处理此问题。

例如:

MAX_SIZE = 300 * 1024 * 1024
LOG_PATH = fdoc_log + "/plus_dig_cname.log"
fh = logging.handlers.RotatingFileHandler(LOG_PATH, maxBytes=MAX_SIZE, backupCount=5)

这将创建 5 个备份,每个备份 300MB。

于 2012-09-17T06:16:58.590 回答
1

该文件在您创建FileHandler()或第一次写入时打开。如果您移动文件;它消失了。

您可以logging.handlers.RotatingFileHandler按照@sberry 的建议使用 Python 来旋转文件。

如果您在外部旋转日志文件,例如使用logrotate ,那么您可以通知您的脚本文件已消失,例如,通过重新启动它或在 postrotate 步骤中发送信号。

如果您使用诸如 inotify 之类的东西来检测更改,您的脚本可以自动重新打开文件。比较如何tail -ftail -F工作。

于 2012-09-17T06:43:38.193 回答