Nano Hash - криптовалюты, майнинг, программирование

Запутался при использовании модуля ведения журнала Python

Я хочу войти в 2 разных файла, но разные вещи.

Я пытался это:

runid = str(uuid.uuid1())
logger = logging.getLogger('logger1')
other_logger = logging.getLogger('logger2')

logger.setLevel(logging.DEBUG)

debug_handler = logging.FileHandler('log/debug.log')
info_handler = logging.FileHandler('log/info.log')
other_handler = logging.FileHandler('log/other_info.log')

debug_handler.setLevel(logging.DEBUG)
info_handler.setLevel(logging.INFO)
other_handler.setLevel(logging.INFO)

formatter = logging.Formatter(runid + ' - %(asctime)s - %(levelname)s - %(funcName)s - %(message)s')
debug_handler.setFormatter(formatter)
info_handler.setFormatter(formatter)
other_handler.setFormatter(formatter)

logger.addHandler(debug_handler)
logger.addHandler(info_handler)
other_logger.addHandler(other_handler)

logger.info('message1')
other_logger.info('message2')

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

Согласно документу:

«Логгеры имеют следующие атрибуты и методы. Обратите внимание, что регистраторы никогда не создаются напрямую, а всегда через функцию уровня модуля logging.getLogger(name). Многократные вызовы getLogger() с одним и тем же именем всегда будут возвращать ссылку на один и тот же Объект регистратора."

Но родительский объект всегда один и тот же, как в этом небольшом тесте:

import logging

log1 = logging.getLogger('hey')
log2 = logging.getLogger('you')

print log1.parent, log2.parent

enrique@enrique-mbp:$ python /tmp/test.py 
<logging.RootLogger object at 0x26f0810> <logging.RootLogger object at 0x26f0810>

Как я могу это решить?


  • Этот код отлично работает для меня - я вижу только message1 в файлах logger и только message2 в файлах other_logger. Что касается одних и тех же родителей в hey и you, это правильное поведение; как показано, общий родитель — это просто корневой регистратор. Однако отдельные регистраторы действительно будут отличаться. 12.08.2015
  • Кажется, это опечатка для setLevel (other_handler.set_name(logging.INFO)), но ее исправление обеспечивает ожидаемое поведение. 12.08.2015
  • @santon: ты проверял это? Без изменений, которые я упомянул в своем ответе ниже, код не работает должным образом. 12.08.2015
  • @jakegriffin: Да, я сделал те изменения, которые вы упомянули в своем ответе. Но эти изменения на самом деле не влияют на проблему, указанную в вопросе, а именно на то, что сообщения передаются обоим регистраторам. 12.08.2015
  • @santon: Да, я полагаю, это правда. Кажется, что многие вопросы на этом сайте имеют другую проблему, чем ожидает спрашивающий ... вот почему они должны задавать. Я просто не стал бы утверждать, что код работает просто отлично, не упомянув о том, что вам нужно было его настроить. 12.08.2015

Ответы:


1

Проблема здесь:

logger.setLevel(logging.DEBUG)

Вам также необходимо установить уровень для other_logger:

logger.setLevel(logging.DEBUG)
other_logger.setLevel(logging.DEBUG) # or INFO because that is the lowest level being used by a handler

Без этого other_logger остается на уровне ведения журнала по умолчанию, logging.WARNING, что не позволяет строке other_logger.info('message2') что-либо регистрировать.

11.08.2015
Новые материалы

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

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..