Linux rsyslog修改

Linux rsyslog修改

我已配置rsyslog并设置以下值:

$template serverlog, "/var/log/TEST/%HOSTNAME%/server.log"
local4.* ?serverlog

现在代码将创建基于 的文件夹%HOSTNAME%,但我想首先在服务器名称(公司名称)上创建文件夹,然后在 上创建文件夹HOSTNAME

例如:我有 3 个服务器用于 2 个不同的公司ABCDxyz,它们的 3 个服务器名称(主机名)是:abcdapp-1t abcdapp-2t abcdapp-3t

xyzapp-1t xyzapp-2t xyzapp-3t

现在,如果我运行上面的模板,它将根据 下的主机名创建不同的文件夹/var/log/TEST/,但我需要创建 2 个不同的文件夹ABCD,并且XYZ相对主机名将进入特定目录并创建子文件夹。

例如:需要看起来像这样:

/var/log/TEST/ABCD/abcdapp-1t/server.log
/var/log/TEST/ABCD/abcdapp-2t/server.log
/var/log/TEST/ABCD/abcdapp-3t/server.log

/var/log/TEST/XYZ/xyzapp-1t/server.log
/var/log/TEST/XYZ/xyzapp-2t/server.log
/var/log/TEST/XYZ/xyzapp-3t/server.log

由于我有超过 15 台不同的客户端服务器,我无法用一份声明来完成它。

如何使用If else IF中的语句rsyslog,以便我可以按特定文件夹进行过滤HOSTNAME并移动到特定文件夹?

有什么建议吗?

答案1

如果我们假设您的 HOSTNAME 字段的格式为字母剩余名称开头的字母部分是您的公司名称,您可以使用以下命令将其与字段分开正则表达式属性替换器。将您的模板更改为

$template serverlog, "/var/log/TEST/%hostname:R,ERE,1,FIELD:([^-]+)--end%/%HOSTNAME%/server.log"

正则表达式模式是([^-]+),表示不包括一个或多个字符-。其余部分指定仅应保留扩展正则表达式语法,1的第一个捕获组。,ERE如果没有匹配,则FIELD保留整体。

您必须拥有 rsyslog 版本 3.19.5 或更高版本,或者 4.1.5 或更高版本。如果需要,请参阅上面的链接以更改为大写。


或者,如果您的 rsyslog 是版本 7 或更高版本,您应该能够使用 RainerScript 执行您想要的操作,如下所示:

$template myplate,"/var/log/TEST/%$.customer%/%hostname%/server.log"
if ($hostname startswith "abcd") then set $.customer = "ABCD";
if ($hostname startswith "xyz") then set $.customer = "XYZ";
action(type="omfile" dynaFile="myplate")
stop

这将使用局部变量创建一个模板$.customer。当主机名与每条语句匹配时,为每条消息设置该变量if。将action消息写入计算文件。您可以if为每个客户添加另一份声明。

相关内容