在Python中重命名日志文件,同时文件继续写入任何其他日志

时间:2016-07-06 08:30:02

标签: python json logging rename

我正在使用Python记录器机制来记录我的日志。我有两种类型的日志, 一个是旋转日志(log1,log2,log3 ...)和一个名为json.log的非旋转日志(顾名思义,其中包含json日志)。 日志文件在服务器启动时创建,在应用程序关闭时关闭。

我一般要做的是:当我按下我页面上的导入按钮时,将所有json日志保存在sqlite db上。

我面临的问题是: 当我尝试重命名json.log文件时:

source_file = "./logs/json.log"
snapshot_file = "./logs/json.snapshot.log"

try:
   os.rename(source_file, snapshot_file)

我得到了windowsError: [Error 32] The process cannot access the file because it is being used by another process

这是因为记录器正在连续使用该文件。因此,我需要"关闭"该文件不知怎的,所以我可以成功地进行I / O操作。 问题是这是不可取的,因为在文件关闭之前日志可能会丢失,然后重命名然后重新创建"。

我想知道是否有人再次遇到这种情况,并且找到了任何实际解决方案。

我尝试了一些有效但不方便的东西,不确定它是否安全,以免丢失任何日志。

我的代码是:

source_file = "./logs/json.log"
snapshot_file = "./logs/json.snapshot.log"

try:
    logger = get_logger()


    # some hackish way to remove the handler for json.log 

    if len(logger.handlers) > 2:
        logger.removeHandler(logger.handlers[2])
    if not os.path.exists(snapshot_file):
        os.rename(source_file, snapshot_file)

    try:
        if type(logger.handlers[2]) == RequestLoggerHandler:
            del logger.handlers[2]
    except IndexError:
        pass


    # re-adding the logs file handler so it continues writing the logs

    json_file_name = configuration["brew.log_file_dir"] + os.sep + "json.log"
    json_log_level = logging.DEBUG
    json_file_handler = logging.FileHandler(json_file_name)
    json_file_handler.setLevel(json_log_level)
    json_file_handler.addFilter(JSONLoggerFiltering())
    json_file_handler.setFormatter(JSONFormatter())
    logger.addHandler(json_file_handler)

... code continues to write the logs to the db and then delete the json.snapshot.file 
until the next time the import button is pressed; then the snapshot is created again 
only for writing the logs to the db.

另外,作为参考,我的日志文件具有以下格式:

{'status': 200, 'actual_user': 1, 'resource_name': '/core/logs/process', 'log_level': 'INFO', 'request_body': None, ... }

提前致谢:)

0 个答案:

没有答案