Регистрация Python через несколько файлов - PullRequest
6 голосов
/ 09 января 2010

Я прочитал документацию модуля логирования, и, хотя я, возможно, упустил что-то очевидное, код, который я получил, не работает должным образом. Я использую Python 2.6.4.

Моя программа состоит из нескольких различных файлов Python, из которых я хочу отправить сообщения регистрации в текстовый файл и, возможно, на экран. Я думаю, что это обычное дело, поэтому я что-то напутал.

То, что делает мой код в данный момент, правильно записывает текстовый файл. Но запись на экран дублируется: одна с указанным форматированием, а другая без. Кроме того, когда я отключаю вывод на экран, я по-прежнему печатаю один раз текст, который мне не нужен - я просто хочу, чтобы он был записан в файл.

В любом случае, некоторый код:

#logger.py
import logging
from logging.handlers import RotatingFileHandler
import os

def setup_logging(logdir=None, scrnlog=True, txtlog=True, loglevel=logging.DEBUG):        
    logdir = os.path.abspath(logdir)

    if not os.path.exists(logdir):
        os.mkdir(logdir)

    log = logging.getLogger('stumbler')
    log.setLevel(loglevel)

    log_formatter = logging.Formatter("%(asctime)s - %(levelname)s :: %(message)s")

    if txtlog:
        txt_handler = RotatingFileHandler(os.path.join(logdir, "Stumbler.log"), backupCount=5)
        txt_handler.doRollover()
        txt_handler.setFormatter(log_formatter)
        log.addHandler(txt_handler)
        log.info("Logger initialised.")

    if scrnlog:
        console_handler = logging.StreamHandler()
        console_handler.setFormatter(log_formatter)
        log.addHandler(console_handler)

Ничего необычного там нет.

#core.py
import logging
corelog = logging.getLogger('stumbler.core')  # From what I understand of the docs, this should work :/

class Stumbler:
    [...]

    corelog.debug("Messages and rainbows...")

Вывод на экран показывает, как это дублируется:

2010-01-08 22:57:07,587 - DEBUG :: SCANZIP: Checking zip contents, file: testscandir/testdir1/music.mp3
DEBUG:stumbler.core:SCANZIP: Checking zip contents, file: testscandir/testdir1/music.mp3
2010-01-08 22:57:07,587 - DEBUG :: SCANZIP: Checking zip contents, file: testscandir/testdir2/subdir/executable.exe
DEBUG:stumbler.core:SCANZIP: Checking zip contents, file: testscandir/testdir2/subdir/executable.exe

Несмотря на то, что текстовый файл получает правильно отформатированный вывод, при отключении экрана при выходе из системы в logger.py по-прежнему отображается неправильно отформатированный вывод.

Из того, что я понимаю о документах, вызывая corelog.debug (), видя, что corelog является дочерним по отношению к регистратору "stumbler", он должен использовать это форматирование и выводить журналы как таковые.

Извиняюсь за сочинение по поводу такой тривиальной проблемы.

TL; DR: Как вести запись из нескольких файлов?

1 Ответ

12 голосов
/ 09 января 2010

Вы уверены, что никакие другие настройки ведения журналов не выполняются во всех импортируемых вами файлах?

Неправильный вывод в журналах консоли выглядит как конфигурация по умолчанию для регистратора, так что что-то еще может настраивать это.

Запуск этого скрипта быстрого теста:

import logging
from logging.handlers import RotatingFileHandler
import os

def setup_logging(logdir=None, scrnlog=True, txtlog=True, loglevel=logging.DEBUG):
    logdir = os.path.abspath(logdir)

    if not os.path.exists(logdir):
        os.mkdir(logdir)

    log = logging.getLogger('stumbler')
    log.setLevel(loglevel)

    log_formatter = logging.Formatter("%(asctime)s - %(levelname)s :: %(message)s")

    if txtlog:
        txt_handler = RotatingFileHandler(os.path.join(logdir, "Stumbler.log"), backupCount=5)
        txt_handler.doRollover()
        txt_handler.setFormatter(log_formatter)
        log.addHandler(txt_handler)
        log.info("Logger initialised.")

    if scrnlog:
        console_handler = logging.StreamHandler()
        console_handler.setFormatter(log_formatter)
        log.addHandler(console_handler)



setup_logging('/tmp/logs')
corelog = logging.getLogger('stumbler.core')
corelog.debug("Messages and rainbows...")

дает такой результат:

2010-01-08 15: 39: 25,335 - ОТЛАДКА :: Сообщения и радуги ...

и в моем /tmp/logs/Stumbler.log

2010-01-08 15: 39: 25,335 - ИНФОРМАЦИЯ :: Логгер инициализирован. 2010-01-08 15: 39: 25,335 - DEBUG :: Сообщения и радуг ...

Это сработало, как и ожидалось, когда я запустил его в Python 2.4, 2.5 и 2.6.4

...