2011-08-15 4 views
24

Il serait utile d'attacher automatiquement des fichiers journaux pour prendre en charge les courriels. Je pourrais définir le chemin par programme (comme dans Setting Logback Appender path programmatically), mais je préfère laisser les utilisateurs configurer la journalisation de manière familière via logback.xml. Alors, puis-je trouver le journal de fichiers utilisé pour la journalisation?Est-il possible de trouver des fichiers journaux de journalisation par programme?

+0

Désolé mais je n'arrive pas à comprendre la question. Pourriez-vous développer un peu? – Ceki

+1

@Ceki: plus généralement, puis-je avoir une liste de tous les appenders utilisés par Logback? –

Répondre

28

Vous pouvez obtenir la liste de tous les appenders dans un certain contexte. Pour ce faire:

LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory(); 
for (Logger logger : context.getLoggerList()) { 
     for (Iterator<Appender<ILoggingEvent>> index = logger.iteratorForAppenders(); index.hasNext();) { 
      Appender<ILoggingEvent> appender = index.next(); 
     } 
    } 

Ce itère sur la liste de tous appenders dans tous les enregistreurs pour le contexte actuel.

+1

La méthode iteratorForAppenders n'existe plus sur le journal (http://www.slf4j.org/apidocs/org/slf4j/Logger.html). Une idée de comment cela fonctionne maintenant? – user3885927

+0

@ user3885927 assurez-vous d'importer ch.qos.logback.classic.Logger et non org.slf4j.Logger! – Catchwa

17

Réponse donnée par @ tafoo85 est correcte mais elle vous donnera seulement des appenders.

Pour plus de détails, utilisez le logger Logger, j'espère que le code ci-dessous aidera quelqu'un.

File clientLogFile; 
FileAppender<?> fileAppender = null; 
LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory(); 
for (Logger logger : context.getLoggerList()) 
{ 
    for (Iterator<Appender<ILoggingEvent>> index = logger.iteratorForAppenders(); 
       index.hasNext();) 
    { 
      Object enumElement = index.next(); 
      if (enumElement instanceof FileAppender) { 
       fileAppender=(FileAppender<?>)enumElement; 
      } 
    } 
} 

if (fileAppender != null) { 
    clientLogFile=new File(fileAppender.getFile()); 
} 
else { 
    clientLogFile = null; 
} 

Log.d("logfile path", clientLogFile.getAbsolutePath()); 
+0

Était exactement ce dont j'avais besoin, bien que j'ai changé la ligne 'Object enumElement = index.next();' à Appender enumElement = index.next(); 'ainsi que' fileAppender = (FileAppender ) enumElement; 'à' fileAppender = (FileAppender ) enumElement; 'pour que cela fonctionne pour moi. –

+1

@danial qui sera plus spécifique. mais si vous voulez 2-3 enregistreur de fichiers (débogage et trace) alors ce code fonctionnera parfaitement. – androidnoobdev

Questions connexes