Log4j: Change-log-Ebene programmatisch, dass die arbeiten für die zu-Logger erstellt werden

Ich erkläre Holzfäller in meinem code wie folgt:

Logger logger = LoggerFactory.getLogger(MyClass.class);

Ich würde gerne in der Lage, ändern Sie den log-level von meinem Logger zur Laufzeit programmgesteuert. Ich habe versucht, die Iteration über die Holzfäller in das repository über den LogManager, aber es bezieht sich nur auf das neue log-level Logger instanziiert werden, die in den code. Wenn neue logger-Instanz erzeugt wird, wird es nicht das neue log-level. Meine Anforderung ist, dass der log-level in meiner web-Anwendung konfigurierbar über eine Verwaltungs-GUI, und diese neue log-level muss für alle Logger in meinem code (ohne Drittanbieter-Bibliothek Protokollierung, z.B. JSF, Spring, Hibernate etc).

Dies ist, was ich jetzt mache, das nicht meinen Anforderungen, da es gilt nicht, den log-level auf neu instanziiert Logger:

Enumeration<Logger> currentLoggers = LogManager.getCurrentLoggers();
while(currentLoggers.hasMoreElements()) {
    Logger logger = currentLoggers.nextElement();
    if (StringUtils.startsWith(logger.getName(), "com.my.company")) {
        logger.setLevel(logLevel);
    }
}

Ich bin mit Log4j 1.2.17.

  • Sie brauchen, um Ihre log4j-Konfiguration programmgesteuert. Nicht nur die bereits instanziiert Logger. Siehe stackoverflow.com/a/4598829/982149
  • mögliche Duplikate von Dynamisch Ändern log4j-log-level
  • Ich bin mir noch nicht sicher, was die Lösung ist nach dem Lesen dieses post. Ich kann das nicht LogManager.getRootLogger().setLevel(Level.DEBUG); denn es wird sich ändern, der root-logger und das wird Auswirkungen auf allen Protokoll-Ebenen, einschließlich diejenigen, die von 3rd-party-Bibliotheken.
  • Meine log4j ist ein wenig eingerostet, aber ich denke, Sie können den loglevel für "com.meine.die Gesellschaft" und es wird sich auf alle untergeordneten Logger. Ich erhalten zurück zu Ihnen in einem Augenblick ...
  • Nicht finden die Ressource mehr, aber als meine verblasste Erinnerung LogManager.getLogger("com.my.company").setLevel(whateverloglevel) sollte den job tun.
  • Das scheint gewirkt zu haben. Ich habe versucht, früh auf, aber fühlte sich wie es nicht funktioniert. Vielleicht etwas anderes falsch war. Jetzt scheint es zu funktionieren, vielen Dank! Wenn Sie es post, als Antwort werde ich es annehmen.

InformationsquelleAutor citress | 2014-08-26
Schreibe einen Kommentar