Логгер для разных модулей в отдельных файлах - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь иметь отдельный файл журнала для каждого модуля.

Для этого я реализовал файл журнала, который позволяет мне создавать другой файл журнала:

import logging
import logging.handlers
import zipfile
import codecs
import os
import time
import glob
from logging.config import dictConfig

msg_format = '%(levelname)s:%(name)s: (%(lineno)d: %(filename)s): (%(asctime)s);  %(message)s'




class TimedCompressedRotatingFileHandler(logging.handlers.TimedRotatingFileHandler):

    def doRollover(self):


        self.stream.close()

        t = self.rolloverAt - self.interval
        timeTuple = time.localtime(t)
        dfn = self.baseFilename + "." + time.strftime(self.suffix, timeTuple)
        if os.path.exists(dfn):
            os.remove(dfn)
        os.rename(self.baseFilename, dfn)
        if self.backupCount > 0:
            s = glob.glob(self.baseFilename + ".20*")
            if len(s) > self.backupCount:
                s.sort()
                os.remove(s[0])
        if self.encoding:
            self.stream = codecs.open(self.baseFilename, 'w', self.encoding)
        else:
            self.stream = open(self.baseFilename, 'w')
        self.rolloverAt = self.rolloverAt + self.interval
        if os.path.exists(dfn + ".zip"):
            os.remove(dfn + ".zip")
        file = zipfile.ZipFile(dfn + ".zip", "w")
        file.write(dfn, os.path.basename(dfn), zipfile.ZIP_DEFLATED)
        file.close()
        os.remove(dfn)


def init_logger(logger_name='app', level=logging.INFO):

    logging_config = dict(
        version=1,
        formatters={
            'f': {
                'format': msg_format,
                'datefmt': '%Y-%m-%d %H:%M:%S'
            }
        },
        handlers={

            'stream': {
                'class': 'logging.StreamHandler',
                'formatter': 'f',
                'level': logging.DEBUG
            }


        },
        root={
            'handlers': ['stream'],
            'level': logging.DEBUG,
        },
    )    
    init_logging_dir()

    dictConfig(logging_config)
    logHandler = TimedCompressedRotatingFileHandler(get_log_file(logger_name), when="MIDNIGHT",
        interval=1, backupCount=10) # Total of 10 rotated log files, rotating every 24] hours
    formatter = logging.Formatter(msg_format)
    logHandler.setFormatter(formatter)
    if logger_name == 'app':
        logger_object = logging.getLogger()
    else:
        logger_object = logging.getLogger(logger_name)

    logger_object.addHandler(logHandler)
    logger_object.setLevel(level)

    logger_object.info("Logger initialized successfully!")
    return  logger_object


def init_logging_dir():
    """

    :return:
    """

    log_dir = 'logs'
    if not os.path.exists(log_dir):
        os.makedirs(log_dir)


def get_log_file(logger_name):
    """

    :return:
    """
    log_dir = 'logs'
    return os.path.join(log_dir, logger_name+'.log')

Из start.py файл Я пытаюсь создать объект регистратора, вызвав метод init_logger().

import logging
from logger import init_logger
init_logger().info('test')
init_logger(logger_name='employee').info('test')


logging.getLogger().info('Test1')
logging.getLogger('employee).info('Test1')

Вывод:

app.log

INFO:root: (86: logger.py): (2020-04-21 14:56:34,362);  Logger initialized successfully!
INFO:root: (6: start.py): (2020-04-21 14:56:34,362);  test

employee.log

INFO:employee: (86: logger.py): (2020-04-21 14:56:34,363);  Logger initialized successfully!
INFO:employee: (7: start.py): (2020-04-21 14:56:34,364);  test
INFO:employee: (11: start.py): (2020-04-21 14:56:34,364);  Test1

Здесь в app.log 'Test1' не печатается с использованием root logger (logging.getLogger().info('Test1'))

Я что-то упустил в logger.py. если нет, то почему он так себя ведет.

...