相关疑难解决方法(0)

Python日志记录 - 禁用导入模块的日志记录

我正在使用Python日志记录模块,并且想要禁用由我导入的第三方模块打印的日志消息.例如,我正在使用以下内容:

logger = logging.getLogger()
logger.setLevel(level=logging.DEBUG)
fh = logging.StreamHandler()
fh_formatter = logging.Formatter('%(asctime)s %(levelname)s %(lineno)d:%(filename)s(%(process)d) - %(message)s')
fh.setFormatter(fh_formatter)
logger.addHandler(fh)
Run Code Online (Sandbox Code Playgroud)

这会在我执行logger.debug("我的消息!")时打印出我的调试消息,但它也会打印出我导入的任何模块的调试消息(例如请求和许多其他事情).

我想只看到我感兴趣的模块的日志消息.是否可以使日志模块执行此操作?

理想情况下,我希望能够告诉记录器从"ModuleX,ModuleY"打印消息并忽略所有其他消息.

我查看了以下内容,但我不想在每次调用导入函数之前禁用/启用日志记录: logging - 如何忽略导入的模块日志?

python logging

61
推荐指数
8
解决办法
3万
查看次数

禁用boto日志记录而不修改boto文件

我正在使用Boto库与AWS交谈.我想禁用日志记录.(或重定向到/ dev/null或其他文件).我找不到明显的方法来做到这一点.我尝试过这个,但这似乎没有帮助.

import boto
boto.set_file_logger('boto', 'logs/boto.log')
Run Code Online (Sandbox Code Playgroud)

这说明有可能,http://developer.amazonwebservices.com/connect/thread.jspa? messageID = 52727췷 ,但AFAIK的文档并没有说明如何.

python logging boto amazon-web-services

43
推荐指数
5
解决办法
2万
查看次数

使用python日志记录过滤不同记录器的正确方法是什么?

我的目的是使用分层过滤进行多模块日志记录

记录作者Vinay Sajip 提出的方式,至少据我猜测;-)

你可以跳到" 我希望它如何工作 "

不幸的是,我很快就了解到,使用日志工具比使用该语言的大多数其他经验要复杂得多,我已经做了很多常见的(设计)错误,例如尝试为多个模块实现集中式单个Logger类日志记录甚至是类似的方案(使用Python logger类为不同的日志级别生成多个日志).但显然有更好的设计空间,花费时间寻找和学习它可能会更糟糕.所以,现在我希望我走在正确的轨道上.否则Vinaj将不得不澄清其余的;-)

我安排我的日志记录如下:

  • 每个python模块都有自己的记录器
  • 每个记录器的名称与定义它的模块相同,例如 logger = logging.getLogger(__name__)
  • 像这样,每个模块中的代码可以使用自己的(本地定义的)记录器将日志消息(logging.LogRecord)发送给处理程序(logging.Handler)
  • 使用logging.config实现日志记录配置的完全灵活性(注意:在下面的代码中我只是从basicConfig开始)

这种方法是推荐的方法,我同意其可能的优点.例如,我可以使用完全限定的模块名称(代码中已存在的命名层次结构)打开/关闭外部库的DEBUG.

现在为了获得更高级别的控制,我想使用logging.Filter类,以便只能过滤(允许)记录器层次结构中的选定子树.

这一切都很好,但过滤如此处所述

Filter instances are used to perform arbitrary filtering of LogRecords.

Loggers and Handlers can optionally use Filter instances to filter
records as desired. The base filter class only allows events which are
below a certain point in the logger hierarchy. For example, a filter
initialized with "A.B" will allow events logged by …
Run Code Online (Sandbox Code Playgroud)

python logging filter

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

如何在主Flask模块外部登录?

我有一个Python Flask应用程序,该条目文件在应用程序上配置了一个记录器,如下所示:

app = Flask(__name__)
handler = logging.StreamHandler(sys.stdout)
app.logger.addHandler(handler)
app.logger.setLevel(logging.DEBUG)
Run Code Online (Sandbox Code Playgroud)

然后我做了一堆日志记录

app.logger.debug("Log Message")

哪个工作正常.但是,我有一些API函数,如:

@app.route('/api/my-stuff', methods=['GET'])
def get_my_stuff():
    db_manager = get_manager()
    query = create_query(request.args)

    service = Service(db_manager, query)
    app.logger.debug("Req: {}".format(request.url))
Run Code Online (Sandbox Code Playgroud)

我想知道的是如何在该Service模块/ python类中进行日志记录.我必须将应用程序传递给它吗?这似乎是一个不好的做法,但我不知道如何从主Flask文件外部获取app.logger的句柄...

python logging flask

21
推荐指数
1
解决办法
6768
查看次数

python日志替代品

Python 日志记录模块使用起来很麻烦.有更优雅的选择吗?与桌面通知集成将是一个加号.

python logging notifications

13
推荐指数
3
解决办法
3964
查看次数

如何在应用程序中配置所有记录器

Python的日志记录模块允许模块或类定义自己的记录器.不同的记录器可以有不同的处理程序.他们中的一些人可能选择登录文件,而有些人则选择登录,例如stdout.

现在,我的应用程序使用了其中几个模块,每个模块都有自己的记录器,这些记录器具有各种处 我可以统一日志记录行为,以便所有日志都转到我指定的日志文件吗?换句话说,有没有办法从一个地方同时将.config()所有记录器的处理程序?

python logging

13
推荐指数
2
解决办法
6015
查看次数

如何避免从 Python 中的自定义记录器调用根处理程序?

我有一个具有调试级别的日志记录模块的基本配置 - 现在我想创建另一个仅具有错误级别的记录器。我怎样才能做到这一点?

问题是除了错误处理程序之外还调用了根处理程序 - 这是我想避免的事情。

import logging
fmt = '%(asctime)s:%(funcName)s:%(lineno)d:%(levelname)s:%(name)s:%(message)s'
logging.basicConfig(level=logging.DEBUG, format=fmt)

logger = logging.getLogger('Temp')
logger.setLevel(logging.ERROR)
handler = logging.StreamHandler()
handler.setLevel(logging.ERROR)
logger.addHandler(handler)

logger.error('boo')
Run Code Online (Sandbox Code Playgroud)

上面的代码打印了两次 boo ,而我只期望一次,而且我不知道如何处理这个恼人的问题......

In [4]: logger.error('boo')
boo
2021-04-26 18:54:24,329:<module>:1:ERROR:Temp:boo

In [5]: logger.handlers
Out[5]: [<StreamHandler stderr (ERROR)>]
Run Code Online (Sandbox Code Playgroud)

python logging

10
推荐指数
1
解决办法
3419
查看次数

dictconfig中的根记录器

我想为Django项目设置一个Sentry记录器.我将定义一个sentry处理程序,并将该处理程序放在具有error级别的根记录器中.

根据logging模块的文档,有一个特殊的root关键:

root - 这将是根记录器的配置.配置的处理将与任何记录器一样,但该propagate设置将不适用.

同时在其他地方使用带有名称的记录器''来包含根记录器的配置.

这有同样的效果吗?什么是优选的?

>>> import logging
>>> logging.getLogger('') is logging.root
True
>>> 
Run Code Online (Sandbox Code Playgroud)

python django logging sentry

9
推荐指数
1
解决办法
3574
查看次数

将 python 日志记录添加到 FastApi 端点,托管在 docker 上不显示 API 端点日志

我有一个 fastapi 应用程序,我想在其中添加 python 日志记录。我遵循了基本教程并添加了这个,但是这并没有添加 API,而只是添加了 gunicorn 日志记录。

因此,我有一个使用 docker build 托管的本地服务器,因此docker-compose up使用 api 客户端(失眠,类似于邮递员)运行服务器并测试我的端点。下面是没有创建日志文件的代码,因此没有添加日志语句。

我的项目 str 如下:

project/
  src/ 
    api/
      models/ 
        users.py
      routers/
        users.py
      main.py
      logging.conf
Run Code Online (Sandbox Code Playgroud)
"""
main.py Main is the starting point for the app.
"""
import logging
import logging.config
from fastapi import FastAPI
from msgpack_asgi import MessagePackMiddleware
import uvicorn

from api.routers import users


logger = logging.getLogger(__name__)


app = FastAPI(debug=True)
app.include_router(users.router)


@app.get("/check")
async def check():
    """Simple health check endpoint."""
    logger.info("logging from the root logger")
    return {"success": …
Run Code Online (Sandbox Code Playgroud)

logging python-3.x gunicorn docker-compose fastapi

7
推荐指数
2
解决办法
9631
查看次数

在 Python 日志记录中向每条日志消息添加信息

我正在使用带有日志记录模块的Python,并且想将socket.hostname()添加到每条日志消息中,我必须在每条消息中运行此查询并且不能使用

name = socket.hostname() 
Run Code Online (Sandbox Code Playgroud)

然后用名称记录格式

我正在研究这个使用日志过滤器的示例,但我这里需要的不是过滤器,而是对每个日志消息的简单操作。

我怎样才能达到想要的结果?

python logging python-3.x python-logging

6
推荐指数
2
解决办法
4022
查看次数

Python 中的基本日志记录 dictConfig

注意我知道这个答案,但这对我不起作用,我希望有一个完整的、独立的工作示例。

我正在尝试logging.basicConfigdictConfigPython (2.7)替换

我的理解basicConfig只是设置根记录器:所以我试图对dictConfig. 也就是说,使用处理程序设置根记录器,然后我的应用程序中的所有记录器都将向上传播根记录器。

以下代码段缺少什么?行为是创建了日志文件,但没有输出。(我尝试了各种设置级别的组合,但似乎没有帮助)

import logging
log_dict = {
    'loggers': {
        'root': {
            'handlers': ['file_handler']
        }
    },
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'file_handler': {
            'filename': 'c:/mylogfile.log',
            'class': 'logging.FileHandler'
        }
    }
}

logging.config.dictConfig(log_dict)
logging.info('THIS IS A TEST')
logging.shutdown()
exit()
Run Code Online (Sandbox Code Playgroud)

python logging

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

FastAPI Gunicorn 添加日志记录时间戳

我正在使用 docker 运行 FastAPI https://fastapi.tiangolo.com/deployment/

tiangolo/uvicorn-gunicorn-fastapi:python3.7
Run Code Online (Sandbox Code Playgroud)

start.sh 看起来像:

exec gunicorn -k uvicorn.workers.UvicornWorker -c "$GUNICORN_CONF" "$APP_MODULE"
Run Code Online (Sandbox Code Playgroud)

我的 docker 日志看起来没有时间戳:

INFO:     123.123.123.123:48736 - "GET /wp-login.php HTTP/1.0" 404 Not Found
INFO:     123.123.123.123:48808 - "GET /robots.txt HTTP/1.0" 404 Not Found
INFO:     123.123.123.123:48810 - "GET / HTTP/1.0" 200 OK
Run Code Online (Sandbox Code Playgroud)

似乎在gunicorn_conf.py它使用

use_loglevel = os.getenv("LOG_LEVEL", "info")
Run Code Online (Sandbox Code Playgroud)

如何轻松优雅地修改带有时间戳的 INFO 和 ERROR 记录器格式?

logging gunicorn docker fastapi

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