实际工作中用到了rsyslog来做本地日志的记录工具。但在实际使用过程中,偶尔会出现日志写着写着,就不记日志的情况。具体原因是因为,rsyslog监听的/dev/log的端口变了,但是使用记录日志的程序,对应的域socket监听的端口没有变。具体的可见以下的分析内容。
以下是第二阶段的分析报告。
glibc版本:glibc-2.17-222.el7.x86_64
rsyslog版本:8.24.0
该问题最近又看了一段时间,定位原因和之前定位的结论一样。问题的根节点在于rsyslog监听/dev/log的端口有时会变,而有的网元监听该端口没有跟随变化导致不能正常记日志。但仍无法弄清楚rsyslog打开的/dev/log的端口为什么会变化,并且有的网元没有跟随变化。目前进一步的验证是,通过GDB在不记日志的网元调用流程中,重新调用openlog_internal函数的话,监听端口会变成正确的监听端口,并重新开始记日志。而openlog会调用该函数,所以可以在当前代码的日志函数接口里,增加该函数的调用。虽然该函数在rsyslog的man手册里说明并非必须,但增加该函数的调用后,应该能解决偶尔出现不记日志的情况。
如果基于以上方法修改的话,则在日志的函数接口中会增加处理流程,因此就有可能会影响日志记录的效率,所以针对不调用openlog和调用openlog,写了小程序进行日志性能的测试,具体结论如下:
|
|
日志记录起始时间 |
日志记录结束时间 |
产生日志的大小 |
产生日志的条数 |
时间(S) |
平均值 |
每条日志产生30个字符 |
不使用openlog |
16:20:49 |
16:22:08 |
737M |
11513084 |
79 |
145735 |
使用openlog |