简体   繁体   English

如何在 Python 中记录源文件名和行号

[英]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.

相关问题 如何在python nose中打印出测试的文件名和行号? - How to print out the file name and line number of the test in python nose? 如何从Python生成器对象获取源行号? - How to get source line number from a Python generator object? 如何在GAE Python logging.info日志中获取文件名和行号? - How to have file name and line number in GAE Python logging.info logs? Python 3.4 - 为文件夹中的所有文件添加文件名+行号 - Python 3.4 - Add file name + line number to all files in a folder 如何根据python中的源文件登录到其他文件? - How to log to different files according to source file in python? 如何使用python计算文件中的精确行号? - How to count the precise line number in a file with python? 如何在python中找到文件结尾的行号? - How to find the line number of the end of file in python? 如何获取在 Python 中打开的文件中的行号 - How to get line number in file opened in Python 在 python 日志中包含文件和行号,因此单击 PyCharm 可以 go 到源行吗? - Include file and line number in python logs so clicking in PyCharm can go to the source line? 更改特定行中的特定值(例如行号:57),并使用python保存具有相同文件名的文件 - Changing a particular value in a particular line (say line number:57) and saving the file with same file name using python
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM