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

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

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?

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

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

DeepSpace 24.06.2024 22:20

В Python есть модуль журналирования, документацию можно посмотреть здесь: docs.python.org/3/library/logging.html

iBeMeltin 24.06.2024 22:21

@iBeMeltin ОП явно знает об этом модуле

DeepSpace 24.06.2024 22:22

@DeepSpace, ах, я даже не осознавал, что он упомянул об этом в вопросе

iBeMeltin 24.06.2024 22:23

@DeepSpace «обычный регистратор» настроен (уровни, фильтр и т. д.) для регистрации только в Splunk, и я не хочу менять что-то, что может иметь глобальные последствия для регистратора.

David542 24.06.2024 22:28

@David542 David542 Создайте новый регистратор внутри функции def f(): ... new_logger = logging. ... с (скорее всего) собственными обработчиками.

DeepSpace 24.06.2024 22:31
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
6
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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')

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

David542 24.06.2024 22:49

@David542 David542 Этого не должно быть, если все сделано правильно, возможно, добавьте минимальный воспроизводимый пример. Вы уверены, что передаете logging.getLogger другую строку?

DeepSpace 24.06.2024 22:53

спасибо, с уникальной текстовой строкой все сработало.

David542 24.06.2024 23:12

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

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

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

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

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


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

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

Другие вопросы по теме

Регистратор Serilog, использующий var logger, ничего не выводит ни на консоль, ни в файл
Невозможно использовать дополнительный атрибут с помощью специального средства форматирования в Python с модулем ведения журнала
Azure WebApp LogStream отображает один и тот же журнал несколько раз и отображает все журналы как [ОШИБКА], даже если они имеют уровень [INFO]
Как я могу получить полные журналы усеченной строки base64 из Xcode?
Как удалить дублирование исправлений логгера loguru в pytest
Запись в файл завершается сбоем в средстве журнала пакетов R, если вызывается изнутри функции
Как отправлять структурированные журналы в стек ELK с настраиваемыми полями с помощью ведения журнала Python?
Окно журнала .net MAUI с несколькими текстовыми выводами
Написание сценария оболочки для извлечения журналов в указанную временную метку
Как запретить сторонним библиотекам настраивать ведение журнала