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

Gns*_*Gns 15 python logging

我有一个python日志配置文件,其中包含以下表单的文件处理程序.

[handler_filelog]
class: FileHandler
args = ('/var/tmp/log/client.log','a')
Run Code Online (Sandbox Code Playgroud)

相反,我需要它以下面的形式(动态生成的路径).

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

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

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

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

Pha*_*ani 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)
Run Code Online (Sandbox Code Playgroud)

然后在配置文件中,您可以像这样使用这个自定义FileHandler

class: myHandler.myFileHandler
args = ('/var/tmp','client.log','a')
Run Code Online (Sandbox Code Playgroud)

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


Vin*_*jip 6

如果你使用的是Python 2.7或3.2,你可以使用基于字典的配置,它允许你指定任意的callables来返回处理程序 - 你可以使用例如进程PID来构造文件名.

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