你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

适用于 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 配置不匹配的事件。

注意

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

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

注意

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

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

问题

可能会遇到以下问题:

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

症状

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

原因

用于 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检查磁盘以确定哪些文件导致磁盘已满。 例如:

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