Spring-Anwendung ohne web.xml log4j-Konfiguration
Habe ich eine Feder + Jersey web-Anwendung, ich bin eine Migration von einer web.xml auf annotation-Basis-Konfiguration. Ich bin Implementierung WebApplicationInitializer und alles funktioniert, außer log4j, denn ich habe eine benutzerdefinierte Datei name.
In der web.xml ich hatte
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>/WEB-INF/custom-name-log4j.xml</param-value>
</context-param>
Dieser gearbeitet.
Nun, ich habe versucht, das gleiche zu tun in Java:
container.setInitParameter("log4jConfiguration", "/WEB-INF/custom-name-log4j.xml");
Diese funktioniert nicht... ich bekomme den folgenden Fehler in Tomcat 7.0.62:
ERROR StatusLogger No Log4j context configuration provided. This is very unusual.
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
Meine war-Datei enthält die xml-Datei in das WEB-INF/Ordner.
Muss ich mehr tun, als die Angabe, dass log4jConfiguration parameter?
Später Edit:
WebApplicationInitializer
@Override
public void onStartup(ServletContext container) {
AnnotationConfigWebApplicationContext rootContext =
new AnnotationConfigWebApplicationContext();
rootContext.register(MyApplicationConfiguration.class);
container.setInitParameter("log4jConfiguration", "/WEB-INF/custom-name-log4j.xml");
rootContext.setConfigLocation("my.package.spring");
final FilterRegistration.Dynamic characterEncodingFilter = container.addFilter("characterEncodingFilter", new CharacterEncodingFilter());
characterEncodingFilter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*");
characterEncodingFilter.setInitParameter("encoding", "UTF-8");
characterEncodingFilter.setInitParameter("forceEncoding", "true");
container.setInitParameter("spring.profiles.default", "prod");
rootContext.register(SecurityContextFilter.class);
container.addListener(new ContextLoaderListener(rootContext));
container.addListener(new RequestContextListener());
container.setInitParameter("contextConfigLocation", "");
final ServletContainer servlet = new ServletContainer();
final ServletRegistration.Dynamic appServlet = container.addServlet("appServlet", servlet);
appServlet.setInitParameter("jersey.config.server.provider.packages", "my.package");
appServlet.setLoadOnStartup(1);
final Set<String> mappingConflicts = appServlet.addMapping("/rest/*");
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie auch einen Listener registrieren :
Log4jConfigListener
(Sie finden es im org.springframework.web.util)Durch die Art und Weise, können Sie beachten Sie, dass es veraltet seit Frühjahr 4.2.1
BEARBEITEN
Sorry, ich habe nicht realisiert, dass Sie wurden mit Hilfe von log4j2,
alles, was oben angegeben ist, ist falsch, und hier ist die Lösung für Sie :
log4j2 (Dank
log4j-web
Artefakt) & Frühling sind beide unter Berufung aufServletContainerInitializer
ausservlet 3.0
- API, um den setup -ServletContext
.Das problem ist, dass die Reihenfolge, wie Sie ausgeführt werden, hängt von der Reihenfolge gescannt werden, auf dem Klassenpfad und kann man sich nicht wirklich darauf verlassen, dass es (in deinem Fall die
Log4jServletContainerInitializer
startup-Methoden aufgerufen wird, bevor der vonSpringServletContainerInitializer
).Um dies zu korrigieren, können Sie erklären, Ihre eigenen
ServletContainerInitializer
Umsetzung, die wir berücksichtigt werden, bevor andere (vor dem Scannen die classpath -) und hier ist ein Beispiel :Dann müssen Sie eine Datei erstellen :
/META-INF/services/javax.servlet.ServletContainerInitializer
gestellt und in es :
example.initializer.Log4j2ConfigServletContainerInitializer
(ändern, um Ihre Bedürfnisse anzupassen)
und die Konfiguration, die Sie zur Verfügung gestellt, um einen benutzerdefinierten log4j config Speicherort der Datei wird vor der Auslösung der
Log4jServletContainerInitializer
und alles ist wieder gut.finden Sie unter :
https://docs.oracle.com/javaee/6/api/javax/servlet/ServletContainerInitializer.html
http://www.eclipse.org/jetty/documentation/current/using-annotations.html#servlet-container-initializers
http://logging.apache.org/log4j/2.x/manual/webapp.html
BEARBEITEN
POC @ http://www.filedropper.com/32713596_1
führen Sie einfach
mvn jetty:run
WebApplicationInitializer
Umsetzung mit Ihrer Frage ?log4j2
tag, um Ihre Fragelog4jConfiguration
arbeitet immer noch mit log4j2, haben Sie einen Blick aufLog4jWebInitializerImpl
. Ich habe einen POC für Sie