#include <syslog.h>
void log_msg(char *name, int priority, const char *format)
{
va_list vl;
openlog(name, 0, LOG_DAEMON);
va_start(vl, format);
vsyslog(log_class[priority], format, vl);
va_end(vl);
closelog();
}
我在openwrt backfire 10.03中运行程序时使用此代码记录所有消息。但我在/var/log
下找不到任何记录。
我的代码有些不对劲!知道我在/etc/syslog.conf
答案 0 :(得分:2)
如果要打印到系统日志(/var/log/syslog
),则实际上不需要使用openlog()
或closelog()
。您可以在documentation for openlog from the GNU C library:
您不必使用openlog。如果你在没有调用openlog的情况下调用syslog,syslog只是隐式打开连接并使用ident和options中的信息的默认值
但 执行 需要传递与格式匹配的变量参数列表(...
),否则vsyslog()
将无法执行任何操作打印。这是一个有效的例子:
#include <stdarg.h>
#include <syslog.h>
void log_msg(int priority, const char *format, ...)
{
va_list vl;
va_start(vl, format);
vsyslog(priority, format, vl);
va_end(vl);
}
int main(void)
{
log_msg(LOG_USER|LOG_DEBUG, "%d variable %s\n", 2, "arguments");
return 0;
}
然后您可以在syslog中看到该消息:
〜/ sandbox $ cat / var / log / syslog
...
2月27日09:03:04 a.out:2个变量参数
我不确定您的优先级是什么,但请注意man page for vsyslog()
中找到了正确的值。它的设施和水平是一起的。
如果您想使用openlog()
/ closelog()
,您仍会在/var/log/syslog
中找到您的邮件,但随后会附上您打开的姓名。例如:
openlog(name, LOG_CONS, LOG_DEBUG);
va_start(vl, format);
vsyslog(priority, format, vl);
va_end(vl);
closelog();
(假设您仍然将char * name
传递给log_msg函数。您可以这样称呼它:
log_msg("hello", LOG_USER|LOG_DEBUG, "%d variable %s\n", 2, "arguments");
然后在syslog
您现在看到:
Feb 27 09:35:16你好:2个变量参数
请注意,通用程序名称a.out
现已更改为您传递给openlog()
的名称("hello"
)