2016-05-24 7 views
4

(Я искал и не нашел дубликата для этого вопроса, но счастлив, что будет доказано иначе).Вращение журнала - python и windows

Мне нужно повернуть журнал из некоторого кода Python. Код работает в Windows (Server 2008 R2).

Первоначально я использовал TimedRotatingFileHandler (из пакета Pogon logging.handlers), но это не работает по мере того, как нам нужно из-за того, что я понимаю, это проблема с многопроцессорной обработкой (subprocess.check_call используется для запуска другого приложения).

Я проверил ConcurrentLogHandler, который выглядит так, как будто он может выполнить эту работу, но я немного обеспокоен тем, что он не обновлялся с 2013 года (хотя проблемы были подняты совсем недавно).

UPDATE: a open bug (с 2013 года) указывает, что ConcurrentLogHandler не работает с Python 2.7/Windows. При регистрации, код просто зависает.

Есть ли наилучшая практика Windows Решение Я должен использовать?

+0

Похоже, что ошибка, о которой вы говорите, относится к стороннему пакету, а не к одному, который входит в состав Python. –

+1

Я нашел человека, который использует сервер регистрации, чтобы заставить его работать: https: //www.huyng .com/posts/python-logging-from-multiple-процессы –

+1

Это также может быть полезно - http://plumberjack.blogspot.com/2010/09/using-logging-with-multiprocessing.html –

ответ

0

Может быть, я что-то не хватает, но при этом модуль регистрации питона поставляется с RotatingFileHandler:

import logging 
import time 

from logging.handlers import RotatingFileHandler 

#---------------------------------------------------------------------- 
def create_rotating_log(path): 
    """ 
    Creates a rotating log 
    """ 
    logger = logging.getLogger("Rotating Log") 
    logger.setLevel(logging.INFO) 

    # add a rotating handler 
    handler = RotatingFileHandler(path, maxBytes=20, 
            backupCount=5) 
    logger.addHandler(handler) 

    for i in range(10): 
     logger.info("This is test log line %s" % i) 
     time.sleep(1.5) 

#---------------------------------------------------------------------- 
if __name__ == "__main__": 
    log_file = r"c:\path\to\test.log" 
    create_rotating_log(log_file) 

Это работало отлично для меня с Python 2.7 на Windows 7. Вот несколько ссылок, которые идут более подробно :

+0

Да - это (и TimedRotatingFileHandler, который я использовал в качестве первоначального требования для журналов, чтобы перекатываться каждый день) работает абсолютно нормально, пока вы не запустите несколько процессов в микс. Аналогичная проблема была зарегистрирована как ошибка (впоследствии закрытая как не ошибка) в 2008 году (https://bugs.python.org/issue4749). В моем случае мой дополнительный процесс не пытается записать в журнал, но мы видим такое же поведение. Я уточню свой вопрос, чтобы прояснить этот момент! – azp74

0

ОК - это то, что я закончил делать.

Поскольку в отношении ведения журнала есть только многопоточность (дополнительный процесс не записывается в мой журнал), я закончил работу с этим. Я не в восторге от этого подхода - создайте объект блокировки потоковой передачи, закройте регистрацию (logging.shutdown - не волнуйтесь об этом, так как doco говорит, чтобы вызвать его при выходе из программы ...), переместите файл & запустите снова регистрироваться. Затем отпустите замок.

Это все в блоке try/except, так что если что-то пойдет не так, замок будет выпущен.

Тестирование указывает, что это делает то, что требуется.

Имеет ли вызовы logging.shutdown в таком виде контекста какие-то последствия, о которых я не знаю ?!