Я пытаюсь иметь отдельный файл журнала для каждого модуля.
Для этого я реализовал файл журнала, который позволяет мне создавать другой файл журнала:
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. если нет, то почему он так себя ведет.