安装
编辑安装编辑
$ python -m pip install ecs-logging
入门编辑
ecs-logging-python
为标准库 logging
模块和 structlog
包提供格式化程序。
标准库 logging
模块编辑
import logging import ecs_logging # Get the Logger logger = logging.getLogger("app") logger.setLevel(logging.DEBUG) # Add an ECS formatter to the Handler handler = logging.StreamHandler() handler.setFormatter(ecs_logging.StdlibFormatter()) logger.addHandler(handler) # Emit a log! logger.debug("Example message!", extra={"http.request.method": "get"})
{ "@timestamp": "2020-03-20T18:11:37.895Z", "log.level": "debug", "message": "Example message!", "ecs": { "version": "1.6.0" }, "http": { "request": { "method": "get" } }, "log": { "logger": "app", "origin": { "file": { "line": 14, "name": "test.py" }, "function": "func" }, "original": "Example message!" } }
排除字段编辑
您可以使用 StdlibFormatter
构造函数中的 exclude_fields
选项来排除收集的字段。
from ecs_logging import StdlibFormatter formatter = StdlibFormatter( exclude_fields=[ # You can specify individual fields to ignore: "log.original", # or you can also use prefixes to ignore # whole categories of fields: "process", "log.origin", ] )
限制堆栈跟踪编辑
StdlibLogger
会自动将 exc_info
收集到 ECS error.*
字段中。如果您希望控制 error.stack_trace
中包含的堆栈帧数,可以使用 stack_trace_limit
参数(默认情况下会收集所有帧)。
from ecs_logging import StdlibFormatter formatter = StdlibFormatter( # Only collects 3 stack frames stack_trace_limit=3, ) formatter = StdlibFormatter( # Disable stack trace collection stack_trace_limit=0, )
Structlog 示例编辑
请注意,structlog 处理器应为列表中的最后一个处理器,因为它会处理转换为 JSON 以及 ECS 字段丰富。
import structlog import ecs_logging # Configure Structlog structlog.configure( processors=[ecs_logging.StructlogFormatter()], wrapper_class=structlog.BoundLogger, context_class=dict, logger_factory=structlog.PrintLoggerFactory(), ) # Get the Logger logger = structlog.get_logger("app") # Add additional context logger = logger.bind(**{ "http": { "version": "2", "request": { "method": "get", "bytes": 1337, }, }, "url": { "domain": "example.com", "path": "/", "port": 443, "scheme": "https", "registered_domain": "example.com", "top_level_domain": "com", "original": "https://example.com", } }) # Emit a log! logger.debug("Example message!")
{ "@timestamp": "2020-03-26T13:08:11.728Z", "ecs": { "version": "1.6.0" }, "http": { "request": { "bytes": 1337, "method": "get" }, "version": "2" }, "log": { "level": "debug" }, "message": "Example message!", "url": { "domain": "example.com", "original": "https://example.com", "path": "/", "port": 443, "registered_domain": "example.com", "scheme": "https", "top_level_domain": "com" } }
Elastic APM 日志关联编辑
ecs-logging-python
支持从 Elastic APM Python 代理 自动收集 ECS 跟踪字段,以便将日志 与 Elastic APM 中的跨度、事务和跟踪相关联。
您也可以通过在 Elastic APM Python 代理中设置 LOG_ECS_REFORMATTING=override
来快速在您的 Python 应用程序中启用 ECS 格式的日志。
安装 Filebeat编辑
将日志格式化为 ECS 后,最好使用 Filebeat 收集日志。
- 请按照 Filebeat 快速入门 指南操作。
- 将以下配置添加到您的
filebeat.yaml
文件中。
对于 Filebeat 7.16+
filebeat.yaml。
filebeat.inputs: - type: filestream paths: /path/to/logs.json parsers: - ndjson: overwrite_keys: true add_error_key: true expand_keys: true processors: - add_host_metadata: ~ - add_cloud_metadata: ~ - add_docker_metadata: ~ - add_kubernetes_metadata: ~
使用 filestream 输入从活动日志文件中读取行。 |
|
解码后的 JSON 对象中的值会覆盖 Filebeat 通常添加的字段(类型、源、偏移量等),以防发生冲突。 |
|
如果出现 JSON 反序列化错误,Filebeat 会添加 “error.message” 和 “error.type: json” 密钥。 |
|
Filebeat 会递归地解除解码后的 JSON 中的点分隔符密钥,并将它们扩展到分层对象结构中。 |
|
处理器可以增强您的数据。请参阅 处理器 了解更多信息。 |
对于 Filebeat < 7.16
filebeat.yaml。
filebeat.inputs: - type: log paths: /path/to/logs.json json.keys_under_root: true json.overwrite_keys: true json.add_error_key: true json.expand_keys: true processors: - add_host_metadata: ~ - add_cloud_metadata: ~ - add_docker_metadata: ~ - add_kubernetes_metadata: ~
- 确保您的应用程序将日志记录到 stdout/stderr。
- 请按照 在 Kubernetes 上运行 Filebeat 指南操作。
- 启用 提示驱动的自动发现(取消
filebeat-kubernetes.yaml
中相应部分的注释)。 - 将这些注释添加到使用 ECS 记录器的 Pod 中。这将确保正确解析日志。
- 确保您的应用程序将日志记录到 stdout/stderr。
- 请按照 在 Docker 上运行 Filebeat 指南操作。
- 启用 提示驱动的自动发现。
- 将这些标签添加到使用 ECS 记录器的容器中。这将确保正确解析日志。
docker-compose.yml。
有关更多信息,请参阅 Filebeat 参考。