是否可以装饰/扩展python标准日志记录系统,以便当调用日志记录方法时,它也记录被调用的文件和行号,或者可能是调用它的方法?
当前回答
对于使用PyCharm或Eclipse pydev的开发人员,下面将在控制台日志输出中产生一个指向日志语句源的链接:
import logging, sys, os
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG, format='%(message)s | \'%(name)s:%(lineno)s\'')
log = logging.getLogger(os.path.basename(__file__))
log.debug("hello logging linked to source")
请参阅Eclipse控制台中Pydev源文件超链接以获得更详细的讨论和历史记录。
其他回答
如果记录器是使用GetLogger(name)选项设置的,其中名称是您指定的名称,您还可以使用%(name)s格式化记录器。您可以使用GetLogger函数在每个文件中指定不同的名称,当生成日志时,您将通过所设置的名称知道来自哪个文件。
例子:
import logging
logging.getLogger("main")
logging.basicConfig(#filename=log_fpath,
level=log_level,
format='[%(asctime)s] src:%(name)s %(levelname)s:%(message)s',
handlers=[logging.FileHandler(log_fpath)])
import logging
# your imports above ...
logging.basicConfig(
format='%(asctime)s,%(msecs)d %(levelname)-8s [%(pathname)s:%(lineno)d in ' \
'function %(funcName)s] %(message)s',
datefmt='%Y-%m-%d:%H:%M:%S',
level=logging.DEBUG
)
logger = logging.getLogger(__name__)
# your classes and methods below ...
# A very naive sample of usage:
try:
logger.info('Sample of info log')
# your code here
except Exception as e:
logger.error(e)
与其他答案不同,这将记录文件的完整路径和可能发生错误的函数名。如果您的项目包含多个模块,并且这些模块中分布着多个同名文件,那么这将非常有用。
示例输出:
2022-12-02:10:00:00,000 INFO [<stdin>:2 in function <module>] Sample of info log
2022-12-02:10:00:00,000 INFO [<full path>/logging_test_file.py:15 in function <module>] Sample of info log
对于使用PyCharm或Eclipse pydev的开发人员,下面将在控制台日志输出中产生一个指向日志语句源的链接:
import logging, sys, os
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG, format='%(message)s | \'%(name)s:%(lineno)s\'')
log = logging.getLogger(os.path.basename(__file__))
log.debug("hello logging linked to source")
请参阅Eclipse控制台中Pydev源文件超链接以获得更详细的讨论和历史记录。
以一种将调试日志发送到标准输出的方式构建上述:
import logging
import sys
root = logging.getLogger()
root.setLevel(logging.DEBUG)
ch = logging.StreamHandler(sys.stdout)
ch.setLevel(logging.DEBUG)
FORMAT = "[%(filename)s:%(lineno)s - %(funcName)20s() ] %(message)s"
formatter = logging.Formatter(FORMAT)
ch.setFormatter(formatter)
root.addHandler(ch)
logging.debug("I am sent to standard out.")
将上述文件放入名为debug_logging_example.py的文件中会产生输出:
[debug_logging_example.py:14 - <module>() ] I am sent to standard out.
然后如果你想关闭日志记录注释out root.setLevel(logging. debug)。
对于单个文件(例如类赋值),我发现这是一种更好的方法,而不是使用print()语句。它允许您在提交调试输出之前在一个地方关闭调试输出。
在Seb非常有用的回答之上,下面是一个方便的代码片段,以合理的格式演示记录器的使用:
#!/usr/bin/env python
import logging
logging.basicConfig(format='%(asctime)s,%(msecs)03d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s',
datefmt='%Y-%m-%d:%H:%M:%S',
level=logging.DEBUG)
logger = logging.getLogger(__name__)
logger.debug("This is a debug log")
logger.info("This is an info log")
logger.critical("This is critical")
logger.error("An error occurred")
生成以下输出:
2017-06-06:17:07:02,158 DEBUG [log.py:11] This is a debug log
2017-06-06:17:07:02,158 INFO [log.py:12] This is an info log
2017-06-06:17:07:02,158 CRITICAL [log.py:13] This is critical
2017-06-06:17:07:02,158 ERROR [log.py:14] An error occurred
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用pip3安装包时,“Python中的ssl模块不可用”
- 无法切换Python与pyenv
- Python if not == vs if !=
- 如何从scikit-learn决策树中提取决策规则?
- 为什么在Mac OS X v10.9 (Mavericks)的终端中apt-get功能不起作用?
- 将旋转的xtick标签与各自的xtick对齐
- 如何配置slf4j-simple
- 为什么元组可以包含可变项?
- 如何合并字典的字典?
- 如何创建类属性?
- 不区分大小写的“in”
- 在Python中获取迭代器中的元素个数
- 解析日期字符串并更改格式
- 使用try和。Python中的if