系统日志性能是否可以改进?

我们有一个使用syslog机制的Linux应用程序。 花了一个星期的时间,试图找出为什么这个应用程序的运行速度慢于预期,我们发现,如果我们消除了系统日志,并直接写入日志文件,性能显着提高。

我明白为什么syslog比直接文件写入慢。 但我想知道:有没有办法configurationsyslog来优化其性能?

Solutions Collecting From Web of "系统日志性能是否可以改进?"

您可以配置syslogd(和rsyslog至少)不要在日志消息之后同步日志文件,方法是在配置文件的日志文件路径中加上“ – ”。 这样可以提高性能,但是会导致日志消息在崩溃中丢失的风险。

有几个选项可以提高系统日志的性能:

  • 使用宏优化调用

    int LogMask = LOG_UPTO(LOG_WARNING); #define syslog(a, ...) if ((a) & LogMask ) syslog((a), __VA_ARGS__) int main(int argc, char **argv) { LogMask = setlogmask(LOG_UPTO(LOG_WARNING)); ... } 

    使用宏来过滤系统日志调用的一个优点是,整个调用被简化为全局变量的条件跳转,如果碰巧有DEBUG调用正在通过其他函数来转换大型数据集,这将非常有帮助。

  • setlogmask()

     setlogmask(LOG_UPTO(LOG_LEVEL)) 

    setlogmask()将通过不记录到/ dev / log来优化调用,但程序仍将调用用作参数的函数。

  • 使用syslog.conf进行筛选

      *.err /var/log/messages 

    详情请查看syslog.conf的手册页。“

  • 配置系统日志做异步或缓冲日志记录

    metalog用于缓冲日志输出并刷新块。 股票系统日志和系统日志ng不这样做,据我所知。

在开始写入新的守护进程之前,可以检查syslog-ng是否比普通的旧系统日志更快(或者可以配置得更快)。

如果你控制日志记录应用程序的源代码,你可以使用的一个技巧是在应用程序本身而不是在syslog.conf中掩盖你想要的日志级别。 我几年前用一个生成巨大,巨大的调试日志的应用程序。 我们只是屏蔽了调试级调用,而不是从生产代码中移除调用级别的调用。 我实际上找到了代码,它是Perl,但它只是setlogmask(3)调用的前端。

 use Sys::Syslog; # Start system logging # setlogmask controls what levels we're going to let get through. If we mask # them off here, then the syslog daemon doesn't need to be concerned by them # 1 = emerg # 2 = alert # 4 = crit # 8 = err # 16 = warning # 32 = notice # 64 = info # 128 = debug Sys::Syslog::setlogsock('unix'); openlog($myname,'pid,cons,nowait','mail'); setlogmask(127); # allow everything but debug #setlogmask(255); # everything syslog('debug',"syslog opened"); 

不知道为什么我用十进制而不是一个位掩码… 耸耸肩

编写你自己的syslog实现。 😛

这可以通过两种方式来完成。

  1. 编写自己的LD_PRELOAD钩子覆盖syslog函数,并将其输出到stderr 。 其实我写了一篇关于这个多年前的文章: http ://marc.info/?m=97175526803720 😛
  2. 编写你自己的syslog守护进程。 这只是从/dev/log抓取数据报的简单事情! 😛

好的,好吧,这些都是讽刺的答案。 你有没有分析syslogd ,看看它最窒息的地方?

您可以配置syslogd的级别(或设施)以异步方式记录日志文件(例如:user。* [tab] – / var / log / user.log)。

干杯。

syslog-async()实现可能会有所帮助,其他时间可能会丢失日志行/有限的延迟。 http://thekelleys.org.uk/syslog-async/

注意:这里的“异步”是指在应用程序中对日志事件进行排队,而不是其他答案引用的异步syslogd输出文件配置选项。