【问题标题】:writing type of error in log file with syslog (linux)使用 syslog (linux) 在日志文件中写入错误类型
【发布时间】:2017-08-16 10:34:57
【问题描述】:

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

下面是我尝试使用的代码功能

syslog(int priority, const char_message)

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

3 月 23 日 17:56:37 mypc slog[3597]:这是日志按摩“ERR”

但现在只显示:

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

我是否也可以将优先级类型写入日志文件? (系统日志只接受字符串文字)

【问题讨论】:

  • 您可以尝试将完整的输出日志写入文件。假设你有可执行文件名prog,那么它将是./prog > log.txt
  • @Sma 您可以尝试将完整的输出日志写入文件。假设您有可执行文件名prog,那么它将是./prog > log.txt 假设prog 是一个无法停止或重新启动的长期运行的关键生产过程,而log.txt 填充了文件系统?通过重定向stdout/stderr 进行日志记录是一个BAD IDEA,因为它将进程绑定到特定文件 - 该文件无法删除,也无法可靠地删除被截断以释放空间。

标签: c logging syslog


【解决方案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");

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

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

使用这种固定方法的缺点是您不能像直接调用 syslog 那样添加额外的参数。

【讨论】:

  • 要添加额外的参数,您可以执行类似my_simple_syslog(int priority, const char *fmt, ...) 的操作,其中fmt 是标准printf 样式的格式字符串,然后使用类似vsnprintf() 的内容来构建单个消息字符串,以您可以添加派生数据,例如 [ERR] 或传递给 syslog() 作为 %s 格式说明符的参数。
【解决方案2】:

请注意,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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-25
    • 2014-12-04
    • 2019-04-21
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多