用于格式化 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 和进程吗?
也许将其设置为转发器。
我一直在尝试去除 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 和进程吗? 也许将其设置为转发器。