问题标签 [python-logging]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - basicConfig 只能在根记录器上使用,处理程序/格式化程序只能在命名记录器上使用吗?
我正在使用日志记录并有一个问题。
我知道有简单和高级的日志记录概念。
在简单的日志记录中,我们有logging.info()
,等等,而在高级日志记录中,我们有logging.getlogger(some_name)
.
在简单日志记录中,我们可以使用配置日志路径和消息格式,logging.
basicConfig
而在高级日志记录的情况下,我们有格式化程序的概念,处理程序分配给通过使用获得的记录器logging.getlogger(some_name).addhandlers..
我们甚至可以使用向根记录器添加多个处理程序logging.getlogger().addhandlers....
因此,高级日志记录的唯一好处是我们可以将记录器名称添加到硬编码值或__name__
相应的模块值中。
因此,既然格式化程序和处理程序可以用于简单和高级的日志记录方法,那么简单意味着根记录器和高级意味着模块名称记录器吗?
basicConfig 只能在根记录器上使用,处理程序/格式化程序只能在命名记录器上使用吗?
python - 为模块创建新记录器是否仍使用根记录器名称?
我正在看这篇文章:https ://docs.python.org/3.7/howto/logging.html#logging-basic-tutorial
这段落:
记录器层次结构的根称为根记录器。那是函数 debug()、info()、warning()、error() 和 critical() 使用的记录器,它们只是调用根记录器的同名方法。函数和方法具有相同的签名。根记录器的名称在记录的输出中打印为“root”。
我很困惑,因为一旦您使用logger = logging.getLogger(__name__)
和使用 logger.info/debug/etc. 创建了一个记录器,应该打印模块的名称而不是 root。为什么段落说:“......它只是调用根记录器的同名方法”
airflow - 从 Airflow DAG 记录到单独的自定义日志文件中
我们有许多 python 进程,它们都实现了一个通用的记录器设置,它将所有内容记录到同一个文件并每天轮换文件。
我们最近开始改用 Airflow。最初我们使用 BashOperators,但我们想开始使用 PythonOperators 以利用 Airflow 的更多功能。但是,当我们从 DAG 调用日志记录设置时,日志记录设置似乎没有得到应用。我尝试了许多方法,从our_custom_logging.setup()
在 DAG 顶部调用到将其放入 python 可调用对象中:
似乎这仍然总是在标准 Airflow 日志位置结束。我知道我们可以如何更改 Airflow 日志记录配置,但我们仍然希望将这些日志存储并在 UI 中可见,因此理想情况下,我们只想在 Airflow 旁边添加额外的日志处理。这有可能吗?
python - 在 VS Code 中调试时 Python 日志文件创建失败
我正在尝试在 VS Code 中进行简单的调试,但遇到了一个小问题。
当我在 cmd 中使用普通的 python 命令(例如 python main.py)运行以下代码时,它运行完美。但是,当我使用 VS Code 调试器运行 main.py 文件时,它会在尝试创建日志文件(日志记录模块)时引发 FileNotFoundError。该文件不存在,但“filemode”指定如果找不到文件,则应创建该文件:
我的 launch.json 看起来像这样:
我已将 VS Code 配置为使用 python 3.7(与我的 cmd 命令相同)以确保这不是问题。有人有建议吗?
谢谢
python - Python 记录器忽略类中的 FileHandler 和 StreamHandler 级别
我正在尝试为我的日志文件和流设置不同的记录器级别,并且我(似乎)跟随演示(https://docs.python.org/3/howto/logging-cookbook.html)到点。但是,在我的实际代码中它不起作用。在测试脚本中运行这个演示是有效的:
结果是
但是由于某种原因,这将无法在实际代码中正确执行:
对 self.logger 的任何调用都会在 logging.DEBUG 级别输出到控制台和日志文件——这显然不是我想要的。我很困惑我错过了什么,因为当我问主要方法它的文件处理程序是什么时
这与测试用例相同,但我的控制台和日志文件中都有所有信息级别的输出。更改我的 handler.setLevel 命令对输出没有影响,唯一改变它的是将 setLevel 命令更改为定义最顶部的初始记录器调用(即 ch.setLevel 和 fh.setLevel 无效,但 logger.setLevel 确实[而且我认为它应该只是初始过滤器)。
这让我发疯,有人知道吗?
EDIT1:更改
线到
似乎解决了这个问题,但我不知道为什么......
python - 如何在 Python 中分离日志处理程序
我有一种情况,我想在 Python 中创建两个单独的记录器对象,每个对象都有自己独立的处理程序。“分离”是指我希望能够独立地将日志语句传递给每个对象,而不会污染其他日志。
主文件
my_other_logger.py
我能够确定在这里有用的唯一配置是logger.propagate
属性。按原样运行上面的代码将所有日志语句通过管道传输到日志流和日志文件。当我没有logger.propagate = False
任何东西被传送到日志流时,两个日志对象再次将它们的输出传送到日志文件。
如何创建一个仅将日志发送到一个处理程序的日志对象,以及另一个将日志发送到另一个处理程序的日志对象?
python - logging.handlers.TimedRotatingFileHandler 的错误?
以下代码会产生一些意外行为logging.handlers.TimedRotatingFileHandler
:
我让它运行几分钟,第一次运行结束时一切正常。我知道存在某种非一的行为,即文件不会在预期的那一刻翻转,但我对此表示满意:
但是,如果我在不删除现有 service.log* 文件的情况下再次在同一目录中启动脚本之前等待几分钟,现在logger1
开始按预期写入service.log.2019-09-24_09-11
和logger2
写入。注意nextservice.log
的最后修改时间。16:17
service.log.2019-09-24_09-11
这对我来说似乎是一个错误,因为logger1
从几分钟前开始通过不同的调用继续写入文件logger.error
- 这不仅仅是重新启动脚本时的第一个条目。
我正在使用 Python 3.7.4。
编辑:可以在不停止和启动脚本的情况下重现警报行为,只要几分钟没有写入日志即可。
sleep(180)
如果我们更换,观察日志文件的状态(每个都被清除到 36 字节大小!)
...和...
python - 子记录器是否继承根记录器的“格式”?
我了解 python 日志记录允许使用以下方法创建父子关系:logger = logging.getLogger(parent.child)
。这里的链是:Root logger <- parent <- child
我已经使用以下方式配置了根记录器格式:logging.basicConfig(format='%(levelname)s:%(message)s')
但是,当我使用烧瓶时app.logger.info('some message')
,我相信它是根记录器的孩子;它没有继承 python 根记录器的格式。子记录器是否继承根记录器的格式?
python - 如何只记录某个级别名称 python 日志记录
如果我有一个像上面这样的配置文件,我怎样才能访问它debugHandler
以便我可以这样做debugHandler.addFilter(my_custom_filter)
?
我实际上是在尝试将DEBUG
消息发送到debugs.log
和ERROR
消息发送到errors.log
,但目前ERROR
还发送了debugs.log
我不想要的消息。现在,基于这个 StackOverflow 帖子,这可以通过过滤器实现,但为了添加过滤器,我需要一个logging.Handler
对象,但我不知道如何获得一个对象。
提前谢谢:~)
python - 如何避免 Python 中的默认事件日志记录
我开始在 python 中使用日志记录,我想将我的日志写入文件。
日志记录模块正在将很多事件写入文件。我只想编写自己的记录器,不想记录默认记录器。我怎样才能避免这种情况?
以下是现在发生的示例日志记录:
将事件名称从 created-client-class.iot-data 更改为 created-client-class.iot-data-plane
将事件名称从 before-call.apigateway 更改为 before-call.api-gateway
将事件名称从 request-created 更改。机器学习。预测到 request-created.machine-learning。预测将区域的配置变量设置为“us-west-2”
我如何实例化记录器的方式
请给点建议?!?!