未提供项目说明
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,添加了名称空间和全局覆盖的概念。在
- 项目
标签: