gpt4 book ai didi

Python,在装饰器中记录路径名

转载 作者:太空宇宙 更新时间:2023-11-04 09:58:01 24 4
gpt4 key购买 nike

当我在装饰器中记录错误时,记录的 pathname 不是我想要的。

日志记录配置文件:

[loggers]
keys=root
[handlers]
keys=console
[formatters]
keys=console
[logger_root]
...
[handler_console]
...
[formatter_console]
format=%(levelname)s - File "%(pathname)s", line %(lineno)s, %(funcName)s: %(message)s

通常,在文件 /home/lizs/test/app.py 中记录错误:

def app():
try:
a # error, on line 12
except Exception, err:
logging.getLogger().error(str(err))

控制台上的调试消息:

ERROR - File "/home/lizs/test/app.py", line 12, app: global name 'a' is not defined

上面的日志记录pathname(/home/lizs/test/app.py) 就是我想要的。但是当我使用装饰器时:

/home/lizs/test/app.py:

from decorators import logging_decorator


@logging_decorator
def app():
a

/home/lizs/test/decorators.py:

def logging_decorator(func):
def error_log():
try:
func() # on line 10
except Exception, err:
logging.getLogger().error(str(err))
return error_log

调试信息:

ERROR - File "/home/lizs/test/decorators.py", line 10, error_log: global name 'a' is not defined

现在,日志记录 pathname 是装饰器的路径名 (/home/lizs/test/decorators.py)。

如何在使用装饰器时将日志记录路径名设置为/home/lizs/test/app.py

最佳答案

解决方案:

试试这个:

应用程序.py:

from decorators import logging_decorator

@logging_decorator
def app():
a

app()

装饰器.py:

import logging
import inspect

# init logger
logger = logging.getLogger()
formatter = logging.Formatter('%(levelname)s - File %(real_pathname)s,'
' line %(real_lineno)s, %(real_funcName)s: %(message)s')
console_handle = logging.StreamHandler()
console_handle.setFormatter(formatter)
logger.addHandler(console_handle)


def logging_decorator(func):
def error_log():
try:
func()
except Exception as err:
logger.error(err, extra={'real_pathname': inspect.getsourcefile(func), # path to source file
'real_lineno': inspect.trace()[-1][2], # line number from trace
'real_funcName': func.__name__}) # function name

return error_log

说明:

根据 docs here您可以将字典作为 extra 参数来填充为具有用户定义属性的日志事件创建的 LogRecord__dict__。然后可以随意使用这些自定义属性。

因此,because we can't modify pathname directly ,这种使用 real_pathname 的方法是最直接的。

链接:

关于Python,在装饰器中记录路径名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45010539/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com