简单库,用于将JSON格式日志输出到stdout
项目描述
前几天我在亚马逊的ECS上运行了一些容器并将日志记录到cloudwatch。然后我了解到cloudwatch可以解析JSON日志,所以我当然想让Sanic也输出JSON格式的日志。
理想情况下,这个库对大家都有用,如果不是这样,请提出问题,我们会努力改进它 :)
安装
pip install sanic-json-logging
请参阅examples/simple.py以获取完整的工作示例,但以下命令将让您开始使用
import sanic
from sanic_json_logging import setup_json_logging
app = sanic.Sanic(name="somename")
setup_json_logging(app)
setup_json_logging执行以下操作:
更改默认日志格式为JSON格式
同时过滤掉无Keepalive警告
除非特别说明,否则将更改asyncio任务工厂,以实现一些基本的任务本地存储。
安装请求前和请求后的中间件。请求前中间件用于计时任务并生成一个uuid4请求ID。请求后中间件用于输出访问日志。
如果存在,将使用AWS X-Forwarded-For IP在访问日志中
如果 setup_json_logging 改变了任务工厂,则从请求任务创建的所有任务都将包含请求 ID。您可以将 disable_json_access_log=True 传递给设置函数,这将禁用 JSON 访问日志的配置。将 configure_task_local_storage 设置为 false 将禁用在任务对象内部存储请求 ID,这将
目前我将其输出为访问日志,如下所示
{
"timestamp": "2018-06-09T17:42:52.195701Z",
"level": "INFO",
"method": "GET",
"path": "/endpoint1",
"remote": "127.0.0.1:33468",
"user_agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36",
"host": "localhost:8000",
"response_time": 0.0,
"req_id": "795617c7-b514-4ed9-bb63-cc4fcd883c3d",
"logger": "sanic.access",
"status_code": 200,
"length": 0,
"type": "access"
}
如果您在请求内的根记录器中记录,它将看起来像这样。
{
"timestamp": "2018-06-09T17:42:52.195326Z",
"level": "INFO",
"message": "some informational message",
"type": "log",
"logger": "root",
"filename": "simple.py",
"lineno": 16,
"req_id": "795617c7-b514-4ed9-bb63-cc4fcd883c3d"
}
默认情况下,此包将异常(带跟踪信息)记录为字符串,您可能还想将跟踪信息渲染为 JSON。要实现此目的,只需提供替代格式化程序。首先使用此包及其可选依赖项安装此包
pip install sanic-json-logging[extratb]
然后注入另一个格式化程序
from sanic_json_logging import LOGGING_CONFIG_DEFAULTS as cfg
cfg["formatters"]["generic"]["class"] = "sanic_json_logging.formatters.JSONTracebackJSONFormatter"
setup_json_logging(app, disable_json_access_log=True, config=cfg)
在您的所有跟踪信息都正确格式化为 JSON 之后
{
"timestamp": "2021-08-26T23:19:49.412293Z",
"level": "ERROR",
"message": "Exception occurred while handling uri: 'http://127.0.0.1:8000/'",
"type": "exception",
"logger": "sanic.error",
"worker": 31915,
"filename": "handlers.py",
"lineno": 146,
"traceback": {
"exc_type": "Exception",
"exc_msg": "foo",
"exc_tb": {
"frames": [
{
"func_name": "handle_request",
"lineno": 770,
"module_name": "sanic.app",
"module_path": "/python3.9/site-packages/sanic/app.py",
"lasti": 182,
"line": " response = await response"
},
{
"func_name": "root",
"lineno": 20,
"module_name": "api.general",
"module_path": "/api/general.py",
"lasti": 6,
"line": " raise Exception(\"foo\")"
}
]
}
},
"req_id": "f128370f-b949-44e7-bb94-4635bbcad486"
}
变更日志
4.1.2
@digitalkaoz 使用跟踪信息格式化程序修复了更多错误
4.1.1
更新测试以使用替代跟踪信息格式化程序
4.1.0
添加了设置自定义格式化程序的功能
添加了可选的详细跟踪信息格式化程序
4.0.1
正确禁用访问日志
4.0.0
添加了 flake8、black、isort、mypy
放弃 Travis,转而使用 Github Actions
从 setup.py 切换到使用 Poetry
更新测试以使用 sanic-testing
3.2.0
更新以使用新的 request.ctx 上下文字典
添加了对 Python 3.7 asyncio 变更的支持
3.1.0
如果 LogRecord 消息不是 JSON 可序列化的,则将其转换为字符串
3.0.0
添加了禁用任务本地存储的选项
2.0.0
删除了 NoAccessLogSanic 子类,以设置参数代替
1.3.0
将请求 ID 添加到 request 字典中
修复了迁移到 travis.com
1.2.0
修复了 UA 标头错误,修复了测试
1.1.1
基本上是第一个不错的版本
项目详情
sanic-json-logging-4.1.2.tar.gz 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c2eaf003a2cead2733addd02e1372f98038bf22374ac8d16e93dd1a8e0038583 |
|
MD5 | 10b2429c672d01132a76893eecb3c4fc |
|
BLAKE2b-256 | cebeb1b60fc12917fbfd9abada844012274a661891cc65ebb4ffce68c1300f0a |