2017-03-29 9 views
0

Ich möchte die Protokollierungsstufe für alle (über) meiner Webanwendung Controller-Klassen dynamisch ändern. Jede Klasse, die Protokollierung bietet enthält diesen Code:Ändern der Ebene der Protokollierung dynamisch

private static final Logger logger = LoggerFactory 
      .getLogger(HomeController.class); 

ich gelernt, dass slf4j nicht die Funktionalität eines Protokollebene eingestellt, so bieten, so dass man die zugrunde liegenden log4j verwenden muss:

public static void setLogLevel(String level) { 
    org.apache.log4j.Logger logger4j = org.apache.log4j.Logger.getRootLogger(); 
    logger4j.setLevel(org.apache.log4j.Level.toLevel(level.toUpperCase())); 

    logger.info("Sample Info After setLevel"); 
    logger.debug("Sample Debug After setLevel"); 
    logger.error("Sample Error After setLevel"); 
    logger.trace("Sample Trace After setLevel"); 
    logger.warn("Sample Warn After setLevel"); 
} 

Meine Idee ist, eine Controller-Methode zu haben, die den logLevel ändert und ihn möglicherweise in der Datenbank speichert. Meine Frage ist: Wie kann ich das elegant lösen, ohne alles in 40+ Dateien kopieren und einfügen zu müssen und jede Controller-Methode zu modifizieren? Beachten Sie auch, dass der Loggercode statisch ist, während der Datenbankzugriff nicht statisch ist.

Antwort

1

Wie kann ich das elegant lösen, ohne alles in 40 Dateien kopieren und einfügen und jede Controller-Methode ändern?

Sie verwenden eine einzige Controller-Methode, den Logger Namen und die gewünschte Protokollebene als Abfrageparameter nehmen, und die String-Version von LogManager.getLogger(String name) nennen.

Das Speichern in der Datenbank und das erneute Laden beim Neustart ist natürlich eine zusätzliche Aufgabe, die von Ihnen erledigt werden muss.

Alternativ kann der Controller die beim Start verwendete Log4j-Konfigurationsdatei aktualisieren und Log4j erzwingen, sie bei jeder Änderung erneut zu laden, z. durch den Anruf PropertyConfigurator.configure(String configFilename).

+0

Ich bin unsicher über den Lebenszyklus von Log4J, gibt es eine einzige Instanz für alle Tomcat-Anfragen oder wird der Logger für jede Anforderung neu erstellt, die ihn benötigt? – Adder

+0

Es gibt eine einzelne Instanz von Log4j in Ihrer Webanwendung, vorausgesetzt, Sie haben 'log4j.jar' (und alle notwendigen' slf4j.jar' Dateien) zum Ordner 'WEB-INF/lib' hinzugefügt. – Andreas

+0

Also konnte ich einfach: 'setLogLevel (" INFO ")' und es würde alle zukünftigen Anfragen und Jobs, die ich habe, beeinflussen? – Adder

0

Sie können Slf4j verwenden und Ihre Datei application.properties externalisieren. Sie können die Protokollierungsstufe in dieser Datei nach Ihren Bedürfnissen konfigurieren.

logging.level.com.test=DEBUG 
logging.level.org=INFO 

Ich bin mir nicht sicher, warum Sie diese Protokollierungsstufe in der Datenbank speichern müssen.

+0

Sie haben den Teil über * dynamisch * den Log-Level zur Laufzeit ändern vermisst. – Andreas

Verwandte Themen