rsyslog两次打印相同的日志

时间:2016-06-19 08:44:17

标签: embedded-linux rsyslog

我在Debian用户空间运行应用程序,我正在使用rsyslog进行日志记录。 我使用以下命令打开一个主线程:

openlog(NULL, LOG_CONS | LOG_NDELAY, LOG_LOCAL0);

之后主线程创建2个线程(分离):

    pthread_create(&tx_tid, NULL,tx_main, NULL);
if(0 != th_ret_val)
{
    LOG(LEVEL_ERR,"failed to create tx thread, ret_val = %d",th_ret_val);
}
pthread_detach(tx_tid);

pthread_create(&rx_tid, NULL,rx_main, NULL);
if(0 != th_ret_val)
{
    LOG(LEVEL_ERR,"failed to create rx thread, ret_val = %d",th_ret_val);
}
pthread_detach(rx_tid);

并执行pthread_exit。

在日志中我看到一些日志被打印两次(我知道这是相同的LOG,因为我添加了一个在LOG上递增的令牌编号并且打印了相同的令牌编号)我也看到一些日志丢失了!

有人可以帮我解释为什么会这样吗?

请注意: LOG宏是:

#define LOG(prio, ...) my_log(__FILE__, __LINE__, __func__, prio, __VA_ARGS__)

和my_log实现如下:

#define LOG_MAX_LEN 200

static char full_fmt [LOG_MAX_LEN];

void my_log(const char * file,int line,const char * func,int prio,const char * fmt,...) {     va_list args;

snprintf(full_fmt, LOG_MAX_LEN, "LOG:tid-%d %-30s:%003d, %-20s - %s", pthread_self(), file, line, func, fmt);
va_start(args, full_fmt);
vsyslog(prio, full_fmt, args);
//vprintf(full_fmt, args);
va_end(args);

}

1 个答案:

答案 0 :(得分:0)

我发现了问题的根源。我没有用互斥锁保护my_log,发送到syslog的消息是全局字符串full_fmt。 添加互斥锁解决了这个问题。