Сохранение журнала DEBUG и отображение только журнала INFO Python - PullRequest
1 голос
/ 28 апреля 2020

Я хотел бы сохранить в superwrapper.log все строки журнала, но только показать в консоли информацию. Если я удаляю # строки имени файла, файл окей, но я ничего не вижу в консоли.

if __name__ == '__main__':

    logging.basicConfig(
        #filename='superwrapper.log',
        level=logging.DEBUG,
        format='%(asctime)s.%(msecs)03d %(levelname)s %(module)s - %(funcName)s: %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'
    )

2020-04-28 11:41:09.698 INFO common - handle_elasticsearch: Elastic connection detected
2020-04-28 11:41:09.699 INFO superwrapper - <module>: Cookies Loaded: |TRUE|
2020-04-28 11:41:09.715 DEBUG connectionpool - _new_conn: Starting new HTTPS connection (1): m.facebook.com:443

Ответы [ 2 ]

2 голосов
/ 28 апреля 2020

Вы можете использовать несколько обработчиков. logging.basicConfig может принять handlers в качестве аргумента, начиная с Python 3.3. Один необходим для входа в файл журнала, а другой - на консоль. Вы также можете настроить обработчики на разные уровни ведения журнала. Самый простой способ, который я могу придумать, - это сделать:

import logging
import sys

file_handler = logging.FileHandler('superwrapper.log')
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(logging.INFO)

logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s.%(msecs)03d %(levelname)s %(module)s - %(funcName)s: %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S',
    handlers=[
        file_handler,
        console_handler
    ]
)

Одна вещь, на которую стоит обратить внимание, это запись StreamHandler в strerr. Обычно вы хотите переопределить это с sys.stdout

0 голосов
/ 28 апреля 2020

Вы можете настроить несколько регистраторов. Это избавит от сообщений DEBUG, но имейте в виду, что сообщения более высокой важности будут по-прежнему передаваться (например, «ПРЕДУПРЕЖДЕНИЕ» и «ОШИБКА»).

Этот точный сценарий содержится в журнальной поваренной книге из Python документов:

import logging

# set up logging to file - see previous section for more details
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    datefmt='%m-%d %H:%M',
                    filename='/temp/myapp.log',
                    filemode='w')
# define a Handler which writes INFO messages or higher to the sys.stderr
console = logging.StreamHandler()
console.setLevel(logging.INFO)
# set a format which is simpler for console use
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
# tell the handler to use this format
console.setFormatter(formatter)
# add the handler to the root logger
logging.getLogger('').addHandler(console)

# Now, we can log to the root logger, or any other logger. First the root...
logging.info('Jackdaws love my big sphinx of quartz.')

# Now, define a couple of other loggers which might represent areas in your
# application:

logger1 = logging.getLogger('myapp.area1')
logger2 = logging.getLogger('myapp.area2')

logger1.debug('Quick zephyrs blow, vexing daft Jim.')
logger1.info('How quickly daft jumping zebras vex.')
logger2.warning('Jail zesty vixen who grabbed pay from quack.')
logger2.error('The five boxing wizards jump quickly.')

В примере, приведенном в кулинарной книге, вы должны увидеть в консоли все сообщения «INFO», «WARNING» и «ERROR», но только файл журнала будет содержать сообщение «DEBUG».

...