Запис у два файли з різними налаштуваннями


84

Я вже використовую базовий конфігураційний журнал, де всі повідомлення в усіх модулях зберігаються в одному файлі. Однак мені зараз потрібно більш складне рішення:

  • Два файли: перший залишається незмінним.
  • Другий файл повинен мати певний власний формат.

Я читав документи для модуля, але вони на даний момент для мене дуже складні. Лісоруби, обробники ...

Отже, коротко:

Як увійти до двох файлів у Python 3, тобто:

import logging
# ...
logging.file1.info('Write this to file 1')
logging.file2.info('Write this to file 2')

Відповіді:


155

Ви можете зробити щось подібне:

import logging
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')


def setup_logger(name, log_file, level=logging.INFO):
    """To setup as many loggers as you want"""

    handler = logging.FileHandler(log_file)        
    handler.setFormatter(formatter)

    logger = logging.getLogger(name)
    logger.setLevel(level)
    logger.addHandler(handler)

    return logger

# first file logger
logger = setup_logger('first_logger', 'first_logfile.log')
logger.info('This is just info message')

# second file logger
super_logger = setup_logger('second_logger', 'second_logfile.log')
super_logger.error('This is an error message')

def another_method():
   # using logger defined above also works here
   logger.info('Inside method')

1
Типовим рівнем журналу є logging.WARNING, тому було б зрозуміліше, якщо Logger.setLevel(logging.WARNING)його викликати.
zeekvfu

1
Чому мій logger_1файл не виводиться у файл журналу? Я встановив logger_1.error('error foo'), але все ще не працюю
Gank

Поєднуючи коментар від @zeekvfu та запитання від @Gank ... Якщо ви хочете побачити logger_1.info('message_1')рядок simplefile_1.log, вам потрібно або встановити рівень, INFOвикористовуючи logger_1.setLevel(logging.INFO), або використовувати logger_1.error('message_1')замість цього. INFOПовідомлення , мабуть , не потрібно реєструватися , коли рівень WARNING, який за замовчуванням.
dnlbrky

відредагував відповідь. Встановіть для logger_1.info значення logger_1.warning. Таким чином, рівень не потрібно встановлювати.
user1812076

1
@ eos87 Чи є logger_1 та logger_2 глобальними? Тобто, я можу використовувати їх всередині будь-якої функції? якщо ні, то хороша ідея зробити їх глобальними в основній функції def? якщо так, то як би ви це зробили?
Днайель

19
def setup_logger(logger_name, log_file, level=logging.INFO):
    l = logging.getLogger(logger_name)
    formatter = logging.Formatter('%(message)s')
    fileHandler = logging.FileHandler(log_file, mode='w')
    fileHandler.setFormatter(formatter)
    streamHandler = logging.StreamHandler()
    streamHandler.setFormatter(formatter)

    l.setLevel(level)
    l.addHandler(fileHandler)
    l.addHandler(streamHandler)    


setup_logger('log1', txtName+"txt")
setup_logger('log2', txtName+"small.txt")
logger_1 = logging.getLogger('log1')
logger_2 = logging.getLogger('log2')




logger_1.info('111messasage 1')
logger_2.info('222ersaror foo')

1
Чи є logger_1 та logger_2 глобальними? Тобто, я можу використовувати їх всередині будь-якої функції? якщо ні, то хороша ідея зробити їх глобальними в основній функції def? якщо так, то як би ви це зробили?
Днайель

ви б не робили цього в def, ви б робили це скрізь, де б ви не визначали ваші реєстратори.
Алекс Р

1
Чи не спричинить це дубльовані виходи консолі?
Ерол
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.