你当前正在访问 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 中不存在的任何facility
或severity
。 - Azure Monitor 代理尝试根据RFC3164和RFC5424分析事件。 它还知道如何分析此网站中列出的消息格式。
- Azure Monitor 代理标识 DCR 配置中 Syslog 事件的目标终结点并尝试上传事件。
注意
默认情况下,Azure Monitor 代理使用本地持久性。 如果上传失败,从
rsyslog
或syslog-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
中的其他配置进行转发。
例如,要从
/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
sudo systemctl restart rsyslog