Zabbix 可用于有/无日志轮询支持的日志文件的集中监控和分析。
当日志文件包含某些字符串或字符串模式时,可以使用通知来警告用户。
要监控日志文件,必须具有如下:
被监控日志文件的大小限制取决于大文件支持。
确保在 代理配置文件 中已设置:
配置一个日志 监控项
所有标有红色星号的为必填字段。
具体日志监控项的输入:
类型 | 这里选择 Zabbix agent (主动) |
键值 | 使用以下项键之一: log[] 或 logrt[]: 这两个监控项键允许监控日志和过滤日志内容正则表达式的条目(如果存在)。 例如: log[/var/log/syslog,error] 。确保文件对“zabbix”用户具有读取权限,否则监控项状态将设置为“不支持”。log.count[] 或 logrt.count[] : 这两个监控项键只允许返回匹配的行数。 有关使用这些监控项键及其参数的详细信息,请参阅支持的 Zabbix agent监控项 键部分。 |
信息类型 | 自动预填: 对于 log[] 或 logrt[] 项 - Log ;对于 log.count[] 或 logrt.count[] items - Numeric (unsigned) 。如果可选地使用 output 参数,您可以手动选择除 Log 之外的适当类型的信息。请注意,选择非 Log 类型的信息将导致本地时间戳丢失。 |
更新间隔 (秒) | 该参数定义了Zabbix agent检查日志文件中任何更改的频率。 将其设置为1秒将确保你能尽快的获得新记录。 |
日志时间格式 | 在此字段中,您可以选择指定解析日志行的时间戳的模式。 如果留空,则不会解析时间戳。 支持的占位符: * y: 年 (0001-9999) * M: 月 (01-12) * d: 日 (01-31) * h: 小时 (00-23) * m: 分 (00-59) * s: 秒 (00-59) 例如, 从Zabbix agent日志文件中查看以下行: " 23480:20100328:154718.045 Zabbix agent started. Zabbix 1.8.2 (revision 11211)." 它以PID的六个字符位置开始,后面跟日期、时间和行的其余部分。 此行的日志时间格式为 "pppppp:yyyyMMdd:hhmmss"。 注意, “p”和“:”字符只是占位符,而且只能是“yMdhms” |
logrt[]
监控项有几个匹配的日志文件,并且Zabbix agent跟随其中最新的日志文件,并删除了最近的日志文件会出现一条警告消息"there are no files matching "<regexp mask>" in "<directory>"
。 Zabbix代理将忽略修改时间小于代理看到的logrt[]
被检查监控项的最近修改时间的日志文件。log[]
或 logrt[]
监控项的 更新间隔 为1秒,那么在默认情况下,代理将分析不超过200条日志文件记录,并在一次检查中向Zabbix server发送不超过20条的匹配记录。通过在代理配置文件中增加MaxLinesPerSecond,或在监控项键中设置 maxlines 参数,一次检查可将分析日志文件记录和发送到Zabbix服务器的1000条匹配记录增加到10000条。如果 更新间隔 设置为2秒,那么一次检查的限制将被设置为高于更新间隔1秒的2倍logrt
的正则表达式,不支持目录正则表达式匹配。logrt[]
监控项将变为NOTSUPPORTED。logrt[]
监控项的日志文件不会使其NOTSUPPORTED。读取logrt[]
监控项的日志文件的错误将作为告警记录到Zabbix agent日志文件中,但不会使监控项变成NOTSUPPORTED。log[]
或logrt[]
监控项会成为NOTSUPPORTED。Zabbix可以监视其代理日志文件,除了在DebugLevel=4时。有时我们可能只想从目标文件中提取感兴趣的值,而不是在找到正则表达式匹配时返回整行。
自Zabbix2.2.0以后,日志监控项能够从匹配的行中提取所需的值。这是在通过log
和logrt
监控项中附加output参数来实现的。
使用“output”参数可以指示我们可能感兴趣的匹配的子组。
例如
应该可以返回在以下内容中找到的条目数:
Fr Feb 07 2014 11:07:36.6690 */ Thread Id 1400 (GLEWF) large result
buffer allocation - /Length: 437136/Entries: 5948/Client Ver: >=10/RPC
ID: 41726453/User: AUser/Form: CFG:ServiceLevelAgreement
Zabbix只返回数字的原因是因为\1 定义的,指的是第一个也是唯一的想要的子组:([0-9]+)
而且,通过提取和返回数字的能力,该值可用于定义触发器。
日志监控项中的“maxdelay”参数允许忽略日志文件中的一些较旧的行,以便在“maxdelay”秒内获取最近分析的行。
指定'maxdelay'>0可能导致忽略重要的日志文件记录和错过的报警,只有在必要时才使用否则后果自负。
默认情况下,日志监控项将跟踪出现在日志文件中的所有新行。 但是,有些应用程序在某些情况下开始在其日志文件中写入大量的消息。例如,如果数据库或DNS服务器不可用,则此类应用程序会向日志文件中注入数千条几乎相同错误消息,直到恢复正常为止。默认情况下,所有这些消息将被完全分析,并将匹配的行发送到配置为log
和logrt
监控项的服务器上。
内置的过载保护包括一个可配置的“maxlines”参数(保护服务器免受过多传入匹配日志行的影响)和 10*“maxlines”限制(保护主机 CPU 和 I/O 免于agent在一次检查中过载) . 尽管如此,内置保护仍存在两个问题。 首先,大量可能不那么有用的消息被报告给服务器并占用数据库空间。 其次,由于每秒分析的行数有限,agent可能会落后于最新的日志记录数小时。 很可能,您可能更愿意尽快了解日志文件中的当前情况,而不是花几个小时在旧记录中爬行。
这两个问题的解决方案是使用“maxdelay”参数。 如果指定 'maxdelay' > 0,则在每次检查处理的字节数时,测量剩余字节数和处理时间。 agent根据这些数字计算估计的延迟——分析日志文件中所有剩余记录需要多少秒。
如果延迟不超过“maxdelay”,那么agent将像往常一样继续分析日志文件。
如果延迟大于“maxdelay”,那么agent将通过“跳转”到一个新的估计位置来忽略日志文件的一个块,以便在“maxdelay”秒内分析剩下的行。
请注意,agent甚至不会将忽略的行读入缓冲区,而是计算要在文件中跳转的大致位置。
跳过日志文件行的事实记录在代理日志文件中,如下所示:
14287:20160602:174344.206 item:"logrt["/home/zabbix32/test[0-9].log",ERROR,,1000,,,120.0]"
logfile:"/home/zabbix32/test1.log" skipping 679858 bytes
(from byte 75653115 to byte 76332973) to meet maxdelay
“to byte”数字是近似的,因为在“跳转”之后,agent将文件中的位置调整到日志行开头,日志行可能在文件中更远或更早。
根据增长速度与分析日志文件的速度的不同,你可能会看到没有"跳转"、少有或经常"跳转"、大或小的"跳转",甚至每次检查中的"跳转"都很小。系统负载和网络延迟的波动也会影响延迟的计算,因此"跳转"可以跟上“maxdelay”参数。
不推荐设置 'maxdelay' <'update interval'(这可能会导致频繁的"jumps")
带有copytruncate
选项的logrt
假定不同的日志文件有不同的记录(至少它们的时间戳不同),因此初始块的MD5(最多512字节)将不同。两个具有相同的MD5初始块和的文件意味着其中一个是原始块,另一个是副本。
使用copytruncate
选项的logrt
将努力正确处理日志文件副本,而不报告副本。但是,与logrt[]监控项更新间隔相比,生成具有相同时间戳的多个日志文件副本、日志文件轮询频率更高、不建议频繁重新启动代理。代理试图合理地处理所有这些情况,但是在所有情况下都不能保证良好的结果。
每一批数据 (包含项目的数据)成功发送到服务器后,项目的持久文件就会更新, 例如, 默认的 'BufferSize'是100。如果一个日志项找到 70 条匹配记录, 那么前 50 条记录将分批发送,持久化文件将被更新,然后剩余 20 条记录将被发送(可能会有一些延迟,更多数据积累) 在第二批中,并且将再次更新持久文件。
来自log[]
和logrt[]
监控项的每个匹配行以及每个log.count[]
和 logrt.count[]
监控项检查的结果都需要代理发送缓冲区中指定的50%区域中的空闲时隙。缓冲区元素定期发送到服务器(或代理服务器),缓冲区可以再次释放。
虽然代理发送缓冲区中的指定日志区域中有空闲时隙,并且代理和服务器(或代理服务器)之间的通信失败,但是日志监控结果在发送缓冲区中累积。这有助于缓解短暂的通信故障。
在较长的通信失败期间,所有日志槽都被占用,并采取以下操作:
log[]
和logrt[]
监控项检查已停止。当通信恢复并且缓冲器中的空闲插槽可用时,从先前的位置恢复检查。若没有匹配的行丢失,稍后再报告.maxdelay = 0
(默认),则log.count[]
和logrt.count[]
监控被停止。 这种行为类似于上述的log[]
和logrt[]
监控项。 请注意,这可能会影响log.count[]
]和logrt.count[]
结果:例如,一次检查计算出日志文件中有100个匹配行,但是由于缓冲区中没有空闲插槽,因此停止检查。 当通信恢复时,代理将计数相同的100条匹配行,还有70条新的匹配行。代理会发送count=170,就像它们在一次检查中发现的一样。log.count[]
和logrt.count[]
]检查与maxdelay > 0
:如果在检查期间没有“跳转”,则行为类似于上述。 如果在日志文件行上发生“跳转”,则保留“跳转”之后的位置,同时计算结果被丢弃。 因此,即使在通信失败的情况下,代理也试图跟上日志文件的增长速度。If a regular expression used in log[]
, logrt[]
, log.count[]
or logrt.count[]
item cannot be compiled by PCRE or PCRE2 library then the item goes into NOTSUPPORTED state with an error message. To continue monitoring the log item, the regular expression should be fixed.
If the regular expression compiles successfully, but fails at runtime (on some or on all log records), then the log item remains supported and monitoring continues. The runtime error is logged in the Zabbix agent log file (without the log file record).
Note that the logging of regular expression runtime errors is supported since Zabbix 6.4.6.
The logging rate is limited to one runtime error per check to allow Zabbix agent to monitor its own log file. For example, if 10 records are analyzed and 3 records fail with a regexp runtime error, one record is produced in the agent log.
Exception: if MaxLinesPerSecond=1 and update interval=1 (only 1 record is allowed to analyze per check) then regexp runtime errors are not logged.
zabbix_agentd logs the item key in case of a runtime error, zabbix_agent2 logs the item ID to help identify which log item has runtime errors. It is recommended to redesign the regular expression in case of runtime errors.
当 Zabbix agent启动,它会从Zabbix server 或 proxy接收活动检查列表。对于 log*[]指标,它接收处理后的日志大小和修改时间,以查找从哪里开始日志文件监控。根据文件系统报告的实际日志文件大小和修改时间,代理决定从已处理的日志大小继续监控日志文件还是从头重新分析日志文件。
正在运行的代理维护大的属性集,用于在检查之间跟踪所有受监视的日志文件。当代理停止时,这种内存状态会丢失。
新的可选参数 persistent_dir 指定了一个目录,用于在文件中存储log[], log.count[], logrt[] or logrt.count[] 监控项的状态。Zabbix agent重启后,从持久化文件中恢复日志监控项的状态。
主要的用户场景是监控位于镜像文件系统中的日志文件,直到某个时刻,日志文件被写入两个镜像。然后镜像被分割。在活动副本上,日志文件仍在增长,获取新记录。Zabbix agent 对其进行分析并将处理后的日志大小和修改时间发送到服务端。在被动副本上,日志文件保持不变,远远落后于活动副本。稍后操作系统和 Zabbix agent从被动副本重新启动。Zabbix agent从服务器接收到的已处理日志大小和修改时间可能对被动副本的情况无效。要从文件系统镜像拆分时代理停止的位置继续进行日志文件监控,代理会从持久文件恢复其状态。
在启动时 Zabbix agent 对持久文件一无所知。只有在收到来自 Zabbix server (proxy)的活动检查列表后,代理才会看到某些日志项应该由指定目录下的持久文件支持。
在代理操作期间,持久文件被打开以进行写入(使用 fopen(filename, "w"))并用最新数据覆盖。如果同时发生覆盖和文件系统镜像拆分,丢失持久文件数据的机会非常小,无需特殊处理。写入持久文件后不会强制同步到存储介质(不调用 (fsync())。
在成功向 Zabbix server报告匹配的日志文件记录或元数据(处理的日志大小和修改时间)后,使用最新数据覆盖。这可能与每个监控项检查日志文件是否不断变化一样频繁。
代理关闭期间没有特殊操作。
在收到活动检查列表后,代理会将过时的持久文件标记为删除。如果出现以下情况,则持久文件将过时:1) 不再监视相应的日志项,2) 使用与以前不同的persistent_dir位置重新配置日志项
删除会延迟 24 小时完成,因为处于 NOTSUPPORTED 状态的日志文件不包含在活动检查列表中,但它们可能会在稍后变为 SUPPORTED,并且它们的持久文件将很有用。
如果代理在 24 小时到期之前停止,则不会删除过时的文件,因为 Zabbix agent不再从 Zabbix server获取有关其位置的信息。
在代理停止时,将日志项 persistent_dir 重新配置回旧的 persistent_dir 位置,用户没有删除就的持久文件 - 将导致从旧的持久化文件中恢复代理状态,从而导致丢失消息或错误告警。
Zabbix agent 通过他们的键来区分活动检查。例如:logrt[/home/zabbix/test.log] 和 logrt[/home/zabbix/test.log,] 是不同的监控项。将前端的项logrt[/home/zabbix/test.log,,,10]修改为 logrt[/home/zabbix/test.log,,,20] 会导致 logrt[/home/zabbix/test.log,,,10]项从代理的活动检查清单中删除并创建logrt[/home/zabbix/test.log,,,20] 监控项 (某些属性在前端/服务器中进行修改,而不是在代理中)。
文件名由监控项密钥的 MD5 和加上监控项密钥长度组成,以减少冲突的可能性。例如, logrt[/home/zabbix50/test.log,,,,,,,,/home/zabbix50/agent_private] 监控项的状态将保存在持久文件c963ade4008054813bbc0a650bb8e09266中。
多个日志项可以使用相同的值 persistent_dir。
persistent_dir 是通过考虑特定文件系统布局、挂载点和挂载选项以及存储镜像配置来指定的 - 持久文件应该与受监控的日志文件位于同一镜像文件系统上。
如果 persistent_dir 目录无法创建或不存在,或者Zabbix agent 的访问权限不允许创建/写入/读取/删除文件,则日志项将变为 NOTSUPPORTED。
如果在代理操作期间删除了对持久存储文件的访问权限或发生其他错误(例如磁盘已满),则错误将记录到代理日志文件中,但日志项不会变为 NOTSUPPORTED。