我已配置rsyslog
并设置以下值:
$template serverlog, "/var/log/TEST/%HOSTNAME%/server.log"
local4.* ?serverlog
现在代码将创建基于 的文件夹%HOSTNAME%
,但我想首先在服务器名称(公司名称)上创建文件夹,然后在 上创建文件夹HOSTNAME
。
例如:我有 3 个服务器用于 2 个不同的公司ABCD
和xyz
,它们的 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
为每个客户添加另一份声明。