我有一个多线程Python程序和一个实用程序函数writeLog(message),它写出一个时间戳后跟消息.不幸的是,结果日志文件没有给出哪个线程正在生成哪个消息的指示.
我希望writeLog()能够在消息中添加一些东西来识别哪个线程正在调用它.显然我可以让线程传递这些信息,但这将是更多的工作.我可以使用一些与os.getpid()等效的线程吗?
我想使用dictConfig,但文档有点抽象.我在哪里可以找到使用的字典的具体,复制+粘贴示例dictConfig?
我想为我的应用程序提供loglevel TRACE(5),因为我认为这debug()还不够.另外log(5, msg)不是我想要的.如何将自定义日志级别添加到Python记录器?
我有mylogger.py以下内容:
import logging
@property
def log(obj):
myLogger = logging.getLogger(obj.__class__.__name__)
return myLogger
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我以下列方式使用它:
class ExampleClass(object):
from mylogger import log
def __init__(self):
'''The constructor with the logger'''
self.log.debug("Init runs")
Run Code Online (Sandbox Code Playgroud)
现在我想打个电话 self.log.trace("foo bar")
在此先感谢您的帮助.
编辑(2016年12月8日):我改变了接受pfa的答案,即恕我直言,这是一个很好的解决方案,基于Eric S.的非常好的建议.
我们正在使用 Python FastAPI 编写一个 Web 服务,该服务将托管在 Kubernetes 中。出于审计目的,我们需要保存特定路由的request/的原始 JSON 正文。JSON的主体大小约为1MB,最好这不应该影响响应时间。我们怎样才能做到这一点?responserequestresponse
在我的一个脚本中,我有类似的内容:
import logging
from joblib import Parallel, delayed
def f_A(x):
logging.info("f_A "+str(x))
def f_B():
logging.info("f_B")
res = Parallel(n_jobs=2, prefer="processes")(delayed(f_A)(x) for x in range(10))
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO)
f_B()
Run Code Online (Sandbox Code Playgroud)
我希望当我运行python script.py类似的东西时:
INFO:root:f_B
INFO:root:f_A
Run Code Online (Sandbox Code Playgroud)
显示在控制台中,而不是我看到:
INFO:root:f_B
Run Code Online (Sandbox Code Playgroud)
f_A但没有显示任何信息。
我怎样才能f_A——以及最终从那里调用的函数——显示在日志中?
我认为问题是由于默认日志记录级别为“调试”,并且主进程不共享将级别传播给子进程。如果将脚本稍微修改为:
INFO:root:f_B
INFO:root:f_A
Run Code Online (Sandbox Code Playgroud)
然后一切都会按预期进行。
我正在编写一些使用python logging系统的代码.我们的想法是,如果LOG尚未存在,则创建日志,但如果存在,则获取日志并继续记录到该文件.这是我的代码:
import logging
import os
log_filename='Transactions.log')
if os.path.isfile(log_filename)!=True:
LOG = logging.getLogger('log_filename')
LOG.setLevel(logging.DEBUG)
# create file handler which logs even debug messages
fh = logging.FileHandler('log_filename')
fh.setLevel(logging.DEBUG)
# create console handler with a higher log level
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# create formatter and add it to the handlers
formatter = logging.Formatter('-->%(asctime)s - %(name)s:%(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# add the handlers to the logger
LOG.addHandler(fh)
LOG.addHandler(ch)
else:
LOG=logging.getLogger()
Run Code Online (Sandbox Code Playgroud)
我怀疑问题出在我的else阻止,但我不知道如何解决.任何人都可以对这种情况有所了解.
在我的项目中,我使用 pdfplumber 解析一些 PDF 文件。在测试执行(pytest)期间,我有时希望查看代码中的日志以进行调试。这可以通过设置来完成--log-cli-level=DEBUG。然而,这会打开来自所有代码的消息,还有 pdfplumber - 这非常冗长并且使调试变得困难。有没有办法在测试运行期间有选择地启用/禁用记录器?
pytest 4.6.3
python 3.7.3
感谢帮助!
当前行为:
DEBUG:package:123 > message with
multiple lines
foo bar
Run Code Online (Sandbox Code Playgroud)
想要的行为:
DEBUG:package:123 > message with
multiple lines
foo bar
Run Code Online (Sandbox Code Playgroud)
DEBUG:package:123可以有不同的宽度,因此在将消息发送到记录器之前无法调整消息。
我正在努力弄清楚extra日志记录的论点到底是如何运作的。我需要更改一些使用它的遗留代码,并且这些代码还需要记录到标准输出。
import logging
log = logging.getLogger()
handler = logging.Streamhandler(sys.stdout)
handler.setLevel("INFO")
formatter = logging.Formatter('%(asctime)s | %(name)s | %(levelname)s | %(message)s')
handler.setFormatter(formatter)
log.addHandler(handler)
log.error("fly you foos!", extra={"City": "Mordor"})
Run Code Online (Sandbox Code Playgroud)
2019-10-31 16:19:04,422 | root | ERROR | fly you foos!
Run Code Online (Sandbox Code Playgroud)
上面的日志fly you foos!,但没有对额外的参数做任何事情。这是有道理的,因为额外的参数并没有真正以任何方式被使用。
但是,根据此文档,我可以更改Formatter以包含附加字典键“城市”:
2019-10-31 16:19:04,422 | root | ERROR | fly you foos!
Run Code Online (Sandbox Code Playgroud)
2019-10-31 16:19:04,422 | root | ERROR | fly you foos! | Mordor
Run Code Online (Sandbox Code Playgroud)
这为我提供了我正在寻找的正确日志行,但是它也为我提供了一个,KeyError因为我使用的所有其他地方log现在也需要一个包含 key 的字典作为参数City。这显然是不可行的,因为它需要更改log …
是否有一种简单的方法来禁用Python 3中的Handler或的异常堆栈跟踪记录Formatter?
我需要在另一个中进行堆栈跟踪Handler,因此exc_info=False在的调用中设置,Logger不是一个选择。有没有比定义自己的方法更简单的方法Formatter?