我正在开发一个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]
)
我研究并发现了一些关于更改logstash.conf文件以正确解析日志字段的建议,但目前我无法修改Logstash配置。
有什么方法可以直接从应用程序实现我的目标吗?
任何帮助或指导将不胜感激。
事实证明,实际上唯一的方法是更新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"
}
}