Python logger动态文件名

sha*_*eel 7 python logging

我想以这样的方式配置我的Python记录器,以便记录器的每个实例都应该登录一个与记录器本身名称相同的文件.

例如:

log_hm = logging.getLogger('healthmonitor')
log_hm.info("Testing Log") # Should log to /some/path/healthmonitor.log

log_sc = logging.getLogger('scripts')
log_sc.debug("Testing Scripts") # Should log to /some/path/scripts.log

log_cr = logging.getLogger('cron')
log_cr.info("Testing cron") # Should log to /some/path/cron.log
Run Code Online (Sandbox Code Playgroud)

我想保持它的通用性,并且不想硬编码我可以拥有的所有类型的记录器名称.那可能吗?

unu*_*tbu 16

如何简单地将处理程序代码包装在函数中:

import os
def myLogger(name):
    logger = logging.getLogger(name)
    logger.setLevel(logging.DEBUG)
    handler = logging.FileHandler(os.path.join('/some/path/', name + '.log'), 'w')
    logger.addHandler(handler)
    return logger

log_hm = myLogger('healthmonitor')
log_hm.info("Testing Log") # Should log to /some/path/healthmonitor.log
Run Code Online (Sandbox Code Playgroud)

为了防止创建重复的处理程序,需要注意确保myLogger(name)只调用一次name.通常这意味着放入myLogger(name)内部

if __name__ == '__main__':
    log_hm = myLogger('healthmonitor')
Run Code Online (Sandbox Code Playgroud)

的主要脚本.

  • 这种方法有一个问题。当使用相同名称多次调用时,它会添加重复的处理程序。并且打开文件是写模式将清除较早的数据。 (2认同)

mg.*_*mg. 8

import os
import logging

class MyFileHandler(object):

    def __init__(self, dir, logger, handlerFactory, **kw):
        kw['filename'] = os.path.join(dir, logger.name)
        self._handler = handlerFactory(**kw)

    def __getattr__(self, n):
        if hasattr(self._handler, n):
            return getattr(self._handler, n)
        raise AttributeError, n

logger = logging.getLogger('test')
logger.setLevel(logging.INFO)
handler = MyFileHandler(os.curdir, logger, logging.FileHandler)
logger.addHandler(handler)
logger.info('hello mylogger')
Run Code Online (Sandbox Code Playgroud)