Syslog-ng - 写入今天的日志文件时触及了 6 天前的日志文件

Syslog-ng - 写入今天的日志文件时触及了 6 天前的日志文件

几乎每次 syslog-ng 写入当前日志文件时,它都会触及 6 天前的日志文件。它不会将任何数据写入旧日志文件,只是更新其最后修改时间戳。 日志文件的屏幕截图

我不能 100% 确定为什么它在过去两天的 26 日和 27 日中午之前停止更新文件的最后修改时间戳,但我认为这可能只是巧合。我在过去两天的那个时间重新启动了 syslog-ng 服务和 VMware 主机的 syslog 服务,这可能已经停止了对旧文件的接触。话虽如此,我今天早上再次重新启动了服务,但这种情况仍然发生。

我们目前正在从 24 台 VMware 主机捕获日志。每台主机的日志文件都存储在自己的目录中,每天都会生成一个新文件。这种情况只发生在一台主机的日志文件中。所有主机名都非常相似(group1-esx01…08、group2-esx01…08、group3-esx01…08),因此过滤问题似乎不能解释为什么这种情况只发生在一个文件夹中的日志中。

我们使用默认的 syslog-ng.conf 文件,并将配置放在位于 conf.d 目录中的单个文件中。该文件如下所示:

#Global network listener
source s_network {
    network(
        ip("1.1.1.1")
        port(1514)
        max-connections(100)
        transport("tls")
        tls(
            key_file("/etc/syslog-ng/cert/PrivateKey.pem")
            cert_file("/etc/syslog-ng/cert/PublicKey.pem")
            peer_verify(optional-untrusted)
        )
    );
};
#VMware
#Dir for each host, file for each day.
destination d_vmware {
    file(
        "/var/log/vmware/$HOST/$YEAR$MONTH$DAY.log"
        perm(0644)
        create_dirs(yes)
    );
};

#Only get data from machines who's hostname starts with the prefixes of the various blade groups.
filter f_vmware {
    host("group1-esx*" type(glob)) or
    host("group2-esx*" type(glob)) or
    host("group3-esx*" type(glob));
};

#From global listener to VMware dest
log {
    source(s_network);
    filter(f_vmware);
    destination(d_vmware);
};

我认为找到一个有过这种经历的人是相当困难的。不过,我希望至少有人知道从哪里开始。

谢谢你的时间。

编辑:快速更新,下午 12:12,20170728.log 文件停止更新其最后修改时间戳,而 20170729.log 文件开始更新其最后修改时间戳。

从那时起,我将 20170729.log 设置为不可变,当我尝试以 root 身份触摸该文件时,正如预期的那样,出现了“权限被拒绝”的错误。但是,它仍然更新了上次修改时间!我也没有看到 syslog-ng 报告任何错误。很奇怪。

编辑2: 我找到了解决方案!默认情况下,syslog-ng 使用收到的消息中的时间戳作为日志条目的时间戳,这是有道理的。因此,问题很可能出在主机向 syslog-ng 服务器发送日志消息时。我认为它经常发送带有错误日期的空消息。无论如何,我没有深入研究 ESXi 中可以生成日志消息的所有内容,而是将虚拟机从受影响的主机上迁移出来并重新启动它。这似乎暂时解决了这个问题,这对我来说已经足够了,因为我们将在不久的将来更换这组服务器。

相关内容