#python #logging
#python #ведение журнала
Вопрос:
Редактировать: в итоге я ответил на суть своего вопроса, чтобы у меня мог быть работающий модуль ведения журнала. Тем не менее, у меня все еще есть связанный с этим вопрос. Смотрите мой ответ ниже.
Я пытаюсь реализовать ведение журнала, всегда регистрируясь во временном каталоге любой ОС, в которой я нахожусь. Для этого я написал следующую функцию.
import logging, tempfile, os, sys
def getlog(logname, filename = 'python.log', directory = None):
'''returns a logger with logname that will print to filename and directoryname.'''
if directory == None:
fd, fname = tempfile.mkstemp()
directory = os.path.dirname(fname)
fullpath = directory '/' filename
mylog = logging.getLogger(logname)
hdlr = logging.FileHandler(fullpath)
formatter = logging.Formatter('L:%(name)s M:%(module)s T:%(asctime)s > %(levelname)s: %(message)s')
hdlr.setFormatter(formatter)
mylog.addHandler(hdlr)
mylog.setLevel(logging.INFO)
mylog.info('NEW LOGGER STARTED')
return mylog
if __name__ == '__main__':
log = getlog('testing')
log.info('working?')
log.info('yes, seems to be working')
log2 = getlog('testing')
log2.info('still working?')
Вот результат:
L:testing M:easy_log T:2011-04-11 15:30:14,315 > INFO: NEW LOGGER STARTED
L:testing M:easy_log T:2011-04-11 15:30:14,316 > INFO: working?
L:testing M:easy_log T:2011-04-11 15:30:14,316 > INFO: yes, seems to be working
L:testing M:easy_log T:2011-04-11 15:30:14,316 > INFO: NEW LOGGER STARTED
L:testing M:easy_log T:2011-04-11 15:30:14,316 > INFO: NEW LOGGER STARTED
L:testing M:easy_log T:2011-04-11 15:30:14,316 > INFO: still working?
L:testing M:easy_log T:2011-04-11 15:30:14,316 > INFO: still working?
Как вы можете видеть, теперь он выводит double . Однако модуль ведения журнала довольно запутанный, и я не знаю способа узнать, был ли уже создан экземпляр журнала или у объекта журнала уже есть обработчик. Была бы признательна за некоторую помощь.
Редактировать: чтобы добавить немного больше деталей, я планирую вызвать это в нескольких модулях, по сути пытаясь заменить вызов «logging.getLogger».
Ответ №1:
В итоге я ответил на свой собственный вопрос. Вот код
global IS_SETUP
IS_SETUP = False
def setuplogger(filename = 'python.log', directory = None, format = 'L:%(name)s M:%(module)s T:%(asctime)s > %(levelname)s: %(message)s'):
global IS_SETUP
if directory == None:
fd, fname = tempfile.mkstemp()
directory = os.path.dirname(fname)
logging.basicConfig(filename = directory '/' filename, format = format)
IS_SETUP = True
def getlog(logname, level = logging.INFO):
'''returns a logger with logname that will print to filename and directoryname.'''
if IS_SETUP == False:
setuplogger()
mylog = logging.getLogger(logname)
mylog.setLevel(level)
mylog.info('NEW LOGGER STARTED')
return mylog
Это позволяет избежать двойной конфигурации. Кроме того, по-видимому, базовая конфигурация работала бы, даже если бы она вызывалась несколько раз.
Если кто-нибудь знает, как проверить, какие обработчики есть в объекте журнала, я все равно хотел бы знать. Это кажется абсолютно невозможным.
Комментарии:
1. FWIW вы можете просто получить доступ к «mylog. обработчики» для перебора списка установленных обработчиков