In Java So erstellen Sie Ihre eigene Protokollierungsebene mit Log4j (Konfigurieren von Log4j 2)
Veröffentlicht: 2017-07-26
Wenn Sie Ihre eigene Protokollierungsebene in Log4j hinzufügen müssen, können Sie dies wie folgt tun. Sie müssen Ihre eigene Klasse erstellen, die sich von Level
, Custom Log Levels
mit Apache Log4j 2 erstreckt.
Log4j
ist ein einfaches und flexibles logging framework
. Die Protokollierung stattet den Entwickler mit detailliertem Kontext für Anwendungsfehler aus. Mit log4j ist es möglich, die Protokollierung zur Laufzeit zu aktivieren, ohne die Binärdatei der Anwendung zu ändern.
Das log4j-Paket ist so konzipiert, dass diese Anweisungen im ausgelieferten Code verbleiben können, ohne dass hohe Leistungseinbußen entstehen.

Mit Log4j können Protokollierungsanforderungen an mehrere Ziele gedruckt werden. In Log4j-Sprache wird ein Ausgabeziel als appender
. Sie variieren von Konsolen, Dateien, GUI-Komponenten, Remote-Socket-Servern bis hin zu JMS.
Jar-Datei, die Sie benötigen.
Hier ist eine Maven-Abhängigkeit:
1 2 3 4 5 |
< dependency > < groupId > log4j < / groupId > < artifactId > log4j < / artifactId > < version > 2.16.0 < / version > < / dependency > |
Aktualisieren Sie Log4j auf die neueste Version
CVE-2021-44228: Apache Log4j2 <=2.14.1 JNDI-Funktionen, die in Konfiguration, Protokollmeldungen und Parametern verwendet werden, schützen nicht vor von Angreifern kontrolliertem LDAP und anderen JNDI-bezogenen Endpunkten.
Ab log4j 2.16.0 ist dieses Verhalten standardmäßig deaktiviert.
Sie müssen die Datei log4j.xml
im Ordner /resources
ablegen:

Hier ist ein Beispiel-Java-Code für:
- Log4j-Protokollierung für benutzerdefinierte Protokollebenen in Java
- Erstellen Sie Ihre eigene Protokollierungsstufe in log4j
- Beispiel für einen benutzerdefinierten Log4j-Logger
CrunchifyLog4jLevel.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
package com . crunchify . tutorials ; import org . apache . log4j . Level ; /** * @author Crunchify.com * */ @SuppressWarnings ( "serial" ) public class CrunchifyLog4jLevel extends Level { /** * Value of CrunchifyLog4jLevel level. This value is lesser than DEBUG_INT and higher * than TRACE_INT} */ public static final int CRUNCHIFY_INT = DEBUG_INT - 10 ; /** * Level representing my log level */ public static final Level CRUNCHIFY = new CrunchifyLog4jLevel ( CRUNCHIFY_INT , "CRUNCHIFY" , 10 ) ; /** * Constructor */ protected CrunchifyLog4jLevel ( int arg0 , String arg1 , int arg2 ) { super ( arg0 , arg1 , arg2 ) ; } /** * Checks whether logArgument is "CRUNCHIFY" level. If yes then returns * CRUNCHIFY}, else calls CrunchifyLog4jLevel#toLevel(String, Level) passing * it Level#DEBUG as the defaultLevel. */ public static Level toLevel ( String logArgument ) { if ( logArgument ! = null && logArgument.toUpperCase().equals("CRUNCHIFY")) { return CRUNCHIFY; } return ( Level ) toLevel ( logArgument , Level . DEBUG ) ; } /** * Checks whether val is CrunchifyLog4jLevel#CRUNCHIFY_INT. If yes then * returns CrunchifyLog4jLevel#CRUNCHIFY, else calls * CrunchifyLog4jLevel#toLevel(int, Level) passing it Level#DEBUG as the * defaultLevel * */ public static Level toLevel ( int val ) { if ( val == CRUNCHIFY_INT ) { return CRUNCHIFY ; } return ( Level ) toLevel ( val , Level . DEBUG ) ; } /** * Checks whether val is CrunchifyLog4jLevel#CRUNCHIFY_INT. If yes * then returns CrunchifyLog4jLevel#CRUNCHIFY, else calls Level#toLevel(int, org.apache.log4j.Level) * */ public static Level toLevel ( int val , Level defaultLevel ) { if ( val == CRUNCHIFY_INT ) { return CRUNCHIFY ; } return Level . toLevel ( val , defaultLevel ) ; } /** * Checks whether logArgument is "CRUNCHIFY" level. If yes then returns * CrunchifyLog4jLevel#CRUNCHIFY, else calls * Level#toLevel(java.lang.String, org.apache.log4j.Level) * */ public static Level toLevel ( String logArgument , Level defaultLevel ) { if ( logArgument ! = null && logArgument.toUpperCase().equals("CRUNCHIFY")) { return CRUNCHIFY; } return Level . toLevel ( logArgument , defaultLevel ) ; } } |
Ein weiteres muss gelesen werden:

- Wie starte ich den Stopp von Apache Tomcat Server über die Befehlszeile? (Setup als Windows-Dienst)
- Erstellen und implementieren Sie einfache Webdienste und Webdienstclients in Eclipse
Hier ist ein Inhalt der Datei log4j.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<? xml version = "1.0" encoding = "UTF-8" ?> < ! DOCTYPE log4j : configuration SYSTEM "log4j.dtd" > < log4j : configuration xmlns : log4j = "http://jakarta.apache.org/log4j/" debug = "false" > < ! -- FILE Appender -- > < appender name = "FILE" class = "org.apache.log4j.FileAppender" > < param name = "File" value = "c:/crunchify.log" / > < param name = "Append" value = "false" / > < layout class = "org.apache.log4j.PatternLayout" > < param name = "ConversionPattern" value = "%t %-5p %c - %m%n" / > < / layout > < / appender > < ! -- CONSOLE Appender -- > < appender name = "CONSOLE" class = "org.apache.log4j.ConsoleAppender" > < layout class = "org.apache.log4j.PatternLayout" > < param name = "ConversionPattern" value = "%d{ISO8601} %-5p [%c{1}] %m%n" / > < / layout > < / appender > < ! -- Limit Category and Specify Priority -- > < category name = "com.crunchify" > < priority value = "CRUNCHIFY" class = "com.crunchify.tutorials.CrunchifyLog4jLevel" / > < appender - ref ref = "CONSOLE" / > < / category > < ! -- Setup the Root category -- > < root > < appender - ref ref = "CONSOLE" / > < / root > < / log4j : configuration > |
CrunchifyLog4jLevelTest.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package com . crunchify . tutorials ; import org . apache . log4j . Level ; import org . apache . log4j . Logger ; import com . crunchify . tutorials . CrunchifyLog4jLevel ; /** * Tests whether the new log level * com.crunchify.tutorials.CrunchifyLog4jLevel#CRUNCHIFY} is working * * @author Crunchify.com * */ public class CrunchifyLog4jLevelTest { public static void main ( String [ ] args ) { Logger logger = Logger . getLogger ( CrunchifyLog4jLevelTest . class ) ; logger . log ( CrunchifyLog4jLevel . CRUNCHIFY , "I am CrunchifyLog4jLevelTest log" ) ; logger . log ( Level . DEBUG , "I am a DEBUG message" ) ; } } |
Führen Sie das Testprogramm aus und Sie sollten den folgenden Ergebnistyp in Ihrer Eclipse's Console
sehen.
1 2 |
2013 - 08 - 01 15 : 22 : 36 , 758 CRUNCHIFY [ CrunchifyLog4jLevelTest ] I am CrunchifyLog4jLevelTest log 2013 - 08 - 01 15 : 22 : 36 , 758 DEBUG [ CrunchifyLog4jLevelTest ] I am a DEBUG message |
Der int-Wert, den Sie für Ihre Protokollebene angeben, ist wichtig. Hier habe ich definiert, dass die Protokollebene „ CRUNCHIFY
“ höher als die DEBUG
-Ebene, aber niedriger als die von log4j bereitgestellte TRACE
-Ebene sein soll.
Wenn Sie also für die Kategorie (in Ihrer log4j.xml
-Datei) eine Prioritätsstufe auf DEBUG gesetzt haben, werden die Protokolle der CRUNCHIFY
Stufe NICHT in die Protokolldatei aufgenommen.