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:

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

а my_log реализован следующим образом:

#define LOG_MAX_LEN 200

статический символ 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);

}


person Samer.M    schedule 19.06.2016    source источник


Ответы (1)


я узнал источник проблемы. я не защищал my_log мьютексом, и сообщение, отправляемое в системный журнал, представляет собой глобальную строку full_fmt. добавление мьютекса решило эту проблему.

person Samer.M    schedule 19.06.2016