题
我们有一个应用程序在Linux上使用的 syslog 机构。后一个星期花了试图找出为什么这个程序正在运行的速度比预期的要慢,我们发现,如果我们消除了系统日志,只是直接写信到日志文件,性能大大提高。
我明白为什么syslog慢于直接的文件中写道。但我想知道:有没有方法,以配置系统优化其业绩?
解决方案
您可以通过在“ - ”之前添加“ - ”来配置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)); ... }
一个优点是使用宏过滤系统日志的电话是整个呼叫 减少到一个有条件的跳跃,在全球变量,非常有益的,如果你碰巧 必须调试的话这是翻译较大的数据集通过的其他职能。
setlogmask()
setlogmask(LOG_UPTO(LOG_LEVEL))
setlogmask()将优化该呼吁,通过不记录/dev/日志,但是该计划将 还是叫功能用作为参数。
过滤系统日志。conf
*.err /var/log/messages
"检查出的人页syslog。conf的详细信息。"
配置系统日志中做到步或缓冲记录
metalog用于缓冲记录输出,并刷新这块。股票syslog和syslog-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实现。 :-P
这可以通过两种方式实现。
- 编写您自己的
LD_PRELOAD
挂钩以覆盖syslog函数,并将它们输出到stderr
。我实际上在很多年前写了一篇关于这个帖子的帖子: http://marc.info/?m=97175526803720 :-P - 编写自己的syslog守护程序。从
/ dev / log
中获取数据报只是一个简单的问题! :-P
醇>
好的,好的,所以这些都是诙谐的答案。你有没有想过 syslogd
来看看它最窒息的地方?
您可以将syslogd的级别(或工具)配置为异步记录,方法是将一个减号前的路径放入logfile(即:user。* [tab] - / var / log / user.log)。
干杯。
syslog-async()实现可能会有所帮助,但有可能在其他时间丢失日志行/有限延迟。 http://thekelleys.org.uk/syslog-async/
注意:此处的“异步”是指在应用程序中排队日志事件,而不是其他答案所引用的异步syslogd输出文件配置选项。