我目前正在评估 logstash 和 elasticsearch 是否对我们的用例有用。我所拥有的是一个包含多个条目的日志文件,其形式为
<root>
<entry>
<fieldx>...</fieldx>
<fieldy>...</fieldy>
<fieldz>...</fieldz>
...
<fieldarray>
<fielda>...</fielda>
<fielda>...</fielda>
...
</fieldarray>
</entry>
<entry>
...
</entry>
...
<root>
每个entry
元素将包含一个日志事件。(如果您有兴趣,该文件实际上是一个 Tempo Timesheets (An Atlassian JIRA Plug-in) 工作日志导出。)
是否可以在不编写我自己的编解码器的情况下将这样的文件转换为多个日志事件?
好吧,我找到了一个对我有用的解决方案。该解决方案的最大问题是 XML 插件......不是很不稳定,但要么记录不充分且存在错误,要么记录不充分且不正确。
TLDR
bash 命令行:
Logstash 配置:
详细的
我的解决方案有效,因为至少在
entry
关卡之前,我的 XML 输入非常统一,因此可以通过某种模式匹配来处理。由于导出基本上是一行非常长的 XML,而 logstash xml 插件基本上只适用于包含 XML 数据的字段(读取:行中的列),我不得不将数据更改为更有用的格式。
Shell:准备文件
gzcat -d file.xml.gz |
: 数据太多了——显然你可以跳过它tr -d "\n\r" |
:删除 XML 元素中的换行符:某些元素可以包含换行符作为字符数据。下一步需要将这些删除或以某种方式编码。尽管它假设此时您将所有 XML 代码放在一个大行中,但此命令是否删除元素之间的任何空白都无关紧要xmllint --format - |
: 用 xmllint 格式化 XML(libxml 自带)在这里,XML ( ) 的单个巨大的意大利面条行
<root><entry><fieldx>...</fieldx></entry></root>
格式正确:日志存储
.conf
(请参阅TL;DR 部分中文件的完整内容。)在这里,
multiline
过滤器可以解决问题。它可以将多行合并为一条日志消息。这就是为什么需要格式化的原因xmllint
:这基本上说缩进超过两个空格的每一行(或者是
</entry>
/ xmllint 默认使用两个空格缩进)属于前一行。这也意味着字符数据不能包含换行符(tr
在 shell 中被剥离)并且 xml 必须被规范化(xmllint)我有一个类似的案例。要解析此 xml:
我使用这个配置来登录:
我希望这可以帮助某人。我需要很长时间才能得到它。