我正在尝试从具有明确定义格式的自定义应用程序中获取日志数据。我试图使用grok过滤器挑选出某些数据,但我没有运气。这是一个示例日志:
- System.Data.SqlClient.SqlException (0x80131904): Arithmetic overflow error converting IDENTITY to data type int.
Arithmetic overflow occurred.
我想要做的是从字符串中提取出SqlException。这是我正在使用的grok:
grok{
match =>
{
"message" =>
[
"(?m)%{DATE:TIMESTAMP_DATE}%{SPACE}%{TIME:TIMESTAMP_TIME}%{SPACE}%{WORD:LOG_LEVEL}%{SPACE}(?<THREAD>[^\s]+)%{SPACE}(?<HOST>[^\s]+)%{SPACE}%{GREEDYDATA:MESSAGE}",
"(?<EXCEPTION>[.*]+)"
]
}
}
我尝试了几种不同的方法,但我想我并不完全理解文档。我期望发生的是我在第一组中提取的所有字段都包括第二组的结果。换句话说:
TIMESTAMP_DATE,TIMESTAMP_TIME,LOG_LEVEL,THREAD,HOST,MESSAGE,EXCEPTION
我完全得到了其他领域,这只是我缺少的额外匹配。任何帮助,将不胜感激。感谢
答案 0 :(得分:1)
如果您指定多个模式grok默认情况下只有外观检查模式,直到遇到第一个匹配。如果您想要匹配这两种模式,无论第一种模式是否匹配,您都可以改变这样的行为:
grok{
break_on_match => false
match =>
{
"message" =>
[
"(?m)%{DATE:TIMESTAMP_DATE}%{SPACE}%{TIME:TIMESTAMP_TIME}%{SPACE}%{WORD:LOG_LEVEL}%{SPACE}(?<THREAD>[^\s]+)%{SPACE}(?<HOST>[^\s]+)%{SPACE}%{GREEDYDATA:MESSAGE}",
"(?<EXCEPTION>[.*]+)"
]
}
}