未提供项目说明

isentia-common-python的Python项目详细描述


Isentia Python通用工具

这个库收集在Isentia中跨存储库和项目共享的工具和代码。在

使用此库的说明

安装简单:

pip install isentia-common-python

现在这个库只包含json日志代码。我们以后可能会添加更多功能。在

JSON日志记录

作者:内维尔·图蒙、托尼·托马斯、科恩·多特洛伊涅

请将以下内容放在应用程序开头附近的某个位置。在

^{pr2}$

现在像往常一样使用日志记录。在

importlogginglogging.info("Hello world!")logging.warning("Hello world!",extra={"http_code":418,"reply":"I'm a teapot"})

这会打印出来

{"asctime": "2020-07-06 13:01:46,859", "name": "root", "levelname": "INFO", "message": "Hello world!"}
{"asctime": "2020-07-06 13:01:46,859", "name": "root", "levelname": "WARNING", "message": "Hello world!", "my_namespace": {"http_code": 418, "reply": "I'm a teapot"}}

如您所见,它将输出结构为JSON并添加典型字段。您可以在记录对象时使用“extra”参数。当您执行init_json_logging("my_namespace")操作时,所有这样记录的对象都将放入您在init调用中指定的命名空间中。在

名称空间使得在ElasticSearch/Kibana等工具中搜索日志变得非常容易。特别是,它可以防止与希望使用相同字段名的其他团队或项目发生冲突。在

默认情况下,日志记录级别设置为INFO。您可以像正常情况一样覆盖它,使用

logging.getLogger().setLevel(logging.DEBUG)

更多字段

默认情况下,我们只打印时间、记录器名称(通常是根)、级别、消息和额外字段。如果需要更高的可见性,可以启用extended模式。在

init_json_logging("my_namespace",extended=True)logging.info("Hello world!")

启用extended还将在JSON中包括进程id、文件名、lineno和funcname:

{"asctime": "2020-07-06 13:48:38,015", "name": "root", "levelname": "INFO", "message": "Hello world!", "process": 8015, "filename": "inspect_logging.py", "lineno": 8, "funcName": "<module>"}

模块级记录器

所有Python日志记录都将输出JSON。特别是,模块级日志记录器还将记录到JSON。(顺便说一句,代码通常不需要模块级记录器)

module_lvl_logger=logging.getLogger("special.module")module_lvl_logger.setLevel(logging.DEBUG)module_lvl_logger.debug("an info message",extra={"http_status_code":200,"endpoint":"/api/no-problemo"})

将打印

{"asctime": "2020-07-06 13:01:46,859", "name": "special.module", "levelname": "DEBUG", "message": "an info message", "my_namespace": {"http_status_code": 200, "endpoint": "/api/no-problemo"}}

只有“名称”字段会更改。在

全局覆盖

现在你可能会想:太好了,所有字段都有名称空间,但是如果我想跨项目/应用跟踪一个字段呢?或者像tracu id?我仍然希望我的应用程序具有不同的名称空间,但我也希望能够记录一些全局的字段,即位于命名空间之外的字段。在

对于这个用例,我们将额外字段“global”设置为一个特殊字段,它从“extra”中移出。请看以下示例:

importlogginglogging.info("Hello world!",extra={"http_code":418,"reply":"I'm a teapot","global":{"request_id":50}})

这会打印出来

{"asctime": "2020-07-06 13:01:46,859", "name": "root", "levelname": "INFO", "message": "info with global", "global": {"request_id": 50}, "my_app_name": {"http_code": 418, "reply": "I'm a teapot"}}

简而言之,字段“global”类似于共享名称空间。只要把你需要的东西放进去,因为你可能会和其他球队发生冲突。在

常数

如果您希望在每个日志消息中都包含一个全局变量(例如trace_id或request_id) 您可以在init调用中设置它。在

init_json_logging('my_namespace',constants={'trace_id':123})logging.info("Hello world!",extra={"http_code":418,"reply":"I'm a teapot","global":{"request_id":50}})

这会打印出来

{"asctime": "2020-07-06 13:01:46,859", "name": "root", "levelname": "INFO", "message": "info with global", "global": {"trace_id":123, "request_id": 50}, "my_app_name": {"http_code": 418, "reply": "I'm a teapot"}}

其他消息都将在全局命名空间中包含trace_id。在

低层次细节

此库建立在python-json-logger之上。我们通过monkey补丁扩展了pythonjson logger,添加了名称空间和全局覆盖的概念。在

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

推荐PyPI第三方库


热门话题
java不兼容类型:MainActivity无法转换为LifecycleOwner   java安卓是一种更有效的读取大文本文件的方法   java导出LWJGL本地人与项目?(IntelliJ IDEA)   JDK更新后,JavaJShell不再在下一行打印输出   父类对象上的继承Java比较子属性   Java:有没有一个容器可以有效地结合HashMap和ArrayList?   安卓 Java对象指针   java在annotationdriven Spring MVC应用程序中实现大气   java 安卓源代码构建应用找不到安卓supportv4。罐子   文件系统上的抽象层和Java中的jar/zip   java在水平滚动视图中添加多个图像?   java如何从firebase实时数据库中获取字符串数组   WIndows 10工作站上的java未满足链接错误   java命令在终端中工作,但在使用过程中出现“无结束引号”错误。执行官