基于inotify机制的日志收集方法

基于inotify机制的日志收集方法

        考虑使用tail file的方法来采集日志数据:每1秒钟去扫描一次被监控文件的尾部,根据上一次的读取位置和当前文件尾部的偏移量,把新写入的数据读出来,并记录当前读取位置。

        这种方法有以下特点:

  • 只需对原始日志持有读权限,安全性不错。

  • 日志收集的时间粒度不够细,无法应对高并发的监控需求。考虑一下监控3000个日志文件的场景,我们需要每秒钟依次对3000个文件做询问,效率十分低下。

  • 在某1秒时间间隔内,如果日志文件没有变化,系统对该文件做询问是对CPU时间的浪费。

  • 监控目标必须是确定的,无法应对监控目录下文件与目录动态创建、删除、移动的数据采集场景。

        分析下来,存在两个问题:一、不知道何时去采集数据:有些监控文件即使没有新数据写入,仍然去做定时询问,这非常低效,且浪费资源。二、无法与监控目录动态发生的变化做同步:实际场景下,目录发生的变动无法被跟踪,这容易造成监控对象丢失。

        产生问题的主要原因在于系统无法感知监控对象的变化。有一个改进的方法:用通知机制替换轮询机制,任意时刻,只需要关心发生变化的文件与目录。

        操作系统是否提供这样一个事件通知机制?

        Linux在2.6.13内核版本中首次引入inotify,它提供一个机制来监视文件系统事件,添加inotify监视的目录或文件被创建、删除、移动、修改时,内核都会发出事件通知,这为高效、实时的日志收集带来可能。

        基于inotify机制,我们开发了日志收集的程序logtail,它可以适应监控目录的动态变化,并进行高效、实时的日志采集。

你可能感兴趣的:(分布式日志系统)