Ihr Problem ist mehr als wahrscheinlich nicht mit dem Logging-Framework, sondern mit dem Layout.
Konkretes Beispiel
so35592962/App.java
package so35592962;
import org.apache.logging.log4j.*;
import so35592962.sub.OtherClass;
public class App {
public static final Logger logger = LogManager.getLogger();
public static void main(String[] args) {
logger.error("in App.main");
OtherClass.act();
}
}
so35592962/sub/OtherClass.java
package so35592962.sub;
import static so35592962.App.logger;
public class OtherClass {
public static void act() {
logger.error("OtherClass.act");
}
}
So können Sie sehen, das ist völlig ist, was Sie wollen: Klassen, die einen einzelnen Logger zu verwenden. Also guter Punkt, Log4J2 kann dafür verwendet werden.
Nun füge ich die magische Datei log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %C{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
Ausführen dieser Druck wird:
12:05:28.834 [main] ERROR so35592962.App - in App.main
12:05:28.836 [main] ERROR so35592962.sub.OtherClass - OtherClass.act
Schauen Sie, es gibt verschiedene Klassennamen hier! Aber ich habe Log4J2 benutzt.
Was ist hier passiert?
Hinweis das Muster in der PatternLayout
Tag verwendet:
%d{HH:mm:ss.SSS} [%t] %-5level %C{36} - %msg%n
Die Standard-Beispiele und was Sie in der Regel über das Internet sehen alle nutzen die %L
Muster. Dieses Muster zeigt den Loggernamen an. Aber du hast gesagt, du willst es nicht. Glücklicherweise existieren andere Muster. %C
zeigt den Klassennamen anstelle des Protokollierernamens an. Dies ist das Muster, das hier verwendet wird.
Nach the PatternLayout
documentation, das %C
Muster macht folgende:
Ausgänge der vollständig qualifizierten Klassennamen des Anrufers Ausgabe die Protokollierungs Anfrage.
Wichtiger Hinweis, auch in der Dokumentation erwähnt:
Generieren der Klassenname des Anrufers (Ortsinformation) ist eine teure Operation und kann die Leistung auswirken. Verwenden Sie mit Vorsicht.
Es liegt ganz bei Ihnen (in jedem dieser Frameworks), wie Sie Ihre Logger definieren und benennen. Sie können nur einen für Ihre gesamte Anwendung haben, oder 'getLogger' bei jedem Anruf anrufen. – Thilo
Related: http://StackOverflow.com/Questions/26600757/Standard-way-to-Implement-a-Logger-Across-Classes-In-Java?RQ=1 http://StackOverflow.com/Questions/27038694/ is-da-ein-leicht-zu-erstellen-eine-Logger-Instanz für jede Klasse? rq = 1 – Thilo
@Thilo mit einem für die gesamte Anwendung wird alle Protokolle mit dem gleichen Namen machen. Was ich nicht suche. Stattdessen muss das Framework den Klassennamen des Aufrufers anzeigen. – Edi