如何在Python日志记录器中指定调用者文件名

4

我想创建一个基于Python logger库的自定义日志。主要目标是创建一个主日志,可以从应用程序的任何脚本中调用,并将日志数据写入同一日志文件。问题在于,由于记录器嵌入到自定义类中,因此每次调用函数时都会将日志数据写入像从主文件中进行的调用一样。

假设我有以下代码用于自定义日志类:

import os
import logging
from logging import * 
from datetime import *


class omri_logging:

    @staticmethod
    def logcreate (severity = logging.DEBUG, filename =os.path.basename(__file__)):

        today = datetime.today()
        week = today.strftime("%U")
        LogName = 'MainLog' + week + '.log'
        FORMAT = "%(filename)s#%(levelname)s#%(asctime)s#%(funcName)s#%(lineno)d#%(message)s"
        logging.basicConfig(filename=LogName,
                            level=severity,format=FORMAT,
                            )

    @staticmethod
    def CreateError (msg):
        logging.error(msg)
logcreate函数将接收调用它的文件名。如何更改记录器格式化程序以将此文件名作为已记录文件。要获得以下日志示例:

omri_logger.py#DEBUG#2015-02-21 11:48:56,819##63#Error Message >Sent From File

对于现在调用CreateError的文件名是LogCallFile.py,请考虑将日志行更改为:

LogCallFile.py#DEBUG#2015-02-21 11:48:56,819##63#Error Message >Sent From File

3个回答

4

有一个单独的Python文件,比如settings.py,用于保存日志设置,并将其导入到您的项目文件中。

import logging
from logging.handlers import RotatingFileHandler

log_formatter = logging.Formatter('%(asctime)s %(levelname)s %(filename)s(%(lineno)d) %(message)s')
my_handler = RotatingFileHandler(Logfile, mode='a', maxBytes=5*1024*1024,
                                 backupCount=5, encoding=None, delay=0)
my_handler.setFormatter(log_formatter)
my_handler.setLevel(logging.INFO)

在导入settings.py之后,将以下代码应用于您的项目文件中。
app_log = logging.getLogger('root')
app_log.setLevel(logging.INFO)
app_log.addHandler(settings.my_handler)

0
如果您只想包含作为文件名关键字参数传递的字符串,并且不需要更改日志记录参数,则应该能够将文件名关键字参数插入到以下格式的字符串中:

FORMAT = filename +“#%(levelname)s#%(asctime)s#%(funcName)s#%(lineno)d#%(message)s”


是的,谢谢。但我的主要问题是,当我只输入名称时,日志点会为类文件而非实际文件生成行号... - Omri

0

您可以尝试将全局日志配置放在一个文件中,然后在每个特定的脚本中添加一个getLogger(name)调用:

logging.getLogger(name)

其中name可以是写日志的实际文件名。

例如,您也可以像这样检测当前文件名:

name = (inspect.getfile(inspect.currentframe()).split("\\", -1)[-1]).rsplit(".", 1)[0] #Extract current *.py file name

谢谢你的示例。但那并不是我真正想表达的意思,这是来自另一个名为log.py的文件的代码示例:`import os import comolog from comolog import *omri_logging.logcreate(logging.DEBUG) omri_logging.CreatError("error")`在调用logcreate后,日志就被创建了。另一步是以格式...将错误与log.py名称作为文件名写入。我如何传递这些数据,因为行号、文件名都依赖于自定义日志文件。 - Omri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接