I log4j2 trying to set up logging in Spring 4 MVC via log4j2 , but no logs are written to the console or to the file. In the settings, log4j2 set the output of its initialization information to the DEBUG level and it was clear that the configuration was pulling up. The Spring controller is working, tested on System.out.println() . I found several options for log4j2 integration in spring in Google, but none of them helped.


Web.xml

 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/config/applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/config/mvc-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!--<welcome-file-list>--> <!--<welcome-file>/WEB-INF/view/index.jsp</welcome-file>--> <!--</welcome-file-list>--> <error-page> <error-code>404</error-code> <location>/WEB-INF/view/error/error404.jsp</location> </error-page> </web-app> 

log4j2.xml

 <?xml version="1.0" encoding="UTF-8"?> <configuration status="INFO"> <properties> <property name="string_log">%-23d{dd-MM-yyyy HH:mm:ss}[%-5p] %-42l %m%n</property> </properties> <Appenders> <Console name="console"> <PatternLayout> <pattern></pattern> </PatternLayout> </Console> <RollingFile name="file" fileName="/home/bleser/logs/working.log" filePattern="/home/bleser/logs/%d{dd-MM-yy}/working-%d{dd-MM-yy}.log" immediateFlush="false"> <Policies> <SizeBasedTriggeringPolicy size="1 MB"/> <TimeBasedTriggeringPolicy interval="20" modulate="true"/> </Policies> <PatternLayout pattern="" charset="UTF-8"/> </RollingFile> </Appenders> <Loggers> <Root level="info"> <appender-ref ref="console"/> </Root> <Logger name="net.bleser" level="INFO" additivity="true"> <appender-ref ref="file"/> </Logger> </Loggers> </configuration> 

POM Dependencies

 <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>${servlet.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>${jsp.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>4.3.3.RELEASE</version> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>9.4.1211</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.6.2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.6.2</version> </dependency> <dependency> <groupId>org.atteo.moonshine</groupId> <artifactId>spring-data</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> </dependency> <dependency> <groupId>javax.el</groupId> <artifactId>javax.el-api</artifactId> <version>3.0.1-b04</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-web</artifactId> <version>2.6.2</version> </dependency> </dependencies> 

Controller

 @Controller public class UserController { static final Logger log = LogManager.getLogger(UserController.class.getName()); @Qualifier("userService") @Autowired private UserService service; @RequestMapping(value = "/") public String main(Model model){ log.info("log"); model.addAttribute("user",new User()); User user = new User(1,"test","test"); model.addAttribute("users",user); return "/index"; } } 
  • And where do you log4j2.xml pull up? The code is not visible. - barmaglott
  • In the static final Logger log = LogManager.getLogger(UserController.class.getName()); controller static final Logger log = LogManager.getLogger(UserController.class.getName()); he starts looking for log4j2.xml .json .properties files log4j2.xml .json .properties - Bleser
  • show the project structure, where do you have log4j2.xml? - mit

2 answers 2

For spring 4.1.1, log4j 2.4.1 (2 years ago) decided so

 <bean id="logging" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetClass" value="com.хххх.spring.ХLog4j2Configurer" /> <property name="targetMethod" value="initLogging" /> <property name="arguments"> <list> <value>${appFolder}/conf/log4j2.xml</value> </list> </property> </bean> 

bin:

 public class ХLog4j2Configurer { /** Extension that indicates a log4j XML config file: ".xml" */ public static final String XML_FILE_EXTENSION = ".xml"; public static void initLogging(String location) throws FileNotFoundException, Exception { String resolvedLocation = SystemPropertyUtils.resolvePlaceholders(location); URL url = ResourceUtils.getURL(resolvedLocation); if (resolvedLocation.toLowerCase().endsWith(XML_FILE_EXTENSION)) { Object ctx = LogManager.getContext(); if (ctx instanceof AsyncLoggerContext){ System.out.println("Full async Log4j2 detected! See JVM prop:" + " -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector"); AsyncLoggerContext asyncCtx = (AsyncLoggerContext)ctx; asyncCtx.setConfigLocation(url.toURI()); }else{ Configurator.initialize("app", ХLog4j2Configurer.class.getClassLoader() , url.toURI()); } } else { System.out.println("Not found log4j2.xml config !"); } } 

}

  • Unfortunately, this method did not work for me. - Bleser

Accidentally found the reason why the logs were not displayed
Everything was due to the fact that PatternLayout for the file and console was not registered in the configuration file:

 <PatternLayout> <pattern></pattern> </PatternLayout> 

 <PatternLayout pattern="" charset="UTF-8"/> 

In order to make everything work you need to register:

 <PatternLayout> <pattern>${string_log}</pattern> </PatternLayout> 

 <PatternLayout pattern="${string_log}" charset="UTF-8"/>