Мне нужно отладить некоторый устаревший код, и я хочу только напечатать некоторую информацию в файле, который не будет мешать другим местам в базе кода. Самый грубый способ, который я нашел до сих пор, это что-то вроде:
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 есть модуль журналирования, документацию можно посмотреть здесь: docs.python.org/3/library/logging.html
@iBeMeltin ОП явно знает об этом модуле
@DeepSpace, ах, я даже не осознавал, что он упомянул об этом в вопросе
@DeepSpace «обычный регистратор» настроен (уровни, фильтр и т. д.) для регистрации только в Splunk, и я не хочу менять что-то, что может иметь глобальные последствия для регистратора.
@David542 David542 Создайте новый регистратор внутри функции def f(): ... new_logger = logging. ...
с (скорее всего) собственными обработчиками.
Создать локальный логгер можно с помощью того же модуля 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')
спасибо, хотя когда я пытаюсь использовать этот подход, это в конечном итоге меняет ситуацию глобально. Например, когда я устанавливаю уровень в регистраторе, он передается в мой глобальный регистратор...
@David542 David542 Этого не должно быть, если все сделано правильно, возможно, добавьте минимальный воспроизводимый пример. Вы уверены, что передаете logging.getLogger
другую строку?
спасибо, с уникальной текстовой строкой все сработало.
logger
по-прежнему твой друг. Вы можете настроить его по своему вкусу; Для этого я буду обращаться к практическому руководству по Python.
Одной из частей создания собственного Logger
является настройка Formatter
. Один из таких способов сделать это не представляет особых сложностей:
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
один из примеров.
Сам Formatter
прост. Конструктор имеет три необязательных аргумента: строковый формат, строку формата даты и индикатор стиля.
Formatter
— это место, куда вам следует обратиться, чтобы узнать номера строк и другую информацию, которую вы хотите разместить.
Просто заметка о создании :
Обратите внимание, что экземпляры Loggers НИКОГДА не должны создаваться напрямую, а всегда через функцию уровня модуля logging.getLogger(name). Несколько вызовов getLogger() с одним и тем же именем всегда будут возвращать ссылку на один и тот же объект Logger.
«Каким может быть лучший способ добавить локальный регистратор, чтобы он мог делать то, что может делать обычный регистратор?» Что отличает «обычный» регистратор от «локального» регистратора, кроме того, где он инициализируется, и что мешает вам использовать модуль
logging
внутри функции?