2016-06-19 12 views
1

Ich benutze eine Anwendung im Debian-Benutzerbereich und verwende rsyslog für die Protokollierung. I öffnen Log in einem Haupt-Thread mit dem folgenden Befehl:rsyslog druckt das selbe Protokoll zweimal

openlog(NULL, LOG_CONS | LOG_NDELAY, LOG_LOCAL0); 

Danach wird der Haupt-Thread erstellt 2 Fäden (freistehend):

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); 

und führt pthread_exit.

in den Protokollen sehe ich, dass einige Protokolle zweimal gedruckt werden (ich weiß, dass dies das gleiche LOG ist, da ich eine Token-Nummer hinzugefügt, die auf LOG erhöht wird und die gleiche Token-Nummer gedruckt wird) auch sehe ich, dass einige LOGs sind fehlt!

kann mir jemand helfen zu erklären, warum das passiert?

Anmerkung: Logmakro ist:

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

und my_log wird wie folgt implementiert:

#define LOG_MAX_LEN 200 

static char full_fmt [LOG_MAX_LEN];

void mein_log (const char * datei, int linie, const char * funktion, 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); 

}

Antwort

0

fand ich die Ursache des Problems aus. Ich habe mein_log nicht mit einem Mutex geschützt und die Nachricht, die an syslog gesendet wird, ist die globale Zeichenkette full_fmt. das Hinzufügen eines Mutex löste dieses Problem.