如何使用Python日志记录将结构化日志发送到带有自定义字段的ELK Stack?

问题描述 投票:0回答:1

我正在开发一个Python应用程序,我想将日志发送到ELK堆栈。但是,我正在努力将自定义字段添加到日志条目中,以便它们在 Kibana 中显示为单独的字段,而不仅仅是在“消息”字段内。我对 ELK 堆栈比较陌生,因此我们将不胜感激。

我尝试使用自定义格式化程序,但所有字段仍然最终位于 Kibana 的“消息”字段内。这是我当前的 Python 脚本:

import logging

from logstash_async.formatter import LogstashFormatter

try:
    import json
except ImportError:
    import simplejson as json

from logstash_async.handler import AsynchronousLogstashHandler


class CustomLogstashFormatter(LogstashFormatter):
    def format(self, record):
        log_record = {
            "timestamp": self._format_timestamp(record.created),
            "level": record.levelname,
            "logger": record.name,
            "message": record.getMessage(),
            "filename": record.pathname,
            "funcName": record.funcName,
            "appName": "MyPythonApp"
        }
        if record.exc_info:
            log_record['exception'] = self._format_exception(record.exc_info)

        return json.dumps(log_record)


def activate_logging() -> None:
    logstash_handler = AsynchronousLogstashHandler("0.0.0.0", 5000, database_path=None)
    logstash_handler.setFormatter(CustomLogstashFormatter())
    logging.basicConfig(
        level=logging.INFO,
        force=True,
        handlers=[logstash_handler]
    )

尽管如此设置,所有日志字段都嵌套在“消息”字段中。 enter image description here

我研究并发现了一些关于更改logstash.conf文件以正确解析日志字段的建议,但目前我无法修改Logstash配置。

有什么方法可以直接从应用程序实现我的目标吗?

任何帮助或指导将不胜感激。

python elasticsearch logging logstash kibana
1个回答
0
投票

事实证明,实际上唯一的方法是更新logstash .conf。我不想做的是添加过滤器或插件,但实际上这只是我如何定义输入部分的问题。我的配置如下:

input {
    tcp {
        port => 5000
    }
}

output {
    elasticsearch {
        hosts => "elasticsearch:9200"
    }
}

由于未指定编解码器,因此数据被视为纯文本。通过将其更新为以下内容,它设法将“消息”解压到字段中。

input {
    tcp {
        port => "5000"
        type => syslog
        codec => json_lines
    }
}

output {
    elasticsearch {
        hosts => "elasticsearch:9200"
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.