使用 YAML 和过滤器登录 python

2024-01-14

想要使用 YAML 设置带有过滤器的记录器。

YAML 配置文件config.yaml如下:

version: 1

formatters:
  simple:
    format: "%(asctime)s %(name)s: %(message)s"
  extended:
    format: "%(asctime)s %(name)s %(levelname)s: %(message)s"

filters:
  noConsoleFilter:
    class: noConsoleFilter

handlers:
  console:
    class: logging.StreamHandler
    level: INFO
    formatter: simple
    filters: [noConsoleFilter]

  file_handler:
    class: logging.FileHandler
    level: INFO
    filename: test.log
    formatter: extended

root:
  handlers: [console, file_handler]
  propagate: true

...以及主程序main.py如下:

import logging.config
import yaml

class noConsoleFilter(logging.Filter):
    def filter(self, record):
        print("filtering!")
        return not (record.levelname == 'INFO') & ('no-console' in record.msg)

with open('config.yaml', 'r') as f:
    log_cfg = yaml.safe_load(f.read())
    logging.config.dictConfig(log_cfg)  

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

logger.info("no-console. Should not be in console, but be in test.log!")
logger.info('This is an info message')
logger.error('This is an error message')

控制台中的预期输出没有“no-console”消息:

   2020-04-27 18:05:26,936 __main__: This is an info message 
   2020-04-27 18:05:26,936 __main__: This is an error message

但看起来像类:noConsoleFilter甚至没有被考虑,因为 print 语句也不起作用。

我哪里错了?我该如何修复它?


语法有点奇怪,但它在日志记录文档中进行了描述,位于用户定义的对象 https://docs.python.org/3/library/logging.config.html#logging-config-dict-userdef,你必须使用密钥(), not class。就像这样:

filters:
  noConsoleFilter:
    (): noConsoleFilter

接下来,您需要为类指定一个限定名称。如果您直接运行脚本,而不是作为模块,您可以在下面引用它__main__:

filters:
  noConsoleFilter:
    (): __main__.noConsoleFilter

我还建议使用 PEP 8类名的 CapWords 约定 https://www.python.org/dev/peps/pep-0008/#class-names。这是一个稍微整理过的、完全独立的示例:

# logging.yml
version: 1

formatters:
  simple_formatter:
    format: "%(asctime)s %(name)s: %(message)s"
  extended_formatter:
    format: "%(asctime)s %(name)s %(levelname)s: %(message)s"

filters:
  no_console_filter:
    (): __main__.NoConsoleFilter

handlers:
  console_handler:
    class: logging.StreamHandler
    level: INFO
    formatter: simple_formatter
    filters: [no_console_filter]

  file_handler:
    class: logging.FileHandler
    level: INFO
    filename: test.log
    formatter: extended_formatter

root:
  handlers: [console_handler, file_handler]
  propagate: true
# script.py
import logging.config
import yaml

class NoConsoleFilter(logging.Filter):
    def filter(self, record):
        print('filtering!')
        return not (record.levelname == 'INFO') & ('no-console' in record.msg)

with open('logging.yml', 'r') as f:
    log_cfg = yaml.safe_load(f.read())
    logging.config.dictConfig(log_cfg)

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

logger.info('no-console. Should not be in console, but be in test.log!')
logger.info('This is an info message')
logger.error('This is an error message')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 YAML 和过滤器登录 python 的相关文章

  • 下载 PyQt6 的 Qt Designer 并使用 pyuic6 将 .ui 文件转换为 .py 文件

    如何下载 PyQt6 的 QtDesigner 如果没有适用于 PyQt6 的 QtDesigner 我也可以使用 PyQt5 的 QtDesigner 但是如何将此 ui 文件转换为使用 PyQt6 库而不是 PyQt5 的 py 文件
  • 如何在python中读取多个文件中的文本

    我的文件夹中有许多文本文件 大约有 3000 个文件 每个文件中第 193 行是唯一包含重要信息的行 我如何使用 python 将所有这些文件读入 1 个文本文件 os 模块中有一个名为 list dir 的函数 该函数返回给定目录中所有文
  • 如何在刻度标签和轴之间添加空间

    我已成功增加刻度标签的字体 但现在它们距离轴太近了 我想在刻度标签和轴之间添加一点呼吸空间 如果您不想全局更改间距 通过编辑 rcParams 并且想要更简洁的方法 请尝试以下操作 ax tick params axis both whic
  • 如何使用固定的 pandas 数据框进行动态 matplotlib 绘图?

    我有一个名为的数据框benchmark returns and strategy returns 两者具有相同的时间跨度 我想找到一种方法以漂亮的动画风格绘制数据点 以便它显示逐渐加载的所有点 我知道有一个matplotlib animat
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • SQL Alchemy 中的 NULL 安全不等式比较?

    目前 我知道如何表达 NULL 安全的唯一方法 SQL Alchemy 中的比较 其中与 NULL 条目的比较计算结果为 True 而不是 NULL 是 or field None field value 有没有办法在 SQL Alchem
  • 打破嵌套循环[重复]

    这个问题在这里已经有答案了 有没有比抛出异常更简单的方法来打破嵌套循环 在Perl https en wikipedia org wiki Perl 您可以为每个循环指定标签 并且至少继续一个外循环 for x in range 10 fo
  • Python tcl 未正确安装

    我刚刚为 python 安装了graphics py 但是当我尝试运行以下代码时 from graphics import def main win GraphWin My Circle 100 100 c Circle Point 50
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • 从列表中的数据框列中搜索部分字符串匹配 - Pandas - Python

    我有一个清单 things A1 B2 C3 我有一个 pandas 数据框 其中有一列包含用分号分隔的值 某些行将包含与上面列表中的一项的匹配 它不会是完美的匹配 因为它在其中包含字符串的其他部分 该列 例如 该列中的一行可能有 哇 这里
  • python pandas 中的双端队列

    我正在使用Python的deque 实现一个简单的循环缓冲区 from collections import deque import numpy as np test sequence np array range 100 2 resha
  • python 集合可以包含的值的数量是否有限制?

    我正在尝试使用 python 设置作为 mysql 表中 ids 的过滤器 python集存储了所有要过滤的id 现在大约有30000个 这个数字会随着时间的推移慢慢增长 我担心python集的最大容量 它可以包含的元素数量有限制吗 您最大
  • 当玩家触摸屏幕一侧时,如何让 pygame 发出警告?

    我使用 pygame 创建了一个游戏 当玩家触摸屏幕一侧时 我想让 pygame 给出类似 你不能触摸屏幕两侧 的错误 我尝试在互联网上搜索 但没有找到任何好的结果 我想过在屏幕外添加一个方块 当玩家触摸该方块时 它会发出警告 但这花了很长
  • ExpectedFailure 被计为错误而不是通过

    我在用着expectedFailure因为有一个我想记录的错误 我现在无法修复 但想将来再回来解决 我的理解expectedFailure是它会将测试计为通过 但在摘要中表示预期失败的数量为 x 类似于它如何处理跳过的 tets 但是 当我
  • 如何在 Django 中使用并发进程记录到单个文件而不使用独占锁

    给定一个在多个服务器上同时执行的 Django 应用程序 该应用程序如何记录到单个共享日志文件 在网络共享中 而不保持该文件以独占模式永久打开 当您想要利用日志流时 这种情况适用于 Windows Azure 网站上托管的 Django 应
  • 从 Python 中的类元信息对 __init__ 函数进行类型提示

    我想做的是复制什么SQLAlchemy确实 以其DeclarativeMeta班级 有了这段代码 from sqlalchemy import Column Integer String from sqlalchemy ext declar
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo
  • 使用基于正则表达式的部分匹配来选择 Pandas 数据帧的子数据帧

    我有一个 Pandas 数据框 它有两列 一列 进程参数 列 包含字符串 另一列 值 列 包含相应的浮点值 我需要过滤出部分匹配列 过程参数 中的一组键的子数据帧 并提取与这些键匹配的数据帧的两列 df pd DataFrame Proce
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数
  • 改变字典的哈希函数

    按照此question https stackoverflow com questions 37100390 towards understanding dictionaries 我们知道两个不同的字典 dict 1 and dict 2例

随机推荐

  • Spring-Drools 集成:引用的文件 (kie-spring.xsd) 包含错误

    我正在尝试将 drools 与 Spring 一起使用 春季版本4 01 Drools Kie 版本 6 0 1 我的 kie context xml 有以下错误 在 Eclipse 中 引用的文件包含错误 http drools org
  • Yii Framework/PDO 出现错误 CDbCommand 无法执行 SQL 语句:SQLSTATE[42000]

    我尝试使用 Yii Framework 和 PDO 对象将一些数据插入表中 但出现以下错误 我正在使用此代码构建查询 connection CActiveRecord getDbConnection sql INSERT INTO sms
  • 在整行上使用 udf 过滤 Pyspark Dataframe

    有没有办法选择整行作为列输入到 Pyspark 过滤器 udf 中 我有一个复杂的过滤函数 my filter 我想将其应用于整个 DataFrame my filter udf udf lambda r my filter r Boole
  • JPA Criteria API 过滤器子实体

    代码示例 Entity public class Event Id GeneratedValue private Long id private String name OneToMany mappedBy event private Li
  • 防止 PHP date() 默认为 12/31/1969

    我正在使用 MySQL 数据库和 PHP 我使用以下命令将日期值存储在数据库中DATETIME field 我正在使用此 PHP 代码将输入的日期转换为适合 MySQL 的格式 date Y m d H i s strtotime inpu
  • 水平扩展的微服务实例是否应该共享数据库?

    给定一个拥有关系数据库并需要水平扩展的微服务 我看到两种配置数据库服务器的方法 为服务的每个实例提供其自己的数据库服务器实例 并具有耦合的流程生命周期 OR 让实例连接到共享 由同一服务的相同实例 独立数据库服务器或集群 使用事件驱动架构和
  • NotificationCompat.Builder 中出现 NoClassDefFound 错误

    这个概念是在特定时间收到通知 显然 我做到了 直到我添加了对低于以下版本的支持HoneyComb并在其上方 我已经设置了最小 SDK 版本 8 和目标 SDK 17 由于类编码要大得多 我仅显示存在问题的核心区域 int currentap
  • 为什么最好将 script 标签放在 body 标签的末尾?

    有两个与浏览器网页初始化相关的事件 DOMContentReady document object 解析 HTML 文档并构建 DOM 树 load window object HTML 文档的所有元素都被渲染 显示 根据我的理解 浏览器无
  • 无法找到捆绑的 Java 版本。 MacBook Air M1

    我在配备 intel 的 MacBook Pro 上使用 flutter 一切正常 现在我改用配备 M1 芯片的 MacBook Air 我收到错误无法找到捆绑的 Java 版本 请问我该如何解决它 扑动医生 v Flutter 频道稳定
  • 在 Apps 脚本中设置数据验证显示样式

    是否可以在应用程序脚本中设置下拉列表显示样式 检查文档后发现 API 只允许您在 箭头 和 纯文本 之间进行选择 应用程序脚本文档 https developers google com apps script reference spre
  • 无法以编程方式在 C:\inetpub\wwwroot 中创建文件

    我在 ASP NET 网页的代码后面有一个函数 它创建一个文件 然后使用 JavaScript 命令打开它 这在 IDE 中有效 它会创建文件 询问我要在哪里保存文件 我可以保存它 等等 但是当我安装网站并测试它时 我在尝试创建网站时收到
  • Internet Explorer 8 原型和 XMLHttpRequest

    这部分是对解决方法的请求 部分是试图表明 Internet Explorer 的原型实现仍然有缺陷 以下代码在 Internet Explorer 上不起作用 XMLHttpRequest prototype old XMLHttpRequ
  • 如何关闭 Safari 的预取功能?

    Safari 有一个 功能 可以在您输入网址时预加载页面 现在对于大多数用户来说 这确实是一个功能 可以加快页面加载速度 但对于 Web 开发人员来说 它可能会带来麻烦 特别是当它自动加载您之前使用过但当前无意运行的脚本 例如导入程序或后台
  • 根据 Celery 任务状态更新 Django 模型字段

    在我的模型中 我有一个status默认值为 处理 的字段 在 Django 管理界面中 用户单击 保存 按钮后 表单输入将传递给仅休眠 30 秒的 celery 任务 30 秒后 我该如何 判断celery任务是否成功 更新模型的statu
  • 如果浏览器不是 Internet Explorer 9 或更高版本,则显示一条消息

    我想向我的用户展示一个如下所示的栏 如果 浏览器不是IE 或者 浏览器为 IE 但版本为 8 或更早 请注意 屏幕截图仅用于说明 IE 9is支持我的网站 我发现了这个不错的 jQuery 插件 但我不想使用弹出窗口 http jrejec
  • x 轴刻度日期格式和位置

    我尝试使用 matplotlib 复制最初使用 flotr2 创建的绘图图以进行 pdf 输出 我必须说 flotr 更容易使用 但除此之外 我目前一直在尝试将 x 轴上的日期 时间格式化为所需的格式 即小时 分钟 每 2 小时间隔一次 如
  • 如何恢复 .condarc 中 env_prompt 参数的默认行为?

    如果你创建一个python环境conda with prefix标记并激活它 激活后环境将通过其整个路径显示 这可能是一条很长的路 因此conda 文档 https docs conda io projects conda en lates
  • Spark 中的任务不可序列化

    我有这样的转变 JavaRDD
  • WPF 本机 Windows 10 Toast

    使用 NET WPF和Windows 10 有没有办法使用c 将本地toast通知推送到操作中心 我只看到人们为此制作自定义对话框 但必须有一种方法可以通过 os 您可以使用NotifyIcon from System Windows Fo
  • 使用 YAML 和过滤器登录 python

    想要使用 YAML 设置带有过滤器的记录器 YAML 配置文件config yaml如下 version 1 formatters simple format asctime s name s message s extended form