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

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

注意

本文引用了 CentOS,这是一个处于生命周期结束 (EOL) 状态的 Linux 发行版。 请相应地考虑你的使用和规划。 有关详细信息,请参阅 CentOS 生命周期结束指南

适用于 Linux 的 Azure Monitor 代理的 Syslog 集合和受支持的 RFC 标准的概述:

  • Azure Monitor 代理在安装过程中为系统 Syslog 守护程序安装输出配置。 配置文件指定事件在 Syslog 守护程序和 Azure Monitor 代理之间的流动方式。
  • 对于 rsyslog(大多数 Linux 发行版),配置文件是 /etc/rsyslog.d/10-azuremonitoragent-omfwd.conf。 对于 syslog-ng,配置文件是 /etc/syslog-ng/conf.d/azuremonitoragent-tcp.conf
  • Azure Monitor 代理侦听 TCP 端口以接收来自 rsyslog / syslog-ng 的事件。 此通信的端口记录在 /etc/opt/microsoft/azuremonitoragent/config-cache/syslog.port 中。

    注意

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

  • 当 Azure Monitor 代理引入延迟或无法访问 Azure Monitor 代理时,Syslog 守护程序会使用队列。
  • Azure Monitor 代理通过前面提到的套接字引入 Syslog 事件,并根据/etc/opt/microsoft/azuremonitoragent/config-cache/configchunks/中数据收集规则 (DCR) 配置中的设施或严重性组合对其进行筛选。 会删除 DCR 中不存在的任何facilityseverity
  • Azure Monitor 代理尝试根据RFC3164RFC5424分析事件。 它还知道如何分析此网站中列出的消息格式。
  • Azure Monitor 代理标识 DCR 配置中 Syslog 事件的目标终结点并尝试上传事件。

    注意

    默认情况下,Azure Monitor 代理使用本地持久性。 如果上传失败,从rsyslogsyslog-ng中接收的所有事件会在/var/opt/microsoft/azuremonitoragent/events中排队。

问题

可能会遇到以下问题。

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

后续部分会介绍此问题。

症状

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

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/CentOS 系列 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. 例如,要从/var/log/syslog/var/log/messages处的记录中移除local4事件,请从此片段中更改/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