使用syslog记录消息时,日志文件不存在

时间:2014-02-27 13:44:40

标签: c linux syslog

#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

中找不到syslog恶魔的配置文件

1 个答案:

答案 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"