用于格式化 Rsyslog 日志以与 Arcsight 模板一起使用的正则表达式

RegEx for Formating Rsyslog Logs to work with Arcsight Template

我一直在尝试去除 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 网站上的文档真的很差..

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

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

如果需要,您可以对其进行简化或添加更多边界。

我假设您的输入字符串中有一些多余的空格。我只看到两个不需要的空格实例,一个在 </code> 组中,一些在末尾,我使用组 <code>() 捕获了它们,您可以像删除这些空格一样简单。如果可能有更多空间,您可以在可能存在额外空间的地方添加这些捕获组。

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

图表

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

性能测试

这个 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, "");
}

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

您不能只使用 CEF SYSLOG 连接器来删除系统日志 header 和进程吗? 也许将其设置为转发器。