python中logger配置文件中FileHandler的动态文件路径和文件名

2024-03-29 09:43:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python日志配置文件,其文件处理程序如下所示。

[handler_filelog]
class: FileHandler
args = ('/var/tmp/log/client.log','a')

相反,我需要下面的表单(动态生成的路径)。

[handler_filelog]
class: FileHandler
args = ('/var/tmp/log_<unique_string>/client.log','a')

程序的多个实例可能正在运行,因此将使用不冲突的日志路径和文件。 在程序执行结束之前,记录器一次安装不需要更改。

有没有办法使用配置文件方法来处理这个问题? 我不喜欢自己创建loggers/handlers/formatters,因为我的日志配置文件有很多这样的文件,而基于配置文件的方法更好。

(更新:我正在使用Python2.4)


Tags: 文件方法路径clientlog处理程序表单var
3条回答

这是你需要的。您应该首先扩展FileHandler类。把它放在一个文件中,比如配置文件目录中的myHandler.py:

import logging
import random
import os
class myFileHandler(logging.FileHandler):
    def __init__(self,path,fileName,mode):
        r = random.randint(1,100000)
        path = path+"/log_"+str(r)
        os.mkdir(path)
        super(myFileHandler,self).__init__(path+"/"+fileName,mode)

然后在配置文件中,可以像这样使用这个自定义文件处理程序

class: myHandler.myFileHandler
args = ('/var/tmp','client.log','a')

我在我的机器上测试过这个

如果您使用的是Python2.7或3.2,那么可以使用dictionary-based configuration,这允许您指定返回处理程序的任意可调用项,例如,可以使用进程PID来构造文件名。

更新:如果您使用的是2.4,那么可以使用logutils包,该包应该与Python 2.4一起使用(除了LoggerAdapter类,它需要2.5或更高版本)。logutils包包含基于字典的配置功能。

“CallbackFilter”可用于在python的记录器配置文件中实现动态文件路径和文件名。您可以定义写动态日志如下:

def write_dynamic_log(record):
    now = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
    dynamic_log_name = '/var/log/test_%s.log' %now
    log_file = open(dynamic_log_name, "w")
    log_file.write(record.msg)
    log_file.close();
    return True

然后在配置文件中,可以使用如下过滤器:

[handler_filelog]
class: FileHandler
formatter: brief
level   : INFO
filters: [write_dynamic_log]
filename: static.log

信息或以上日志将输出到static.log和dynamic_log。

我在django项目中测试了它,在这个项目中,我在settings.py中编写了config。它工作得很好。日志记录将如下:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '[%(levelname)s] %(asctime)s - %(pathname)s:%(lineno)d\n%(message)s'
        },
        'debug': {
            'format': '[%(levelname)s] %(asctime)s - %(pathname)s:%(lineno)d\n\033[34m%(message)s\033[0m'
        },
        'error': {
            'format': 'Component: %(module)s\nErrorCode: %(funcName)s\nReason: %(funcName)s\nDetail: [%(message)s]'
        },
    },
    'filters': {
        'write_error_logs': {
            '()': 'django.utils.log.CallbackFilter',
            'callback': write_error_log,
        }
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'formatter': 'verbose',
        },
        'debug': {
            'class': 'logging.StreamHandler',
            'formatter': 'debug',
        },
        'error': {
            'level': 'ERROR',
            'class': 'logging.FileHandler',
            'filename': '/var/log/SmartStorageApp.err',
            'formatter': 'error',
            'filters': ['write_error_logs'],
        },
    },
    'loggers': {
        'django': {
            'handlers': ['debug' if DEBUG else 'console', 'error'],
            'level': 'INFO',
            'propagate': True,
        },
    }
}

相关问题 更多 >