标签: python-logging

如何在Python中查找线程ID

我有一个多线程Python程序和一个实用程序函数writeLog(message),它写出一个时间戳后跟消息.不幸的是,结果日志文件没有给出哪个线程正在生成哪个消息的指示.

我希望writeLog()能够在消息中添加一些东西来识别哪个线程正在调用它.显然我可以让线程传递这些信息,但这将是更多的工作.我可以使用一些与os.getpid()等效的线程吗?

python multithreading python-multithreading python-logging

159
推荐指数
6
解决办法
18万
查看次数

logging.config.dictConfig的完整示例在哪里?

我想使用dictConfig,但文档有点抽象.我在哪里可以找到使用的字典的具体,复制+粘贴示例dictConfig

python logging python-logging

107
推荐指数
5
解决办法
4万
查看次数

如何将自定义日志级别添加到Python的日志记录工具中

我想为我的应用程序提供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 logging python-logging

102
推荐指数
10
解决办法
4万
查看次数

如何在 Python FastAPI 中记录原始 HTTP 请求/响应?

我们正在使用 Python FastAPI 编写一个 Web 服务,该服务将托管在 Kubernetes 中。出于审计目的,我们需要保存特定路由的request/的原始 JSON 正文。JSON的主体大小约为1MB,最好这不应该影响响应时间。我们怎样才能做到这一点?responserequestresponse

python logging audit-logging python-logging fastapi

25
推荐指数
2
解决办法
3万
查看次数

使用 joblib 记录嵌套函数并行和延迟调用

在我的一个脚本中,我有类似的内容:

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 python-logging

19
推荐指数
1
解决办法
4665
查看次数

Python日志记录:如果不存在或打开则创建日志,如果存在则继续日志记录

我正在编写一些使用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阻止,但我不知道如何解决.任何人都可以对这种情况有所了解.

python logging filehandler python-logging

11
推荐指数
2
解决办法
1万
查看次数

在 pytest 中禁用特定记录器

在我的项目中,我使用 pdfplumber 解析一些 PDF 文件。在测试执行(pytest)期间,我有时希望查看代码中的日志以进行调试。这可以通过设置来完成--log-cli-level=DEBUG。然而,这会打开来自所有代码的消息,还有 pdfplumber - 这非常冗长并且使调试变得困难。有没有办法在测试运行期间有选择地启用/禁用记录器?

pytest 4.6.3
python 3.7.3

感谢帮助!

python logging pytest python-logging

11
推荐指数
1
解决办法
9425
查看次数

如何缩进python记录器打印的多行消息?

当前行为:

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可以有不同的宽度,因此在将消息发送到记录器之前无法调整消息。

python logging python-logging

10
推荐指数
2
解决办法
3594
查看次数

日志记录的“额外”参数如何工作?

我正在努力弄清楚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 python-logging

8
推荐指数
1
解决办法
4680
查看次数

Python日志记录:禁用堆栈跟踪

是否有一种简单的方法来禁用Python 3中的Handler或的异常堆栈跟踪记录Formatter

我需要在另一个中进行堆栈跟踪Handler,因此exc_info=False在的调用中设置,Logger不是一个选择。有没有比定义自己的方法更简单的方法Formatter

python traceback python-logging

7
推荐指数
1
解决办法
595
查看次数