Моя проблема с этими решениями — параметры ведения журнала "
Код: Выделить всё
%(asctime)s:[%(filename)s->%(funcName)s():%(lineno)s] %(levelname)s>> %(message)s
Пример того, о чем я говорю, если у меня есть класс "Foo" в файле foo. пы:
Код: Выделить всё
class Foo:
def bar():
print("example")
Код: Выделить всё
from foo import Foo
from logger import Logger
logger = Logger()
a = Foo()
a.bar()
Код: Выделить всё
2024-11-05 12:02:15,994:[logger.py->write():39] INFO>> example
Здесь это класс регистратора в logger.py:
Код: Выделить всё
import logging
import sys
from datetime import datetime
class Logger(object):
"""
Fake file-like stream object that redirects writes to a logger instance.
"""
def __init__(self, log_level=logging.INFO):
month = datetime.today().strftime('%Y-%m')
self.logFile = f'./logs/{month}.log'
self.terminal = sys.stdout
self.log = open(self.logFile, "a")
logger = logging.getLogger(__name__)
logger.handlers = []
fh = logging.FileHandler(filename=self.logFile, mode = 'a')
formatter = logging.Formatter('%(asctime)s:[%(filename)s->%(funcName)s():%(lineno)s] %(levelname)s>> %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)
logger.setLevel("DEBUG")
self.logger = logger
self.log_level = log_level
self.linebuf = ''
sys.stdout = self
def write(self, buf):
self.terminal.write(buf)
temp_linebuf = self.linebuf + buf
self.linebuf = ''
for line in temp_linebuf.splitlines(True):
if line[-1] == '\n':
self.logger.log(self.log_level, line.rstrip())
else:
self.linebuf += line
def flush(self):
if self.linebuf != '':
self.logger.log(self.log_level, self.linebuf.rstrip())
self.linebuf = ''
Код: Выделить всё
2024-11-05 12:02:15,994:[foo.py->Foo.bar():4] INFO>> example
Как мне получить правильное имя функции и класса и номер строки?
Подробнее здесь: https://stackoverflow.com/questions/791 ... ine-number