2014-06-25 4 views
10

J'écris une petite couche de transformation XML en Java. Je reçois le XML via le service Web, le modifie, puis envoie le fichier XML modifié à un autre système. J'attends ensuite une réponse et renvoie la réponse à l'appelant d'origine.Log4J RollingFileAppender Impossible de rouler le fichier

System A -> Me -> System B -> Me -> System A 

Je veux enregistrer la demande que je reçois, je la demande envoie, la réponse que je reçois, et la demande que j'envoie. Fondamentalement, je veux enregistrer le fichier XML où chaque flèche est dans mon diagramme.

Mon problème est avec le RollingFileAppender. J'essaie de rouler à 10 Mo, parfois c'est le cas et parfois ça ne roule pas. S'il roule plusieurs fois, puis s'arrête, il continuera à renommer les fichiers roulés de 3 à 4 et 4 à 5 et ainsi de suite.

Ma meilleure estimation est que lorsque la marque de 10 Mo est croisée, il y a plusieurs threads qui écrivent dans le fichier journal, de sorte que le fichier ne peut pas être renommé. J'espère que Log4J a une solution facile pour cela, mais si nécessaire, je suis ouvert à passer à un nouveau cadre de journalisation. Merci d'avance pour toute aide.

EDIT Voici mon fichier de propriétés.

log4j.rootLogger=DEBUG, fileOut 

log4j.appender.fileOut=org.apache.log4j.RollingFileAppender 
log4j.appender.fileOut.File=/logs/log.log 
log4j.appender.fileOut.layout=org.apache.log4j.PatternLayout 
log4j.appender.fileOut.layout.ConversionPattern=%d %-5p %c - %m%n 
log4j.appender.fileOut.MaxFileSize=10MB 
log4j.appender.fileOut.MaxBackupIndex=10 
log4j.appender.fileOut.append=true 

EDIT 2 Ceci est essentiellement une bosse, comme ce poste a un faible nombre de vues. J'ai l'impression que cela ne peut pas être un problème unique. Toute aide est très appréciée. Merci! Log4J s'auto-initialise au niveau du chargeur de classe.

Répondre

9

Dans un certain chargeur de classe et ses ancêtres, Log4J ne peut être initialisé qu'une seule fois et la même configuration Log4J s'applique à tous les appels Log4J dans le chargeur de classe. Log4J sait comment synchroniser l'accès au fichier physique pointé par la configuration de l'appa- reil roulant, tant que tous vos appels de journalisation sont effectués dans le même «log» de configuration Log4J; quand vient le temps de rouler, le roulement est effectué sans problème. Les choses deviennent problématiques une fois que vous avez deux (ou plus) domaines de configuration Log4J utilisant le même fichier physique pour la configuration de l'applicateur roulant. Cela pourrait être:

  1. Deux applications Web sur la même machine virtuelle Java physique
  2. Deux applications web sur deux JVMs distincts
  3. application web Même CLUSTERED horizontalement sur deux JVMs distincts

(etc)

Log4J a tout simplement aucun moyen de savoir qui d'autre que lui-même dans le même domaine de configuration Log4J, utilise ce fichier. Donc, ce qui finit par arriver, c'est que Log4J sur le système A tente de faire rouler le fichier (car il pense qu'aucun autre processus n'accède à ce fichier), et échoue parce que quelqu'un sur le système B utilise le fichier en même temps. Il s'agit d'une limitation connue de l'utilisation des extensions de fichiers, et vous ne pouvez pas vraiment blâmer Log4J pour cela: Log4J n'a tout simplement pas les moyens de surveiller qui d'autre, que Log4J dans le même "domaine de configuration", en utilisant ce fichier.

Pour un tel scénario d'utilisation, vous pouvez utiliser l'appendeur de socket Log4J.Si votre scénario n'implique pas plusieurs «domaines de configuration» Log4J, essayez d'ajouter -Dlog4j.debug=true aux paramètres JVM et voyez ce qui se passe exactement pendant l'opération de roulage de fichiers.

+0

Merci pour l'explication détaillée. Je vois ce que j'ai fait de mal, et comment l'éviter à l'avenir. Je savais que ça ne pouvait pas être la faute de Log4J! – Joe

+0

@Joe si ça aide, je savais aussi que ça ne pouvait pas être la faute de Log4J ... – Isaac

+0

@Isaac pouvez-vous me dire quels "paramètres JVM" devrais-je ajouter cette ligne '-Dlog4j.debug = true' ? –

1

J'ai également fait face au même problème dans mon application.

Grâce à @Isaac, j'ai trouvé que je faisais DOMConfigurator.configure pour la même configuration de journal dans 2 applications Web déployées dans le serveur d'applications. J'ai commenté l'un d'entre eux et rouler s'est passé comme prévu.

1

Pour les autres qui arrivent ici, vérifiez que vous utilisez RollingFileAppender et non FileAppender!

Les erreurs de copier-coller sont trop faciles, pour moi au moins.

+2

Pourquoi ajoutez-vous un commentaire plus d'un an après la réponse à la question? Je montre clairement que j'utilise le RollingFileAppender. – Joe

+0

C'était pour des gens comme moi, qui cherchent une réponse à un problème technique obscur, quand ils ont vraiment fait une erreur bête. –

Questions connexes