У кого-нибудь есть работающие WatchedFileHandler и StreamHandler, которые настроены для работы с логи Python? - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь настроить обработчик журналирования, который отправляет сообщения не только на экран, но и в зарегистрированный файл.Так как это работает управляемый событиями симулятор с 3 отдельными программами, я хотел настроить WatchedFileHandler.В попытке предоставить минимальный рабочий набор, вот установка dictConfig:

# this is the sub_test.py logger setup
import os
import logging, logging.handlers, logging.config

def setup_logging(name, fname, args, mode='a', idtag=""):
  log_file = os.path.splitext(fname)[0]+".log"

  level = 'ERROR'
  if any(x in ["-v","--verbose"] for x in args):
    level = 'INFO'
  if any(x in ["-d","--debug"] for x in args):
    level = 'DEBUG'

  conf = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'default': {'format':name+' (default): %(levelname)s - %(message)s',
                    'datefmt':'%Y-%m-%d %H:%M:%S'},
        'SH': {'format':name+' ('+idtag+'SH): %(levelname)s - %(message)s',
                   'datefmt':'%Y-%m-%d %H:%M:%S'},
        'FH': {'format':name+' ('+idtag+'FH): %(levelname)s - %(message)s',
                   'datefmt':'%Y-%m-%d %H:%M:%S'},
    },
    'handlers': {
        'console': {
            'level': level,
            'class': 'logging.StreamHandler',
            'formatter': 'SH',
            'stream': 'ext://sys.stdout'
        },
        'file': {
            'level': 'DEBUG',
            'class': 'logging.handlers.WatchedFileHandler',
            'formatter': 'FH',
            'filename': log_file,
            'mode': mode,
            # more?
        },
    },
    'loggers': {
        '': { # the root logger
            'level': level,
            'handlers': ['console'],
            'propegate': False
        },
        name: {
            'level': 'DEBUG',
            'handlers': ['file'],
            'propegate': True
        },
    },
    #'propagate': True
  }

  logging.config.dictConfig(conf)
  logger = logging.getLogger(name)

  return logger

с простой сервисной программой "sub_srv.py":

#!/usr/bin/env python3
# a simple service example with some logging.
import sub_test
from time import sleep
import logging

LOG_NAME="test_log"

logger = sub_test.setup_logging(LOG_NAME, "test.log", ["-d"], mode='a', idtag="srv:")

logger.debug(" inside of the server")

sleep(1)

exit(1)

и простой тестовой программойзапусти его:

from subprocess import Popen, PIPE
import sys
import sub_test
from time import sleep
import logging

LOG_NAME="test_log"

logger = sub_test.setup_logging(LOG_NAME, "test.log", sys.argv, mode='w', idtag="main:")

logger.info("here we go")

r = Popen("./sub_srv.py")

while True:
    if r.poll():
        break
    print("ok...")
    sleep(0.5)

logger.info("done...")

logging.shutdown()

Я получаю следующий вывод из StreamHandler:

test_log (main:SH): INFO - here we go
ok...
test_log (srv:SH): DEBUG -  inside of the server
ok...
ok...
test_log (main:SH): INFO - done...

, но я получаю следующий вывод, записанный в файл "test.log":

test_log (main:FH): INFO - here we go
test_log (main:FH): INFO - done...
of the server

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

1 Ответ

0 голосов
/ 25 февраля 2019

Для дальнейшего использования.Я получил это работает.Похоже, что в журналированном WatchedFileHandler есть ошибка (о которой я сообщу).Обходной путь - просто изменить режим 'mode' = mode (где режим подпрограмм = 'w') на 'mode' = 'a' в приведенном выше примере и выполнить os.remove (log_file) в первый раз, чтобы очиститьфайл.

Надеюсь, это полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...