适用于 Linux 的 Azure Monitor 代理的 Syslog 故障排除指南

Azure Monitor 代理在安装过程中为系统的 Syslog 守护程序安装输出配置。 此配置定义如何将事件从守护程序转发到 Azure Monitor 代理,并位于:

  • /etc/rsyslog.d/10-azuremonitoragent-omfwd.conf 用于 rsyslog (大多数 Linux 发行版)
  • /etc/syslog-ng/conf.d/azuremonitoragent-tcp.conf for syslog-ng

Azure Monitor 代理会侦听 TCP 端口(记录于 /etc/opt/microsoft/azuremonitoragent/config-cache/syslog.port),以接收来自 rsyslog 或 syslog-ng 的事件。 它根据位于/etc/opt/microsoft/azuremonitoragent/config-cache/configchunks/的数据收集规则(DCR)中定义的类别或严重性值来筛选这些事件。 删除与 DCR 配置不匹配的事件。

Note

在版本 1.28 之前,Azure Monitor 代理使用 Unix 域套接字而不是 TCP 端口从 rsyslog 接收事件。 rsyslogomfwd 中的 输出模块提供后台处理和重试机制,以提高可靠性。

Azure Monitor 代理根据 RFC3164RFC5424 分析传入的 Syslog 消息,还支持 其他格式。 它确定 DCR 中每个事件的目标终结点,并尝试相应地上传它们。

Note

  • 如果 Azure Monitor 代理无法访问或遇到延迟,则 Syslog 守护程序会使用其内部队列缓冲事件。

  • 如果 Azure Monitor 代理无法上传从 rsyslogsyslog-ng 接收的事件,则会使用其本地持久性机制将它们排入 /var/opt/microsoft/azuremonitoragent/events 队列。

Issues

可能会遇到以下问题:

由于适用于 Linux 的 Azure Monitor 代理存在磁盘空间已满问题,Rsyslog 数据未上传

Symptom

Syslog 数据未上传:检查错误日志 /var/opt/microsoft/azuremonitoragent/log/mdsd.err时,在 将项插入本地持久存储时看到有关 Error 的条目...设备上没有剩余空间... 类似于以下代码片段:

2021-11-23T18:15:10.9712760Z: Error while inserting item to Local persistent store syslog.error: IO error: No space left on device: While appending to file: /var/opt/microsoft/azuremonitoragent/events/syslog.error/000555.log: No space left on device

Cause

用于 Linux 的 Azure Monitor 代理会在引入之前将事件缓冲到 /var/opt/microsoft/azuremonitoragent/events。 在默认的适用于 Linux 的 Azure Monitor 代理安装中,此目录在空闲时占用约 650 MB 的磁盘空间。 在持续的日志记录负载下,磁盘上的大小会增加。 它会每隔 60 秒清理一次,当负载恢复为空闲时,会减少到约 650 MB。

确认磁盘空间已满的问题

df 命令显示 /dev/sda1 上几乎没有可用空间,如以下输出中所示。 应检查与日志目录(例如, /var/log/var 或) /关联的行项。

df -h
Filesystem Size  Used Avail Use% Mounted on
udev        63G     0   63G   0% /dev
tmpfs       13G  720K   13G   1% /run
/dev/sda1   29G   29G  481M  99% /
tmpfs       63G     0   63G   0% /dev/shm
tmpfs      5.0M     0  5.0M   0% /run/lock
tmpfs       63G     0   63G   0% /sys/fs/cgroup
/dev/sda15 105M  4.4M  100M   5% /boot/efi
/dev/sdb1  251G   61M  239G   1% /mnt
tmpfs       13G     0   13G   0% /run/user/1000

可以使用du检查磁盘以确定哪些文件导致磁盘已满。 For example:

cd /var/log
du -h syslog*
6.7G    syslog
18G     syslog.1

在一些情况下,du可能不会报告任何大型文件或目录。 标记为(已删除)的文件可能会占用空间。 当一个进程尝试删除文件时,可能会发生这种情况,但另一个进程仍打开该文件。

可以使用lsof命令检查此类文件。 在下面的示例中,我们看到/var/log/syslog标记为已删除,但占用 3.6 GB 的磁盘空间。 该文件尚未被删除,因为 PID 为 1484 的进程仍在使用该文件。

sudo lsof +L1
COMMAND   PID   USER   FD   TYPE DEVICE   SIZE/OFF NLINK  NODE NAME
none      849   root  txt    REG    0,1       8632     0 16764 / (deleted)
rsyslogd 1484 syslog   14w   REG    8,1 3601566564     0 35280 /var/log/syslog (deleted)

rsyslog 默认配置将所有设施记录到 /var/log/

在一些常见发行版(例如 Ubuntu 18.04 LTS)上,rsyslog 会附带一个默认配置文件(/etc/rsyslog.d/50-default.conf),它会将几乎所有设施的事件记录到/var/log/syslog处的磁盘上。 RedHat 系列 Syslog 事件存储在/var/log/以下,但存储在其他文件中: /var/log/messages

Azure Monitor 代理不依赖记录到/var/log/的 Syslog 事件。 取而代之的是,它将 rsyslog 服务配置为通过 TCP 端口将事件直接转发到 azuremonitoragent 服务进程 (mdsd)。

修复:从 /etc/rsyslog.d/50-default.conf 中删除大容量设施

如果通过 rsyslog 发送大量日志,并且系统已设置为记录这些设施的事件,请考虑修改默认的 rsyslog 配置,以避免记录并将它们存储在/var/log/下。 此设施的事件仍将转发到 Azure Monitor 代理,因为 rsyslog 使用放置在/etc/rsyslog.d/10-azuremonitoragent-omfwd.conf中的其他配置进行转发。

  1. 例如,要从local4/var/log/syslog处的记录中移除/var/log/messages事件,请从此片段中更改/etc/rsyslog.d/50-default.conf中的此行:

    *.*;auth,authpriv.none          -/var/log/syslog
    

    对于此片段(添加到local4.none;):

    *.*;local4.none;auth,authpriv.none          -/var/log/syslog
    
  2. sudo systemctl restart rsyslog