Python logger динамическое имя файла - PullRequest
7 голосов
/ 02 мая 2010

Я хочу настроить свой регистратор 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

Я хочу сохранить его универсальным и не хочу жестко кодировать все виды имен регистраторов, которые я могу иметь. Это возможно?

Ответы [ 3 ]

16 голосов
/ 02 мая 2010

Как насчет просто обернуть код обработчика в функцию:

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

Чтобы предотвратить создание дублирующих обработчиков, необходимо позаботиться о том, чтобы myLogger(name) вызывался только один раз за name. Обычно это означает помещать myLogger(name) внутрь

if __name__ == '__main__':
    log_hm = myLogger('healthmonitor')

основного скрипта.

8 голосов
/ 03 мая 2010
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')
0 голосов
/ 12 сентября 2017

Подход, использованный в приведенном выше решении, является правильным, но при этом возникает проблема добавления дублирующих обработчиков при вызове более одного раза. Вот улучшенная версия.

import os
def getLogger(name):
    # logger.getLogger returns the cached logger when called multiple times
    # logger.Logger created a new one every time and that avoids adding
    # duplicate handlers 
    logger = logging.Logger(name)
    logger.setLevel(logging.DEBUG)
    handler = logging.FileHandler(os.path.join('/some/path/', name + '.log'), 'a')
    logger.addHandler(handler)
    return logger

def test(i):
  log_hm = getLogger('healthmonitor')
  log_hm.info("Testing Log %s", i) # Should log to /some/path/healthmonitor.log

test(1)
test(2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...