Как настроить поведение Python Logger? - PullRequest
0 голосов
/ 17 декабря 2018

Я реализовал custom_logger, который использует мои другие классы Python.

import logging, sys

logging.basicConfig(format='%(asctime)s,%(msecs)d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s',
    datefmt='%d-%m-%Y:%H:%M:%S',

logger = logging.getLogger()

Я собираюсь использовать его следующим образом:

import custom_logger as cl
cl.logger.debug('Extracting locations and descriptors from %s' % image_path)

Я запускаю свои файлы Pythonиз сценария, в котором я пытаюсь перенаправить запись в разные файлы для sout и serr

nohup python3  "$CLASSPATH""$MAIN_CLASS" $MAIN_CLASS_ARGUMENT 1>>$SOUT_FILE 2>>$SERR_FILE & echo $! > $PID_FILE

При текущей настройке я получаю каждый журнал в файле .err

17-12-2018: 17: 56: 59,203 INFO [conn.py:1008] Установить конфигурацию api_version = (0, 11, 0), чтобы пропустить автоматические запросы check_version при запуске 17-12-2018: 17: 56:59,206 INFO [subscription_state.py:172] Обновление подписанных тем на: ('PROCESSED_SCENES',) 17-12-2018: 17: 56: 59,209 INFO [cluster.py:342] Координатором группы для my_group является BrokerMetadata (nodeId = 0,host = '172.1.1.3', port = 9094, rack = None)

Я попытался настроить регистратор для вывода ошибки в каждом файле, но безуспешно:

import logging, sys

class StdErrFilter(logging.Filter):
    def filter(self, rec):
        return rec.levelno in (logging.ERROR, logging.WARNING)

class StdOutFilter(logging.Filter):
    def filter(self, rec):
        return rec.levelno in (logging.DEBUG, logging.INFO)

logging.basicConfig(format='%(asctime)s,%(msecs)d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s',
    datefmt='%d-%m-%Y:%H:%M:%S',
    level=logging.INFO)

formatter = logging.Formatter('%(asctime)s,%(msecs)d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s','%d-%m-%Y:%H:%M:%S')

logger = logging.getLogger()


h1 = logging.StreamHandler(sys.stdout)
h1.setFormatter(formatter)
h1.addFilter(StdOutFilter())
logger.addHandler(h1)

h2 = logging.StreamHandler(sys.stderr)
h2.setFormatter(formatter)
h2.addFilter(StdErrFilter())
logger.addHandler(h2)

Все, что я сейчас получаю, - это одинаковый вывод в обоих файлах .err .out.

Чего мне не хватает?

1 Ответ

0 голосов
/ 17 декабря 2018

basicConfig настраивает обработчик, поэтому у вас есть h1, h2 и базовое ведение журнала.Может быть, это вызывает путаницу?Также вам нужно сделать logger.setLevel(logging.DEBUG), чтобы регистратор вообще обработал уровень отладки.

Удаление basicConfig и добавление setLevel, кажется, работает как задумано:

import logging, sys

class StdErrFilter(logging.Filter):
    def filter(self, rec):
        return rec.levelno in (logging.ERROR, logging.WARNING)

class StdOutFilter(logging.Filter):
    def filter(self, rec):
        return rec.levelno in (logging.DEBUG, logging.INFO)

formatter = logging.Formatter('%(asctime)s,%(msecs)d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s','%d-%m-%Y:%H:%M:%S')
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

h1 = logging.StreamHandler(sys.stdout)
h1.setFormatter(formatter)
h1.addFilter(StdOutFilter())
logger.addHandler(h1)

h2 = logging.StreamHandler(sys.stderr)
h2.setFormatter(formatter)
h2.addFilter(StdErrFilter())
logger.addHandler(h2)

logger.info('stdout log')
logger.error('stderr log')
...