Ведение журнала на Python: создание журнала, если оно не существует или открыто, и продолжать вести журнал, если он

Я пишу код, который использует систему logging python. Идея состоит в том, что если LOG еще не существует, создайте журнал, но если это произойдет, то получите журнал и возобновите ведение журнала в этом файле. Вот мой код:

import logging
import os

log_filename='Transactions.log')
if os.path.isfile(log_filename)!=True:
    LOG = logging.getLogger('log_filename')
    LOG.setLevel(logging.DEBUG)
    # create file handler which logs even debug messages
    fh = logging.FileHandler('log_filename')
    fh.setLevel(logging.DEBUG)
    # create console handler with a higher log level
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)
    # create formatter and add it to the handlers
    formatter = logging.Formatter('-->%(asctime)s - %(name)s:%(levelname)s - %(message)s')
    fh.setFormatter(formatter)
    ch.setFormatter(formatter)
    # add the handlers to the logger
    LOG.addHandler(fh)
    LOG.addHandler(ch)
else:
    LOG=logging.getLogger()

Я подозреваю, что проблема связана с моим блоком else но я не знаю, как это исправить. Может ли кто-нибудь пролить свет на эту ситуацию.

Ответы

Ответ 1

Модуль журнала FileHandler позаботится об этом для вас. Нет необходимости в сложности.

Обработчик принимает необязательный параметр mode, чтобы указать, начинает ли он записывать или добавлять данные к нему.

Из документов:

class logging.FileHandler(filename, mode='a', encoding=None, delay=False)

Указанный файл открывается и используется как поток для ведения журнала. Если mode не указан, используется 'a'.

Ответ 2

Для тех, кто пытался создать новую структуру каталогов, например, logs/mylogfile.log, как упоминал @mightypile, FileHandler не будет создавать новую структуру каталогов для вас. Я использовал os.makedirs для обеспечения структуры каталогов.

import os
import logging

log_filename = "logs/output.log"
os.makedirs(os.path.dirname(log_filename), exist_ok=True)
file_handler = logging.FileHandler(output_filename, mode="w", encoding=None, delay=False)

Ответ 3

Когда вы запускаете

LOG = logging.getLogger('log_filename')

в первый раз создается глобальная переменная. Следовательно, вы также можете добавить следующий код к приведенному выше скрипту:

global LOG
if LOG is not None:
    print("found logger !")
else:
    ("no global variable logger found")