用Linux syslog搭建自己的软件日志系统 + 可变参数(转)
syslog已被许多日志函数采纳,它用在许多保护措施中,任何程序都可以通过syslog记录事件。syslog可以记录系统事件,可以写到一个文件或设备中,或给用户发送一个信息。它能记录本地事件或通过网络记录另一个主机上的事件。
syslog设备依据两个重要的文件:
/etc/syslogd守护进程和/etc/syslog.conf配置文件。
通常情况下,多数syslog信息被写到/var/adm或/var/log目录下的信息文件中(messages.*)。一个典型的syslog记录包括生成程序的名字和一个文本信息。它还包括一个设备和一个优先级范围。
#include
#include
#include
#include
#define LOG(arg...) \
do { \
syslog(LOG_INFO, arg); \
} while(0);
int main()
{
int log_test = 5;
openlog("log_test ", LOG_PID|LOG_CONS, LOG_USER);
syslog(LOG_INFO, "PID information, pid=%d", getpid());
LOG("123%d%s\n", log_test, "str");
closelog();
return 0;
}
上面代码中,LOG(arg...)为自定义的宏,其中用到了可变参数。
在类似syslog, printf这样的C库函数中,都实现了对可变参数的处理,如printf的原型为:int printf ( const char * format, ... );
具体的实现中使用到了var_list:
va_list args;
va_start(args, fmt);
[循环,然后用VA_ARG依次返回可变的参数,VA_ARG的第二个参数是要返回的参数的类型]
va_end(args);
总之,如果要实现自己定义的带有可变参数的函数,就要在函数中使用va_list
C的可变参数也有缺陷:
(1)因为va_start, va_arg, va_end等定义成宏,所以它显得很愚蠢,可变参数的类型和个数完全在该函数中由程序代码控制,它并不能智能地识别不同参数的个数和类型. 也就是说,你想实现智能识别可变参数的话是要通过在自己的程序里作判断来实现的.
(2)另外有一个问题,因为编译器对可变参数的函数的原型检查不够严格,对编程查错不利.不利于我们写出高质量的代码。
(2)另外有一个问题,因为编译器对可变参数的函数的原型检查不够严格,对编程查错不利.不利于我们写出高质量的代码。

浙公网安备 33010602011771号