Ведение журнала Python не получает желаемый класс вызывающего абонента и номер строкиPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Ведение журнала Python не получает желаемый класс вызывающего абонента и номер строки

Сообщение Anonymous »

У меня есть оболочка класса Python для функции ведения журнала.
Моя проблема с этими решениями — параметры ведения журнала "

Код: Выделить всё

%(asctime)s:[%(filename)s->%(funcName)s():%(lineno)s] %(levelname)s>> %(message)s
" не будет ссылаться на исходный вызывающий метод "write".
Пример того, о чем я говорю, если у меня есть класс "Foo" в файле foo. пы:

Код: Выделить всё

class Foo:
def bar():
print("example")
и я вызываю его в файле mainTest.py:

Код: Выделить всё

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
Хотя это технически правильно, я хотел бы знать класс и функцию, в которой произошла печать Foo.bar.
Здесь это класс регистратора в 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»