Динамическое имя файла журнала Python

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

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

  • py2exe: уменьшить размер архива библиотеки
  • Как получить текущий путь интерпретатора Python из сценария Python?
  • Руководство по использованию Concurrent.futures - простой пример использования потоков и обработки
  • Не удается перенаправить вывод, когда я запускаю скрипт Python в Windows, используя только имя скрипта
  • matplotlib autoscale (ось = 'y') после участка нарезки с помощью set_xlim ()
  • Проверьте, использует ли функция @classmethod
  • Python - эффективный способ добавления строк в dataframe
  • Правильная схема данных NoSQL для веб-галереи фотографий
  • 3 Solutions collect form web for “Динамическое имя файла журнала Python”

     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') 

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

     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 

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

     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) 
    Python - лучший язык программирования в мире.