Ich habe eine Test-Webanwendung in Maven erstellt, die Logback verwendet. Hier ist meine logback.xml Konfigurationsdatei:logback.xml Datei wird nicht geladen
<configuration scan="true">
<!-- For more information: http://logback.qos.ch/manual/configuration.html -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>D:/Oracle/user_projects/domains/base_domain/servers/AdminServer/logs/myapp.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>D:/Oracle/user_projects/domains/base_domain/servers/AdminServer/logs/archive/myapp.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- keep 31 days' worth of history -->
<maxHistory>31</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%date [%level] [%thread] [%file:%line] %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="FILE" />
<appender-ref ref="STDOUT" />
</root>
</configuration>
ich diese Datei kopiert haben sowohl src/main/resources
und src/test/resources
Wenn ich laufen mvn test
, funktioniert alles einwandfrei. Das Testprotokoll-Nachricht wird an geschrieben sowohl die Konsole als auch die myapp.log Datei:
public class TestLogService extends TestCase {
public TestLogService(String name) {
super(name);
}
public void testLogMessage() throws Exception {
LogService.debug("Hello from {}!", "TestLogService");
}
}
Danach laufe ich mvn install
und Bereitstellen der resultierenden Krieg Datei (die logback.xml unter WEB-INF/classes
hat) zu meinem lokaler WebLogic-Server. Sobald das erledigt ist, traf ich ein Test-Servlet, die angeblich nur eine einzige Anweisung in die Protokolldatei protokollieren:
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public TestServlet() {
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
LogService.debug("Hello from {}!", "doGet()");
response.getWriter().append("Served at: ").append(request.getContextPath());
}
}
Aber abgesehen von der „Served auf:/myapp“ -Ausgabe, passiert nichts! Nichts wird in die Protokolldatei oder in die Konsole geschrieben. Ich bekomme nicht einmal Fehlermeldungen auf der Konsole. Es ist, als ob das Logback im Hintergrund stünde oder so.
Und die LogService Klasse ist nur ein Wrapper für logback Anrufe:
public class LogService {
private static Logger logger = LoggerFactory.getLogger("com.myapp");
public static void debug(String message) {
logger.debug(message);
}
public static void debug(String message, Object... argArray) {
logger.debug(message, argArray);
}
}
Ich versuchte logback.configurationFile
Eigenschaft in meinem Java Einstellung Startoptionen, wie gut es programmatisch Einstellung wie hier detailliert (Setting logback.xml path programmatically).
Aber ich habe das gleiche Ergebnis mit beiden Ansätze: mvn test
protokolliert die Nachricht einwandfrei, aber nichts passiert, wenn ich das Test-Servlet auf localhost ausführen.
Irgendeine Idee, was das Problem sein könnte?
Weitere Informationen
ich einige Debug-Anweisungen zu LogService hinzugefügt:
System.out.println("[LogService.debug] isDebugEnabled = " + logger.isDebugEnabled());
System.out.println("[LogService.debug] getName = " + logger.getName());
System.out.println("[LogService.debug] ROOT_LOGGER_NAME = " + Logger.ROOT_LOGGER_NAME);
System.out.println("[LogService.debug] toString = " + logger.toString());
Und jetzt mvn test
und schlagen die TestServlet unterschiedlichen Ausgang geben:
mvn test says: TestServlet says:
----------------------------------------------- -----------------------------------------------
[LogService.debug] isDebugEnabled = true [LogService.debug] isDebugEnabled = false
[LogService.debug] getName = com.myapp [LogService.debug] getName = com.myapp
[LogService.debug] ROOT_LOGGER_NAME = ROOT [LogService.debug] ROOT_LOGGER_NAME = ROOT
[LogService.debug] toString = Logger[com.myapp] [LogService.debug] toString = org.slf4j.impl.JDK14LoggerAdapter(com.myapp)
so dass zumindest erklärt Warum sehe ich keine Debug-Log-Anweisungen vom TestServlet. Jetzt muss ich nur herausfinden, warum.
Zur Fehlerbehebung versuchen Sie, die Debugausgabe mit '' zu aktivieren. Alternativ aktivieren Sie Debug mit einer Systemeigenschaft '-Dlogback.debug = true'. –
tony19
@ tony19 Danke. Ich habe die Debug-Ausgabe aktiviert und die Debug-Ausgabe mit mvn test gesehen. Aber das Servlet zu schlagen, gibt mir weiterhin eine stille Behandlung. Ich fange an zu denken, dass das Problem etwas unglaublich Einfaches und Offensichtliches ist, das ich vollständig vermisst habe. – Aaron
Es sieht so aus, als ob die Logging-Protokollimplementierung nicht von SLF4J übernommen wird. Überprüfen Sie, ob logback.jar in web-app/lib vorhanden ist und dass keine anderen Logging-Implementierungen wie slf4j-jdk14 protokolliert werden. –