如何在python logger中指定调用者文件名

时间:2015-02-21 10:41:45

标签: python logging format

我正在尝试创建基于python logger库的自定义日志。 主要目标是创建可以从应用程序中的任何脚本调用的主日志,并将日志数据写入同一日志文件。 问题是因为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#错误信息>从文件发送

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

  

LogCallFile.py #DEBUG#2015-02-21 11:48:56,819 ## 63#错误消息>从文件发送

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

您可以尝试将全局日志记录配置放入要导入脚本的文件中,并在每个特定脚本中添加getLogger(name)调用:

logging.getLogger(name)

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

所以你也可以像这样检测当前的文件名:

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

答案 2 :(得分:0)

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

FORMAT = filename +"#%(levelname)s#%(asctime)s#%(funcName)s#%(lineno)d#%(消息)s"