Return-Path: X-Original-To: apmail-logging-log4j-dev-archive@www.apache.org Delivered-To: apmail-logging-log4j-dev-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id AAAD510C24 for ; Thu, 12 Dec 2013 09:32:23 +0000 (UTC) Received: (qmail 75950 invoked by uid 500); 12 Dec 2013 09:32:16 -0000 Delivered-To: apmail-logging-log4j-dev-archive@logging.apache.org Received: (qmail 73555 invoked by uid 500); 12 Dec 2013 09:32:10 -0000 Mailing-List: contact log4j-dev-help@logging.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Help: List-Post: List-Id: "Log4J Developers List" Reply-To: "Log4J Developers List" Delivered-To: mailing list log4j-dev@logging.apache.org Received: (qmail 73444 invoked by uid 99); 12 Dec 2013 09:32:07 -0000 Received: from arcas.apache.org (HELO arcas.apache.org) (140.211.11.28) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 12 Dec 2013 09:32:07 +0000 Date: Thu, 12 Dec 2013 09:32:07 +0000 (UTC) From: "Daisuke Baba (JIRA)" To: log4j-dev@logging.apache.org Message-ID: In-Reply-To: References: Subject: [jira] [Commented] (LOG4J2-462) LevelPatternConverter.format may throw NPE MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 [ https://issues.apache.org/jira/browse/LOG4J2-462?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13846197#comment-13846197 ] Daisuke Baba commented on LOG4J2-462: ------------------------------------- Indeed, what I did seems to be a little bit tricky. Let me explain. I'm running my app on the Tomcat7. And I wrote a class to initialize Log4J2 with a specified file within ServletContextListener#contextInitialized(). In the Log4J2 initialization class, I wrote the code like this: {code:java} // context => a ServletContext object String log4j2File = context.getInitParameter("..."); final URI log4j2FileURI = log4j2File.toURI(); LoggerContext ctx = (LoggerContext) LogManager.getContext(false); ctx.setConfigLocation(log4j2FileURI); ctx.reconfigure(); {code} Note that I used reflection in order to manipulate {{org.apache.logging.log4j.*}} classes because I'd like to inject the log4j2 dependency dynamically rather than statically for our specific reason. I'm also enabling asynchronous logging by providing {{-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector}} option to the Tomcat startup shell. SLF4J is also included in my app. So I import the following library as well. {code:xml} org.apache.logging.log4j log4j-slf4j-impl 2.0-beta9 runtime {code} > LevelPatternConverter.format may throw NPE > ------------------------------------------ > > Key: LOG4J2-462 > URL: https://issues.apache.org/jira/browse/LOG4J2-462 > Project: Log4j 2 > Issue Type: Bug > Components: Core > Affects Versions: 2.0-beta9 > Environment: java version "1.6.0_65" > Java(TM) SE Runtime Environment (build 1.6.0_65-b14-462-11M4609) > Java HotSpot(TM) 64-Bit Server VM (build 20.65-b04-462, mixed mode) > Reporter: Daisuke Baba > > I found an issue when enabling asynchronous appenders with `-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector` and I also got a workaround to fix it. > Note that I invoke LogContext.setConfigLocation() then LogContext.reconfigure() in order to apply log4j2.xml programatically. > 1. Stacktrace ... See the bottom of the Description as it is a large portion. > 2. Workaround > Just to get rid of toString() at line 123 from the following snippet: > {code:title=2.0-beta-9.org.apache.logging.log4j.core.pattern.LevelPatternConverter.java|borderStyle=solid} > 122 public void format(final LogEvent event, final StringBuilder output) { > 123 output.append(levelMap == null ? event.getLevel().toString() : levelMap.get(event.getLevel())); > 124 } > {code} > The workaround is as follows: > {code:title=MyWorkaround|borderStyle=solid} > 122 public void format(final LogEvent event, final StringBuilder output) { > 123 output.append(levelMap == null ? event.getLevel() : levelMap.get(event.getLevel())); > 124 } > {code} > 3. Log4j2.xml > {code:title=log4j2.xml snip|borderStyle=solid} > fileName="foo.log" > filePattern="foo-%d{MM-dd-yyyy}-%i.log.gz"> > pattern="%d{yyyy-MM-dd HH:mm:ss,SSS z} %-5p [%t] (%F:%L) - [server($${sys:something})]-[%X{Something}]-%m%n" /> > > modulate="true" /> > > > > > {code} > I'm not sure why event.getLevel() was null but the workaround works for me. > ---- > Full stacktrace: > 2013-12-05 09:36:58,947 ERROR An exception occurred processing Appender MySizeRollingLog java.lang.NullPointerException > at org.apache.logging.log4j.core.pattern.LevelPatternConverter.format(LevelPatternConverter.java:122) > at org.apache.logging.log4j.core.pattern.PatternFormatter.format(PatternFormatter.java:36) > at org.apache.logging.log4j.core.layout.PatternLayout.toSerializable(PatternLayout.java:167) > at org.apache.logging.log4j.core.layout.PatternLayout.toSerializable(PatternLayout.java:52) > at org.apache.logging.log4j.core.layout.AbstractStringLayout.toByteArray(AbstractStringLayout.java:45) > at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.append(AbstractOutputStreamAppender.java:111) > at org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.append(RollingRandomAccessFileAppender.java:96) > at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:99) > at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:425) > at org.apache.logging.log4j.core.async.AsyncLoggerConfig.asyncCallAppenders(AsyncLoggerConfig.java:116) > at org.apache.logging.log4j.core.async.AsyncLoggerConfigHelper$Log4jEventWrapperHandler.onEvent(AsyncLoggerConfigHelper.java:218) > at org.apache.logging.log4j.core.async.AsyncLoggerConfigHelper$Log4jEventWrapperHandler.onEvent(AsyncLoggerConfigHelper.java:203) > at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:133) > at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) > at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) > at java.lang.Thread.run(Thread.java:695) -- This message was sent by Atlassian JIRA (v6.1.4#6159) --------------------------------------------------------------------- To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org For additional commands, e-mail: log4j-dev-help@logging.apache.org