使用文件名和行号进行python日志记录

使用文件名和行号进行python日志记录,python,logging,Python,Logging,我正在使用基本的日志python模块添加日志 我决定创建一个日志类,如下所示,名为log.py: class Log: def __init__(self, path): self.LOGGER = logging.getLogger('Open-Capture') if self.LOGGER.hasHandlers(): self.LOGGER.handlers.clear() # Clear the handlers to a

我正在使用基本的日志python模块添加日志

我决定创建一个日志类,如下所示,名为
log.py

class Log:
    def __init__(self, path):
        self.LOGGER = logging.getLogger('Open-Capture')
        if self.LOGGER.hasHandlers():
            self.LOGGER.handlers.clear() # Clear the handlers to avoid double logs
        logFile = RotatingFileHandler(path, mode='a', maxBytes=5 * 1024 * 1024,
                            backupCount=2, encoding=None, delay=0)
        formatter = logging.Formatter('[%(threadName)-14s] [%(filename)s:%(lineno)-15s] %(asctime)s %(levelname)s %(message)s', datefmt='%d-%m-%Y %H:%M:%S')
        logFile.setFormatter(formatter)
        self.LOGGER.addHandler(logFile)
        self.LOGGER.setLevel(logging.DEBUG)

    def info(self, msg):
        self.LOGGER.info(msg)

    def error(self, msg):
        self.LOGGER.error(msg)
如您所见,我使用了
%(filename)s:%(lineno)
变量来添加更多的可理解性。但是在我的日志文件中,我有
log.py:34
而不是源文件的文件名和行号,因为当我记录时,我这样称呼它:

Log = Log(Config.cfg['GLOBAL']['logfile'])
Log.info('test log')
有没有办法将源文件放在我的日志文件中而不是
log.py


提前感谢

是的,这是可能的,尽管我很确定我在这里发布的实现不是100%安全的,并且肯定有更好/更优雅的实现,但请将此作为一个提示

要获取调用者的文件名和行#,您可以使用
inspect
模块,要将这些自定义信息添加到日志中,您可以添加自定义
过滤器

log.py script_file.py 输出:

[MainThread    ] [script_file.py:4              ] 17-01-2020 16:34:36 INFO LOG MESSAGE
[MainThread    ] [script_file.py:5              ] 17-01-2020 16:34:36 ERROR LOG MESSAGE 2
[MainThread    ] [script_file.py:6              ] 17-01-2020 16:34:36 INFO LOG MESSAGE 2

是的,这是可能的,尽管我很确定我在这里发布的实现不是100%安全的,而且肯定有更好/更优雅的实现,请将此作为一个提示

要获取调用者的文件名和行#,您可以使用
inspect
模块,要将这些自定义信息添加到日志中,您可以添加自定义
过滤器

log.py script_file.py 输出:

[MainThread    ] [script_file.py:4              ] 17-01-2020 16:34:36 INFO LOG MESSAGE
[MainThread    ] [script_file.py:5              ] 17-01-2020 16:34:36 ERROR LOG MESSAGE 2
[MainThread    ] [script_file.py:6              ] 17-01-2020 16:34:36 INFO LOG MESSAGE 2


您的文件名是什么?有多个python文件使用Log类
FindContact.py
FindDate.py
等等……没有名为Log.py的文件吗?我编辑了我的帖子。Log类的文件名是
Log.py
我很困惑,因为它的工作方式应该是这样的。“但是在我的日志文件中我有log.py:34而不是文件名和行号”不是log.py是你的文件名,34是行号是什么意思?你的文件名是什么?有多个python文件使用log类
FindContact.py
FindDate.py
等等……没有名为Log.py的文件吗?我编辑了我的帖子。Log类的文件名是
Log.py
我很困惑,因为它的工作方式应该是这样的。你说“但是在我的日志文件中我有log.py:34而不是文件名和行号”是什么意思?不是log.py是你的文件名,34是行号?非常感谢,它工作得很好。但是,为什么这样做不安全呢?每次调用日志“debug”和“error”方法时,我都将调用方存储在CallerFilter类属性上,这些属性在不同的记录器实例之间共享。这对于“普通”代码来说是安全的,但如果您在web应用程序中使用它,可能会出现并发问题(取决于应用程序结构),这将导致写入带有文件名和并发请求编号的日志。。。不过,这只是理论,如果您在不使用并发的脚本上使用它,您就可以了。(现在我考虑一下,最好在调用之后添加一个“\u filter”属性的重置…)因此,如果在每次日志类调用中使用
logger.filters.clear()
,在添加过滤器之前,它可能会更好?是的,我想是这样。很好的解决方案!非常感谢,它工作得很好。但是,为什么这样做不安全呢?每次调用日志“debug”和“error”方法时,我都将调用方存储在CallerFilter类属性上,这些属性在不同的记录器实例之间共享。这对于“普通”代码来说是安全的,但如果您在web应用程序中使用它,可能会出现并发问题(取决于应用程序结构),这将导致写入带有文件名和并发请求编号的日志。。。不过,这只是理论,如果您在不使用并发的脚本上使用它,您就可以了。(现在我考虑一下,最好在调用之后添加一个“\u filter”属性的重置…)因此,如果在每次日志类调用中使用
logger.filters.clear()
,在添加过滤器之前,它可能会更好?是的,我想是这样。很好的解决方案!
[MainThread    ] [script_file.py:4              ] 17-01-2020 16:34:36 INFO LOG MESSAGE
[MainThread    ] [script_file.py:5              ] 17-01-2020 16:34:36 ERROR LOG MESSAGE 2
[MainThread    ] [script_file.py:6              ] 17-01-2020 16:34:36 INFO LOG MESSAGE 2