用于格式化Rsyslog日志以与Arcsight模板一起使用的RegEx

时间:2019-05-09 02:10:44

标签: regex rsyslog

我一直在尝试摆脱由arcsight连接器读取的空格或字符的问题,我一直尝试使用带有正则表达式的模板,但运气不好-问题是arcsight无法解析一个字段中的所有内容,因为它无法识别格式为CEF

我一直在尝试使用两个模块omfwd和omfile都没有用

OMFWD原始日志样本

 CEF:0|Symantec|Messaging Gateway||ASA|CEF: 0\|CISCO\|ASA\|\|305011\|Built dynamic TCP translation\|Low\| eventId=41069435 proto=TCP

OMFILE原始日志示例

2019-05-08T20:55:04.913701+00:00  CEF: 0|CISCO|ASA||302013|Built outbound TCP connection|Low| eventId=17363056 externalId=116395008 proto=TCP 

我想用这种方式格式化消息

CEF:0 | CISCO | ASA || 302013 |内置出站TCP连接|低| eventId = 17363056 externalId = 116395008 proto = TCP

没有空格或其他任何东西

这是我们尝试使用的模板:

$template outfmt,"%msg:R,ERE,1:(.*) CEF: --end% CEF: %msg:R,ERE,1: CEF: (.*)--end%\n"


$template outfmt,"%msg:R,ERE,1,\?(.*)\sCEF\:\s\?(.*)--end% CEF: %msg:R,ERE,1,\?(.*)CEF\:\?(.*)--end%\n"

在rsyslog网站上,任何可以提供此文档帮助的人都真的很穷。

2 个答案:

答案 0 :(得分:1)

您不能仅使用CEF SYSLOG连接器来剪切syslog标头和进程吗? 也许将其设置为转发器。

答案 1 :(得分:0)

如果您希望设计一个表达式来删除不需要的空格,this expression可能会给您一个想法。

^(.+)([A-Z]{3}:)(\s+)([A-Z0-9|=]+)(.*\S\s*?)

,您可以根据需要简化或添加更多边界。

我假设您的输入字符串中还有一些多余的空格。我只看到了两个不需要的空格实例,一个在$3组中,另一个在结尾处,我已经使用组()捕获了它们,您可以简单地删除这些空格。如果可能还有更多空间,则可以在可能存在额外空间的地方添加这些捕获组。

我的边界放宽了,例如([A-Z0-9|=]+),它只是简单地刷了一些字母和数字而没有逻辑。我这样做是因为我不知道您的实例会是什么样。您可以根据需要限制它们。

enter image description here

此图显示了表达式的工作方式,您可以在此link中可视化其他表达式:

enter image description here

性能测试

此JavaScript代码段使用简单的100万次for循环来显示该表达式的性能。

const repeat = 1000000;
const start = Date.now();

for (var i = repeat; i >= 0; i--) {
	var string = '2019-05-08T20:55:04.913701+00:00   CEF:    0|CISCO|ASA||302013|Built outbound TCP connection|Low| eventId=17363056 externalId=116395008 proto=TCP               ';
	var regex = /^(.+)([A-Z]{3}:)(\s+)([A-Z0-9|=]+)(.*\S\s*?)(.*)/gm;
	var match = string.replace(regex, "$2$4$5");
}

const end = Date.now() - start;
console.log("YAAAY! \"" + match + "\" is a match  ");
console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test.  ");