[英]How to log source file name and line number in Python
是否可以装饰/扩展python标准日志记录系统,以便在调用日志记录方法时它还会记录文件和调用它的行号或者调用它的方法?
Sure, check formatters in logging docs.当然,请检查日志记录文档中 的格式化程序。 Specifically the lineno and pathname variables.特别是 lineno 和 pathname 变量。
%(pathname)s Full pathname of the source file where the logging call was issued(if available). %(pathname)s发出日志调用的源文件的完整路径名(如果可用)。
%(filename)s Filename portion of pathname. %(filename)s路径名的文件名部分。
%(module)s Module (name portion of filename). %(module)s模块(文件名的名称部分)。
%(funcName)s Name of function containing the logging call. %(funcName)s包含日志调用的函数名称。
%(lineno)d Source line number where the logging call was issued (if available). %(lineno)d发出记录调用的源行号(如果可用)。
Looks something like this:看起来像这样:
formatter = logging.Formatter('[%(asctime)s] p%(process)s {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s','%m-%d %H:%M:%S')
On top of Seb's very useful answer , here is a handy code snippet that demonstrates the logger usage with a reasonable format:在Seb 非常有用的答案之上,这里有一个方便的代码片段,它以合理的格式演示了记录器的用法:
#!/usr/bin/env python
import logging
logging.basicConfig(format='%(asctime)s,%(msecs)d %(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")
Generates this output:生成此输出:
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
# 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)
Different from the other answers, this will log the full path of file and the function name that might have occurred an error.与其他答案不同,这将记录文件的完整路径和可能发生错误的函数名称。 This is useful if you have a project with more than one module and several files with the same name distributed in these modules.如果您的项目包含多个模块以及分布在这些模块中的多个同名文件,这将非常有用。
To build on the above in a way that sends debug logging to standard out:要以将调试日志记录发送到标准输出的方式构建上述内容:
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.")
Putting the above into a file called debug_logging_example.py
produces the output:将上述内容放入名为debug_logging_example.py
的文件中会产生输出:
[debug_logging_example.py:14 - <module>() ] I am sent to standard out.
Then if you want to turn off logging comment out root.setLevel(logging.DEBUG)
.然后,如果您想关闭记录注释掉root.setLevel(logging.DEBUG)
。
For single files (eg class assignments) I've found this a far better way of doing this as opposed to using print()
statements.对于单个文件(例如类分配),我发现这是一种比使用print()
语句更好的方法。 Where it allows you to turn the debug output off in a single place before you submit it.它允许您在提交之前在一个地方关闭调试输出。
For devs using PyCharm or Eclipse pydev, the following will produce a link to the source of the log statement in the console log output:对于使用 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")
See Pydev source file hyperlinks in Eclipse console for longer discussion and history.请参阅Eclipse 控制台中的 Pydev 源文件超链接以获取更长的讨论和历史记录。
If the logger is set with the GetLogger(name) option, where the name is a name that you specified you can also format the logger using %(name)s
.如果使用GetLogger(name)选项设置记录器,其中名称是您指定的名称,您还可以使用%(name)s
格式化记录器。 You can specify a different name in every file with the GetLogger function, and when a log is produced you will know from which file comes through the name you set.您可以使用 GetLogger 函数在每个文件中指定不同的名称,当生成日志时,您将通过您设置的名称知道来自哪个文件。
Example:例子:
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)])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.