Регистрация в нескольких файлах журналов из разных классов в Python

Я хочу написать класс Python, который использует ведение журнала Python. Этот класс Python будет отвечать за создание файла с заданным именем в функции init.

Я хочу создать объект вышеуказанного класса в двух или более классах и ожидать создания двух или файлов.

Я пробовал писать этот класс, но я не могу создать несколько файлов.

Может ли кто-нибудь вести меня, как мне это сделать?

Я создал следующий класс:

class Logger:
def __init__(self, log_filename = "test.log"):
    if not os.path.exists("LogFiles"):
        os.makedirs("LogFiles")
    self.Logger = logging.getLogger("main")
    logging.basicConfig(level=logging.DEBUG,
                        format='%(asctime)s : %(message)s',
                        filename= log_filename,
                        filemode='w')           # change filemode to 'w' to overwrite file on each run

    consoleHandler = logging.StreamHandler()
    consoleHandler.setLevel(logging.DEBUG)
    formatter = logging.Formatter('%(asctime)s - %(message)s')
    consoleHandler.setFormatter(formatter)
    logging.getLogger('').addHandler(consoleHandler)      # Add to the root logger
    self.Logger.info("Starting new logging sessions")


def writeToFile(self, line):
    if self.Logger.propagate == True:
        self.Logger.debug(line)

def closeFile(self):

    if self.Logger.propagate == True:
        self.Logger.propagate = False

Ответы

Ответ 1

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

Edit:

Я не думаю, что вам нужно написать свой собственный класс Logger. В модуле Python logging есть все, что вам нужно. Вероятно, вам просто нужен метод factory. Ключом к пониманию является создание двух отдельных, полностью независимых объектов каротажа. Вы делаете это с помощью logging.getLogger, и в любое время, когда вы передаете ему другое имя, оно дает вам другой регистратор. Вы можете использовать все, что хотите для имени регистратора. Конечно, вы хотите держаться подальше от basicConfig за то, что вы делаете. Это было просто для людей, которые просто хотят, чтобы один Logger не делал ничего особенного.

Я думаю, что это демонстрирует функциональность, которой вы пользуетесь. Ключ состоит в создании двух разных регистраторов с разными обработчиками. Затем используйте их отдельно. Имейте в виду, что мой второй вызов logging.getLogger не создает новый журнал; он получает тот, который мы первоначально установили в setup_logger.

log_test.py:

from __future__ import absolute_import

import logging

def setup_logger(logger_name, log_file, level=logging.INFO):
    l = logging.getLogger(logger_name)
    formatter = logging.Formatter('%(asctime)s : %(message)s')
    fileHandler = logging.FileHandler(log_file, mode='w')
    fileHandler.setFormatter(formatter)
    streamHandler = logging.StreamHandler()
    streamHandler.setFormatter(formatter)

    l.setLevel(level)
    l.addHandler(fileHandler)
    l.addHandler(streamHandler)    

def main():
    setup_logger('log1', r'C:\temp\log1.log')
    setup_logger('log2', r'C:\temp\log2.log')
    log1 = logging.getLogger('log1')
    log2 = logging.getLogger('log2')

    log1.info('Info for log 1!')
    log2.info('Info for log 2!')
    log1.error('Oh, no! Something went wrong!')

if '__main__' == __name__:
    main()

Пример прогона:

C:\temp>C:\Python\27\python.exe logtest.py
2013-06-12 02:00:13,832 : Info for log 1!
2013-06-12 02:00:13,832 : Info for log 2!
2013-06-12 02:00:13,832 : Oh, no! Something went wrong!

log1.log:

2013-06-12 02:00:13,832 : Info for log 1!
2013-06-12 02:00:13,832 : Oh, no! Something went wrong!

log2.log:

2013-06-12 02:00:13,832 : Info for log 2!