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

时间:2012-02-23 01:33:31

标签: python logging

我有一个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')

程序的多个实例可能正在运行,因此将使用非冲突的日志路径和文件。 记录器一旦设置就不需要改变,直到程序执行结束。

有没有办法使用配置文件方法处理这个问题? 我并不热衷于自己创建记录器/处理程序/格式化程序,因为我的日志配置文件包含许多这些并且基于配置文件的方法更好。

(更新:我正在使用python 2.4)

3 个答案:

答案 0 :(得分:11)

这可以满足您的需求。您应该首先扩展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)

然后在配置文件中,您可以使用此自定义FileHandler

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

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

答案 1 :(得分:6)

如果您使用的是Python 2.7或3.2,则可以使用dictionary-based configuration,它允许您指定任意的callables来返回处理程序 - 例如,您可以使用使用进程PID来构造文件名。

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

答案 2 :(得分:0)

“CallbackFilter”可用于实现Dynamic filepath&amp; python中logger配置文件的文件名。您可以按如下方式定义write_dynamic_log:

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

INFO或以上日志将输出到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,
        },
    }
}