Reputation: 73
We are using log4j for logging purposes. We are using log4j 2.x through 1.2 bridge. Due to size of the application, we cannot upgrade to 2.x. Problem we are facing is that at the time of rollover, log4j gets deadlocked and the whole application hangs up. Here are my configuration and thread dump.
<?xml version="1.0"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.EnhancedPatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%t][%c{1}:%L] %m%n" />
</layout>
</appender>
<appender name="FILE" class="org.apache.log4j.rolling.RollingFileAppender">
<rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
<param name="FileNamePattern" value="@liferay.home@/logs/[email protected]@.%d{yyyy-MM-dd}.log" />
</rollingPolicy>
<layout class="org.apache.log4j.EnhancedPatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%t][%c{1}:%L] %m%n" />
</layout>
</appender>
<category name="com.browseengine.bobo">
<priority value="ERROR" />
</category>
<root>
<priority value="INFO" />
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</log4j:configuration>
Thread dump:
Found one Java-level deadlock:
=============================
"http-nio-8080-exec-79":
waiting to lock monitor 0x000001e77592f9f8 (object 0x00000005c2a7e928, a org.apache.log4j.rolling.RollingFileAppender),
which is held by "http-nio-8080-exec-2"
"http-nio-8080-exec-2":
waiting to lock monitor 0x000001e76f9b06f8 (object 0x00000005e6beba58, a java.io.OutputStreamWriter),
which is held by "http-nio-8080-exec-20"
"http-nio-8080-exec-20":
waiting to lock monitor 0x000001e77592f9f8 (object 0x00000005c2a7e928, a org.apache.log4j.rolling.RollingFileAppender),
which is held by "http-nio-8080-exec-2"
Java stack information for the threads listed above:
===================================================
"http-nio-8080-exec-79":
at org.apache.log4j.rolling.RollingFileAppender.rollover(RollingFileAppender.java:224)
- waiting to lock <0x00000005c2a7e928> (a org.apache.log4j.rolling.RollingFileAppender)
at org.apache.log4j.rolling.RollingFileAppender.subAppend(RollingFileAppender.java:353)
at org.apache.log4j.WriterAppender.append(WriterAppender.java:158)
at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:112)
at org.apache.log4j.bridge.AppenderAdapter$Adapter.append(AppenderAdapter.java:59)
at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:161)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:134)
at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:125)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:89)
at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:675)
at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:633)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:616)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:523)
at org.apache.logging.log4j.core.config.DefaultReliabilityStrategy.log(DefaultReliabilityStrategy.java:49)
at org.apache.logging.log4j.core.Logger.logMessage(Logger.java:153)
at org.apache.log4j.Category.forcedLog(Category.java:316)
at org.apache.log4j.Category.log(Category.java:557)
at com.liferay.portal.log.Log4jLogImpl.info(Log4jLogImpl.java:83)
at com.liferay.portal.kernel.log.LogWrapper.info(LogWrapper.java:123)
at com.liferay.portal.kernel.log.SanitizerLogWrapper.info(SanitizerLogWrapper.java:140)
at com.elixir.tango.helium.events.CustomLoginPostAction.run(CustomLoginPostAction.java:69)
at com.liferay.portal.kernel.events.InvokerAction.run(InvokerAction.java:41)
at com.liferay.portal.events.EventsProcessorImpl.processEvent(EventsProcessorImpl.java:83)
at com.liferay.portal.events.EventsProcessorImpl.process(EventsProcessorImpl.java:69)
at com.liferay.portal.ee.license.EventsProcessorImpl.process(Unknown Source)
at com.liferay.portal.events.EventsProcessorUtil.process(EventsProcessorUtil.java:40)
at com.liferay.portal.servlet.MainServlet.loginUser(MainServlet.java:1050)
at com.liferay.portal.servlet.MainServlet.service(MainServlet.java:510)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.filters.HttpHeaderSecurityFilter.doFilter(HttpHeaderSecurityFilter.java:126)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:169)
at com.liferay.portal.servlet.filters.uploadservletrequest.UploadServletRequestFilter.processFilter(UploadServletRequestFilter.java:93)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:59)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:204)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:109)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:169)
at com.liferay.portal.servlet.filters.strip.StripFilter.processFilter(StripFilter.java:361)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:59)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:204)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:109)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:169)
at com.liferay.portal.servlet.filters.secure.SecureFilter.processFilter(SecureFilter.java:312)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:59)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:204)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:109)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:169)
at com.liferay.portal.servlet.filters.jsoncontenttype.JSONContentTypeFilter.processFilter(JSONContentTypeFilter.java:42)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:59)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:204)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:109)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:185)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:185)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:738)
at com.liferay.portal.servlet.filters.urlrewrite.UrlRewriteFilter.processFilter(UrlRewriteFilter.java:57)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:59)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:204)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:109)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:165)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:165)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:185)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter.doFilter(InvokerFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:492)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:165)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:1025)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at com.elixir.tango.tangofilters.ProcessingValve.invoke(ProcessingValve.java:52)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:451)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1201)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:654)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1782)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1741)
- locked <0x00000005eacac390> (a org.apache.tomcat.util.net.NioChannel)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:750)
"http-nio-8080-exec-2":
at sun.nio.cs.StreamEncoder.close(StreamEncoder.java:147)
- waiting to lock <0x00000005e6beba58> (a java.io.OutputStreamWriter)
at java.io.OutputStreamWriter.close(OutputStreamWriter.java:233)
at java.io.FilterWriter.close(FilterWriter.java:104)
at org.apache.log4j.WriterAppender.closeWriter(WriterAppender.java:213)
at org.apache.log4j.rolling.RollingFileAppender.rollover(RollingFileAppender.java:290)
- locked <0x00000005c2a7e928> (a org.apache.log4j.rolling.RollingFileAppender)
at org.apache.log4j.rolling.RollingFileAppender.subAppend(RollingFileAppender.java:353)
at org.apache.log4j.WriterAppender.append(WriterAppender.java:158)
at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:112)
at org.apache.log4j.bridge.AppenderAdapter$Adapter.append(AppenderAdapter.java:59)
at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:161)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:134)
at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:125)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:89)
at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:675)
at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:633)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:616)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:523)
at org.apache.logging.log4j.core.config.DefaultReliabilityStrategy.log(DefaultReliabilityStrategy.java:49)
at org.apache.logging.log4j.core.Logger.logMessage(Logger.java:153)
at org.apache.log4j.Category.forcedLog(Category.java:316)
at org.apache.log4j.Category.log(Category.java:557)
at com.liferay.portal.log.Log4jLogImpl.info(Log4jLogImpl.java:83)
at com.liferay.portal.kernel.log.LogWrapper.info(LogWrapper.java:123)
at com.liferay.portal.kernel.log.SanitizerLogWrapper.info(SanitizerLogWrapper.java:140)
at com.elixir.tango.identity.ticket.TangoTicketUtil.getRedisKeyFromTicket(TangoTicketUtil.java:706)
at com.elixir.tango.identity.helper.filter.TangoServicesAuthFilter.doFilter(TangoServicesAuthFilter.java:136)
at com.elixir.tango.identity.helper.filter.TangoServicesAuthFilter.doFilter(TangoServicesAuthFilter.java:47)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.elixir.tango.store.filter.EntityManagerFilter.doFilter(EntityManagerFilter.java:45)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:492)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:165)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:1025)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at com.elixir.tango.tangofilters.ProcessingValve.invoke(ProcessingValve.java:52)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:451)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1201)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:654)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1782)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1741)
- locked <0x00000005e9d8f6c0> (a org.apache.tomcat.util.net.NioChannel)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:750)
"http-nio-8080-exec-20":
at org.apache.log4j.rolling.RollingFileAppender.incrementFileLength(RollingFileAppender.java:433)
- waiting to lock <0x00000005c2a7e928> (a org.apache.log4j.rolling.RollingFileAppender)
at org.apache.log4j.rolling.RollingFileAppender$CountingOutputStream.write(RollingFileAppender.java:521)
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:295)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141)
- locked <0x00000005e6beba58> (a java.io.OutputStreamWriter)
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229)
at org.apache.log4j.helpers.QuietWriter.flush(QuietWriter.java:55)
at org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:326)
at org.apache.log4j.rolling.RollingFileAppender.subAppend(RollingFileAppender.java:359)
at org.apache.log4j.WriterAppender.append(WriterAppender.java:158)
at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:112)
at org.apache.log4j.bridge.AppenderAdapter$Adapter.append(AppenderAdapter.java:59)
at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:161)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:134)
at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:125)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:89)
at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:675)
at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:633)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:616)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:523)
at org.apache.logging.log4j.core.config.DefaultReliabilityStrategy.log(DefaultReliabilityStrategy.java:49)
at org.apache.logging.log4j.core.Logger.logMessage(Logger.java:153)
at org.apache.log4j.Category.forcedLog(Category.java:316)
at org.apache.log4j.Category.log(Category.java:557)
at com.liferay.portal.log.Log4jLogImpl.info(Log4jLogImpl.java:83)
at com.liferay.portal.kernel.log.LogWrapper.info(LogWrapper.java:123)
at com.liferay.portal.kernel.log.SanitizerLogWrapper.info(SanitizerLogWrapper.java:140)
at com.elixir.tango.identity.ticket.TangoTicketUtil.getRedisKeyFromTicket(TangoTicketUtil.java:706)
at com.elixir.tango.identity.helper.filter.TangoServicesAuthFilter.doFilter(TangoServicesAuthFilter.java:136)
at com.elixir.tango.identity.helper.filter.TangoServicesAuthFilter.doFilter(TangoServicesAuthFilter.java:47)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.elixir.tango.store.filter.EntityManagerFilter.doFilter(EntityManagerFilter.java:45)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:492)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:165)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:1025)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at com.elixir.tango.tangofilters.ProcessingValve.invoke(ProcessingValve.java:52)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:451)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1201)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:654)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1782)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1741)
- locked <0x00000005e9d9c9d8> (a org.apache.tomcat.util.net.NioChannel)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:750)
Found 1 deadlock.
Please note that we are using liferay 6.2, java 1.8, log4j-1.2-api-2.17.2.jar and log4j 2.17.2
Update 1:
After updating to latest version of bridge, api and core i.e., log4j-1.2-api-2.23.1.jar, log4j-api-2.23.1, log4j-core-2.23.1.jar, I'm getting below exception:
2024-07-01T11:07:34.858Z localhost-startStop-1 ERROR Unable to create RollingFileAppender, no file name provided.
2024-07-01T11:07:34.936Z localhost-startStop-1 ERROR Could not parse null. java.lang.NullPointerException
at org.apache.log4j.bridge.AppenderWrapper.getName(AppenderWrapper.java:114)
at org.apache.log4j.xml.XmlConfiguration.lambda$parse$6(XmlConfiguration.java:779)
at org.apache.log4j.xml.XmlConfiguration.lambda$forEachElement$8(XmlConfiguration.java:796)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
With latest version, I'm using below configurations
<?xml version="1.0"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.EnhancedPatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%t][%c{1}:%L] %m%n" />
</layout>
</appender>
<appender name="FILE" class="org.apache.log4j.rolling.RollingFileAppender">
<rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
<param name="FileNamePattern" value="@liferay.home@/logs/[email protected]@.%d{yyyy-MM-dd}.log" />
</rollingPolicy>
<layout class="org.apache.log4j.EnhancedPatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%t][%c{1}:%L] %m%n" />
</layout>
</appender>
<root>
<priority value="INFO" />
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</log4j:configuration>
Upvotes: 1
Views: 237
Reputation: 16185
Log4j 1 had many known deadlock problems. This is one of the reasons it was replaced by Log4j 2.
As far as I can tell, you are only using log4j-1.2-api
to automatically convert your Log4j 1 configuration file into a Log4j 2 configuration file at runtime. The conversion uses the following algorithm:
log4j-1.2-api
that knows how to convert a Log4j 1 component configuration into the equivalent Log4j 2 component configuration, it is used.In your case:
org.apache.log4j.ConsoleAppender
is replaced by org.apache.logging.log4j.core.appender.ConsoleAppender
,org.apache.log4j.rolling.RollingFileAppender
(which is not part of Log4j 1, but Apache Extras for Apache Log4j) is used directly.To solve your problem:
2.18.0
, see LOG4J2-3483), which will replace the usage of org.apache.log4j.rolling.RollingFileAppender
with the Log4j 2 component org.apache.logging.log4j.core.appender.rolling.RollingFileAppender
.log4j.xml
configuration file with the equivalent log4j2.xml
configuration file:<?xml version="1.0" encoding="UTF-8" ?>
<Configuration xmlns="https://logging.apache.org/xml/ns"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://logging.apache.org/xml/ns
https://logging.apache.org/xml/ns/log4j-config-2.xsd">
<Appenders>
<Console name="CONSOLE">
<PatternLayout pattern="%d{ABSOLUTE} %-5p [%t][%c{1}:%L] %m%n"/>
</Console>
<RollingFile name="FILE"
filePattern="@liferay.home@/logs/[email protected]@.%d{yyyy-MM-dd}.log">
<PatternLayout pattern="%d{ABSOLUTE} %-5p [%t][%c{1}:%L] %m%n"/>
<TimeBasedTriggeringPolicy/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="CONSOLE"/>
<AppenderRef ref="FILE"/>
</Root>
<Logger name="com.browseengine.bobo" level="ERROR"/>
</Loggers>
</Configuration>
The second solution is the recommended one, since it does not rely on log4j-1.2-api
to convert the configuration file.
Remark: You can check our updated migration page.
Given that almost nobody uses Log4j 1 directly in their code since 20 years (the time JCL and SLF4J were released), chances are you can already remove log4j-1.2-api
from your dependencies.
Upvotes: 1
Reputation: 20541
Problem lies in method
public synchronized void incrementFileLength(int increment) {
this.fileLength += (long)increment;
}
of RollingFileAppender
.
It shouldn't be synchronized on this
.
Unfortunately bug isn't fixed yet.
Fortunately it reproduces in rare circumstances.
Upvotes: 0