通过带有可选Sentry集成的预配置的structlogger记录而无需设置日志

structlog-sentry-logger的Python项目详细描述


Structlog哨兵记录器

CIcodecovpre-commitGitHubPyPI - Python VersionPyPICode style: black

多用途、预配置、性能优化的^{}记录器 带(可选)Sentry集成 通过^{}。在

为什么

  1. 使日志记录与使用print语句一样简单,但更漂亮,更不臭!在
  2. 非常固执己见!只有two (2) distinct configurations。在
  3. JSON格式的结构化日志意味着它们可以被许多 最喜欢的日志分析工具!在

你得到了什么

强大的自动上下文字段

预配置选项包括:

  1. 时间戳
    • DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S"
  2. 日志级别
    • 添加到JSON上下文以进行筛选和分类
  3. 记录器名称
    • 自动分配给初始化的命名空间版本 python模块(.py文件),相对于项目目录。
      • e、 g,docs_src/sentry_integration.py中的记录器名为docs_src.sentry_integration

使用按键排序的字段,以便于快速分析。在

性能

structlog-sentry-logger已完全调整并利用^{} 作为JSON序列化程序,用于闪电般快速的日志记录(超过4倍的加速比 Python的内置JSON库[1])。到了2020年,你不必 义务性的横切关注点不再削弱性能!在

如需进一步参考,请参阅:

[1] 资料来源: Choosing a faster JSON library for Python: Benchmarking

内置哨兵集成(可选)

自动添加更丰富的背景到您的哨兵报告。在

  • structlog-sentry-logger时,整个日志上下文将作为哨兵事件发送 日志级别为error或更高。
    • i、 例如,logger.error("")logger.exception("")
  • 有关详细信息,请参见^{}。在

目录

安装

pip install structlog-sentry-logger

使用

structlog日志记录(无哨兵)

在Python模块的顶部,导入并实例化记录器:

^{pr2}$

现在,任何时候你想打印任何东西,都不要。而是这样做:

LOG_MSG="Information that's useful for future me and others"LOGGER.info(LOG_MSG,extra_field="extra_value")
注意:支持所有的正则Python logging levels

自动生成:

{
    "event": "Information that's useful for future me and others",
    "extra_field": "extra_value",
    "level": "info",
    "logger": "docs_src.pure_structlog_logging_without_sentry",
    "sentry": "skipped",
    "timestamp": "2020-10-18 15:30:05"
}

岗哨一体化

导出您的Sentry DSN 融入当地环境。在

  • 一种简单的方法是将其放入本地.env文件中并使用 ^{}要填充环境:
# On the command line:SENTRY_DSN=YOUR_SENTRY_DSN
echo"SENTRY_DSN=${SENTRY_DSN}" >> .env

然后在实例化记录器之前,在Python代码中加载.env文件,例如:

fromdotenvimportfind_dotenv,load_dotenvload_dotenv(find_dotenv())importstructlog_sentry_loggerLOGGER=structlog_sentry_logger.get_logger()

将自定义上下文直接记录到Sentry

使用structlog,您甚至可以在异常处理中合并自定义消息,这些消息将自动报告给Sentry(多亏了structlog-sentry模块):

importuuidimportstructlog_sentry_loggerLOGGER=structlog_sentry_logger.get_logger()curr_user_logger=LOGGER.bind(uuid=uuid.uuid4().hex)# LOGGER instance with bound UUIDtry:curr_user_logger.warn("A dummy error for testing purposes is about to be thrown!")x=1/0exceptZeroDivisionErroraserr:ERR_MSG=("I threw an error on purpose for this example!\n""Now throwing another that explicitly chains from that one!")curr_user_logger.exception(ERR_MSG)raiseRuntimeError(ERR_MSG)fromerr
{
    "event": "A dummy error for testing purposes is about to be thrown!",
    "level": "warning",
    "logger": "docs_src.sentry_integration",
    "sentry": "skipped",
    "timestamp": "2020-10-18 15:29:55",
    "uuid": "181e0e00b9034732af4fed2b8424fb11"
}
{
    "event": "I threw an error on purpose for this example!\nNow throwing another that explicitly chains from that one!",
    "exception": 'Traceback (most recent call last):\n  File "/app/structlog-sentry-logger/docs_src/sentry_integration.py", line 10, in <module>\n    x = 1 / 0\nZeroDivisionError: division by zero',
    "level": "error",
    "logger": "docs_src.sentry_integration",
    "sentry": "sent",
    "sentry_id": null,
    "timestamp": "2020-10-18 15:29:55",
    "uuid": "181e0e00b9034732af4fed2b8424fb11"
}
Traceback (most recent call last):
  File "/app/structlog-sentry-logger/docs_src/sentry_integration.py", line 10, in <module>
    x = 1 / 0
ZeroDivisionError: division by zero

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/app/structlog-sentry-logger/docs_src/sentry_integration.py", line 17, in <module>
    raise RuntimeError(ERR_MSG) from err
RuntimeError: I threw an error on purpose for this example!
Now throwing another that explicitly chains from that one!

输出:格式化和存储

默认行为是将JSON日志直接流式传输到标准输出 流like a proper 12 Factor App。在

对于本地开发,它通常有助于美化日志记录到stdout和save JSON会记录到项目目录根目录下的.logs文件夹,以便以后使用 调试。要启用此行为,请设置以下环境变量 (例如通过^{}Sentry Integration部分):

CI_ENVIRONMENT_SLUG=dev-local

在此过程中,通过前面的异常处理示例,我们将得到:

摘要

就这样。现在没有借口了。 走出去,带着不认识任何人的骄傲去计划 在制作中会嘲笑你!因为没有正确地记录日志。你自己一个人 为了其他的东西。在

进一步阅读

^{}:Python的结构化日志

^{}:监视并修复rea中的崩溃l时间。

^{}:为Sentry集成提供^{}SentryProcessor

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
使用多个参数的枚举   从Oracle到Redis的java复制表   java如何保护tomcat服务器中的db用户名和密码。xml   java如何使用注册密钥保护移动应用程序?   java在什么情况下超类不应该是抽象的?   java Backspace键在macOS上的Scala REPL中不起作用   arduino Java+Uno+RFID:调用方法读取Java中的RFID   带有where语句中集合的java JPA查询   java如何向基于Tyrus注释的客户端添加请求头   java对我的二进制搜索算法的反馈   java重新访问数据库时文件的内容不正确   用户在字符串中输入值后退出While循环(Java)   java如何在Maven中的多个项目之间共享项目依赖关系?   java Close从未在数据库上被明确调用   在java中从文件读入布尔矩阵   Java:如何使用父节点将XML流拆分为小型XML文档。VTDXML