如何清除日志文件并再次写入?

时间:2012-09-17 06:12:03

标签: python

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

    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

只需点击它并触摸一个新的。
问题是记录器无法在其中进行任何操作 plus_dig_cname.log文件。记录无法正常工作。
也许可以通过以下方式解决:

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

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

那么,为什么在“mv touch chmod”之后日志记录无效?

谢谢

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:1)

创建FileHandler()或第一次写入时,文件会被打开。如果你移动文件;它消失了。

您可以使用logging.handlers.RotatingFileHandler作为@sberry建议使用Python旋转文件。

如果您在外部轮换日志文件,例如,使用logrotate,则可以通过重新启动文件或在postrotate步骤中发送信号来通知脚本文件已消失。

如果您使用类似inotify的内容来检测更改,您的脚本可能会自动重新打开该文件。比较tail -ftail -F的工作方式。