2 votes

Comment empêcher les messages de log4cplus de s'insérer dans les messages de log ?

J'ai le code suivant (simplifié) dans mon programme C++ :

std::string DataRequest::toString() const {
LOG4CPLUS_TRACE(logger,
        LOG4CPLUS_TEXT("symbol=" << m_contract.symbol));

std::ostringstream oss;
oss << "id=" << reqId
    << ",symbol=" << m_contract.symbol;
return oss.str();
}

et

int DataService::requestData(
    DataRequest request) {

LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("requestData: " << request.toString()));
}

Ce code produit alors le message de journal :

TRACE symbol=AAA
INFO  symbol=AAArequestData: id=1,symbol=AAA

Cependant, je m'attendais à ce que

TRACE symbol=AAA
INFO  requestData: id=1,symbol=AAA

Comme un message log4cplus est généré à l'intérieur d'un message log4cplus, il semble que les deux messages soient concaténés en un seul. S'agit-il d'un comportement normal ? Existe-t-il une solution pour forcer chaque message à être généré indépendamment ?

2voto

Václav Zeman Points 7911

Ce code est erroné

LOG4CPLUS_TRACE(logger,
        LOG4CPLUS_TEXT("symbol=" << m_contract.symbol));

il faut lire

LOG4CPLUS_TRACE(logger,
        LOG4CPLUS_TEXT("symbol=") << m_contract.symbol);

au lieu de cela.

En ce qui concerne les messages concaténés, quel format de sortie utilisez-vous ? S'il s'agit du schéma, vous devez ajouter l'élément %n à la fin de la chaîne de formatage.

EDITAR:

Malheureusement, je suis toujours sont concaténés. Je pense que cela est lié au fait que que l'appel request.toString() dans le message de log lui-même a également un appel à un message de log, mais pour une raison quelconque, les deux messages sont les deux messages sont imprimés ensemble même après la correction du code :(

Ah, j'ai mal compris le problème, initialement. Vous enregistrez donc un deuxième événement pendant que vous préparez le premier. Le problème est que le formatage est effectué dans un fichier de type ostringstream . Le système local de filtrage ostringstream est utilisé pour améliorer les performances. (Le ostringstream n'a pas besoin d'être construit et détruit à chaque message enregistré).

Pour une solution immédiate, deux options s'offrent à vous. Premièrement, vous pouvez arrêter cette journalisation imbriquée. Deuxièmement, vous "corrigez" LOG4CPLUS_*() de ne pas utiliser les macros locales aux threads. ostringstream ou vous créez vos propres macros d'enregistrement. L'un ou l'autre ne devrait pas être trop difficile.

À long terme, je peux ajouter un cas spécial aux macros d'enregistrement qui leur permettraient d'utiliser des données fraîches. ostringstream à chaque fois pour permettre votre cas d'utilisation.

EDIT 2 :

J'ai rempli un rapport de bogue et joint un correctif qui met en œuvre une solution de contournement. Voir la page https://sourceforge.net/p/log4cplus/bugs/153/ .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X