【问题标题】:How to specify caller file name in python logger如何在 python 记录器中指定调用者文件名
【发布时间】:2015-02-21 10:41:45
【问题描述】:

我正在尝试创建基于 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 >从文件发送

到下面的日志行,考虑现在 CreateError 调用的文件名是 LogCallFile.py

LogCallFile.py#DEBUG#2015-02-21 11:48:56,819##63#Error Message >从文件发送

【问题讨论】:

    标签: python logging format


    【解决方案1】:

    有一个单独的 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)
    

    【讨论】:

      【解决方案2】:

      您可以尝试将全局日志记录配置放在一个文件中,然后将其导入到您的脚本中,并在每个特定脚本中添加一个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 is greated。另一个步骤是将 w log.py 名称作为 filenami 格式写入错误...我如何传递这些数据,因为行号、文件名都依赖于自定义日志文件。
      【解决方案3】:

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

      FORMAT = 文件名 + "#%(levelname)s#%(asctime)s#%(funcName)s#%(lineno)d#%(message)s"

      【讨论】:

      • 是的,谢谢。但我的主要问题是,当我只为类文件而不是实际文件命名日志点的行时......
      猜你喜欢
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-06
      • 1970-01-01
      • 2011-02-17
      • 2018-04-16
      • 2023-03-18
      相关资源
      最近更新 更多