用syslog(linux)在日志文件中写入错误类型

时间:2017-03-23 17:47:46

标签: c logging syslog

有一个关于在将错误消息写入日志文件时使用syslog库的问题。

以下是我尝试使用的代码函数

syslog(int priority, const char_message)

我想在日志文件中打印按摩优先级。 例如:

  

Mar 23 17:56:37 mypc slog [3597]:这是日志按摩" ERR"

但现在只显示:

  

Mar 23 17:56:37 mypc slog [3597]:这是日志按摩

无论如何我还可以在日志文件中写入优先级类型吗? (syslog只接受字符串文字)

2 个答案:

答案 0 :(得分:1)

syslog的函数原型是:

void syslog(int priority, const char *format, ...);

特别是,第二个参数类似于printf - 样式格式说明符,除了它还支持说明符%m,它将被strerror(errno)生成的错误消息替换。

您可以通过调用此函数来记录一个简单的字符串以及优先级字符串:

void my_simple_syslog(int priority, const char *message)
{
    static const char * const prio_strings[] = {
        [LOG_EMERG] = "EMERG",
        [LOG_ALERT] = "ALERT",
        [LOG_CRIT] = "CRIT",
        [LOG_ERR] = "ERR",
        [LOG_WARNING] = "WARNING",
        [LOG_NOTICE] = "NOTICE",
        [LOG_INFO] = "INFO",
        [LOG_DEBUG] = "DEBUG",
    };

    if (priority < 0 ||
        priority >= sizeof(prio_strings) / sizeof(prio_strings[0]) ||
        !prio_strings[priority]) {
        /* priority is an unknown value */
        syslog(priority, "%s [PRIORITY:%d]", message, priority);
    } else {
        syslog(priority, "%s [%s]", message, prio_strings[priority]);
    }
}

此示例调用:

my_simple_syslog(LOG_ERR, "this is log massage");

生成类似于以下内容的日志消息:

  

Mar 23 17:56:37 mypc slog [3597]:这是按摩[ERR]

使用这种预制方法的缺点是你不能像直接调用syslog一样添加额外的参数。

答案 1 :(得分:0)

请注意,syslog消息已包含优先级,但在将其写入文件时会被syslog守护程序(例如rsyslog)剥离。 syslog()调用syslog守护程序传递的syslog消息实际上如下所示:

<16>Mar 23 17:56:37 mypc slog[3597]: this is log massage

可以重新配置syslog守护程序,以便还打印优先级。 Rsyslog使用模板,使用NXLog,您可以简单地执行此操作:

Exec $raw_event = $raw_evnt + " " + $SyslogSeverity;

另见https://stackoverflow.com/a/9216977/995934