系统日志性能可以改进吗?

时间:2008-10-16 10:55:18

标签: linux unix logging syslog

我们在Linux上有一个使用syslog机制的应用程序。花了一周的时间试图弄清楚为什么这个应用程序的运行速度低于预期,我们发现如果我们删除了syslog,并且只是直接写入日志文件,性能就会大大提高。

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

7 个答案:

答案 0 :(得分:20)

您可以通过在配置文件中的日志文件路径前加上“ - ”来配置syslogd(和至少rsyslog),以便在日志消息之后不同步日志文件。这样可以提高性能,但会降低日志消息在崩溃中丢失的危险。

答案 1 :(得分:6)

有几种方法可以改善系统日志性能:

  • 使用宏优化调用

     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));
              ...
     }
    

    使用宏来过滤syslog调用的一个好处是整个调用都是 减少到全局变量的条件跳转,如果碰巧,非常有用 有DEBUG调用,它们通过其他函数翻译大数据集。

  • setlogmask()

    setlogmask(LOG_UPTO(LOG_LEVEL))
    

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

  • 使用syslog.conf进行过滤

     *.err                                               /var/log/messages
    

    “查看syslog.conf的手册页以获取详细信息。”

  • 配置syslog以执行异步或缓冲日志记录

    metalog用于缓冲日志输出并在块中刷新它。库存syslog和syslog-ng 据我所知,不要这样做。

答案 2 :(得分:4)

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

答案 3 :(得分:3)

如果您控制日志应用程序的源代码,您可以使用的一个技巧是在应用程序本身而不是在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");

不知道为什么我使用了十进制而不是位掩码...... 耸肩

答案 4 :(得分:1)

编写自己的syslog实现。 :-P

这可以通过两种方式实现。

  1. 编写自己的LD_PRELOAD挂钩以覆盖syslog函数,并将它们输出到stderr。我实际上在很多年前写了一篇关于这个的帖子:http://marc.info/?m=97175526803720 :-P
  2. 编写自己的syslog守护程序。从/dev/log中抓取数据报只是一个简单的问题! :-P
  3. 好的,好的,所以这些都是诙谐的答案。你有没有想过syslogd来看看它最窒息的地方?

答案 5 :(得分:1)

您可以将syslogd的级别(或工具)配置为异步记录,方法是将一个减号前的路径放入logfile(即:user。* [tab] - / var / log / user.log)。

干杯。

答案 6 :(得分:0)

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

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