天天看点

ossec-logcollector bug

现象: 一个文件监控一段时间(10分钟左右)后, 会忽略掉而不监控.

2014/01/10 18:50:11 ossec-logcollector(1950): INFO: Analyzing file: '/var/ossec/logs/alerts/alerts.log'.

2014/01/10 18:50:11 ossec-logcollector: INFO: Started (pid: 9668).

2014/01/10 19:07:31 ossec-logcollector(1904): INFO: File not available, ignoring it: '/var/ossec/logs/alerts/alerts.log'.

测试文件: /var/ossec/logs/alerts/alerts.log 相关进程: /var/ossec/ossec-agent/bin/ossec-logcollector 监控配置文件: /var/ossec/ossec-agent/etc/ossec.conf 查看进程日志: cat /var/ossec/ossec-agent/logs/ossec.log |grep logcoll

发现 logcollector.c 中这一段代码很奇怪:

logff[i].read(i, &r, 0);

if(!ferror(logff[i].fp))

{

    clearerr(logff[i].fp);

    if(r != 0)

    {

        logff[i].ign++;

    }

}

其中的 r != 0 即代表 "Parsing error" 很可疑.  Q1: 是否所有的 ossec 中配置的 localfile 都遇到这种情况?

如下, 只有在 /var/ossec/ossec-agent/etc/ossec.conf 中配置了 format 为 ossecalert 才会出现这种情况.

  <localfile>

    <log_format>ossecalert</log_format>

    <location>/var/ossec/logs/alerts/alerts.log</location>

  </localfile>

查看对应的 read_ossecalert.c , 并查看 read_syslog.c 对比

void *read_ossecalert(int pos, int *rc, int drop_it)

void *read_syslog(int pos, int *rc, int drop_it)

程序是以 read_xxx 函数返回后 rc 的值是否为 0 判断是否有 "Parsing error" . 在 read_osseralert() 中, 没有对 rc 进行操作. 在 read_syslog.c() 中, 有这样一句代码

*rc = 0;

因此,很有可能是因为 read_ossecalert() 没有对 rc 进行初始化, 直接用传进来的值判断是否 "Parsing error".  而传进来的 rc 是不可预料的. 因为在"logff[i].read(i, &r, 0);"前面有

#ifndef WIN32

if((r = fgetc(logff[i].fp)) == EOF)

{

    clearerr(logff[i].fp);

    continue;

}

ungetc(r, logff[i].fp);

#endif

需要在 read_ossecalert() 中添加 "*rc=0;" 这一行代码.

继续阅读