Добавьте «журнал» для одной функции

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

def my_func():
    f = open('/tmp/log.txt', 'a') # help with logging stuff
    f.write('Here is my crude local logger.')
    # some code
    logger.log('Hello') # our 'Normal logger' that goes to Splunk
                        # so I don't think I can modify this 
                        # safely without side-effects?

Однако мне нравятся все «дополнительные» вещи, которые добавляет модуль журналирования, такие как номера строк, время, функции и т. д. Как лучше всего добавить локальный регистратор, чтобы он делал то, что может делать обычный регистратор?

🤔 А знаете ли вы, что...
Python поддерживает множество парадигм программирования, включая процедурное, объектно-ориентированное и функциональное программирование.


55
2

Ответы:

Решено

Создать локальный логгер можно с помощью того же модуля logging:

import logging

def my_func():
    local_logger = logging.getLogger('my_func_logger')
    # set custom handlers on local_logger, maybe even control creation with a function
    # or some env vars

    # some code

    local_logger.log('Hello')

logger по-прежнему твой друг. Вы можете настроить его по своему вкусу; Для этого я буду обращаться к практическому руководству по Python.

Одной из частей создания собственного Logger является настройка Formatter. Один из таких способов сделать это не представляет особых сложностей:

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')один из примеров.

Сам Formatterпрост. Конструктор имеет три необязательных аргумента: строковый формат, строку формата даты и индикатор стиля.

Formatter — это место, куда вам следует обратиться, чтобы узнать номера строк и другую информацию, которую вы хотите разместить.


Просто заметка о создании :

Обратите внимание, что экземпляры Loggers НИКОГДА не должны создаваться напрямую, а всегда через функцию уровня модуля logging.getLogger(name). Несколько вызовов getLogger() с одним и тем же именем всегда будут возвращать ссылку на один и тот же объект Logger.