[
https://issues.apache.org/jira/browse/LOG4J2-2058?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16235686#comment-16235686
]
Dean Wookey edited comment on LOG4J2-2058 at 11/2/17 1:01 PM:
--------------------------------------------------------------
I added the same test and everything passed. I wasn't able to replicate the
issue in a test possibly due to some static initialization of some object when
running tests.
I was however able to find a workaround for the issue. If you pre-initialise
the Calendar object before setting the log provider,
{code:java}
public static void main(String[] args) {
System.setProperty("java.locale.providers", "HOST");
final Calendar cal = Calendar.getInstance(TimeZone.getDefault());
System.setProperty("java.util.logging.manager",
"org.apache.logging.log4j.jul.LogManager");
Logger.getLogger(LocalePropertyTest.class.getName()).log(Level.WARNING,
"this is a test");
}
{code}
the issue no longer presents itself. That's because while creating the calendar
instance, the host provider calls the following method:
{code:java}
PlatformLogger logger =
PlatformLogger.getLogger(caller.getCanonicalName());
logger.config(message);
{code}
which eventually ends up calling the log4j logger which tries to create an
instance of the Calendar again, causing a stack overflow. If you pre-initialise
the calendar, then it will be cached and cloned the next time getInstance is
called.
Here is the (repeating) stack trace using jdk 9.0.1 and the main branch of
log4j2.
at
org.apache.logging.log4j.core.util.datetime.FixedDateFormat.calcMidnightMillis(FixedDateFormat.java:319)
at
org.apache.logging.log4j.core.util.datetime.FixedDateFormat.updateMidnightMillis(FixedDateFormat.java:310)
at
org.apache.logging.log4j.core.util.datetime.FixedDateFormat.millisSinceMidnight(FixedDateFormat.java:301)
at
org.apache.logging.log4j.core.util.datetime.FixedDateFormat.format(FixedDateFormat.java:370)
at
org.apache.logging.log4j.core.util.datetime.FixedDateFormat.format(FixedDateFormat.java:358)
at
org.apache.logging.log4j.core.pattern.DatePatternConverter$FixedFormatter.format(DatePatternConverter.java:96)
at
org.apache.logging.log4j.core.pattern.DatePatternConverter$CachedTime.<init>(DatePatternConverter.java:145)
at
org.apache.logging.log4j.core.pattern.DatePatternConverter.<init>(DatePatternConverter.java:173)
at
org.apache.logging.log4j.core.pattern.DatePatternConverter.newInstance(DatePatternConverter.java:191)
at jdk.internal.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at
org.apache.logging.log4j.core.pattern.PatternParser.createConverter(PatternParser.java:583)
at
org.apache.logging.log4j.core.pattern.PatternParser.finalizeConverter(PatternParser.java:639)
at
org.apache.logging.log4j.core.pattern.PatternParser.parse(PatternParser.java:415)
at
org.apache.logging.log4j.core.pattern.PatternParser.parse(PatternParser.java:177)
at
org.apache.logging.log4j.core.layout.PatternLayout$SerializerBuilder.build(PatternLayout.java:377)
at
org.apache.logging.log4j.core.layout.PatternLayout.<init>(PatternLayout.java:138)
at
org.apache.logging.log4j.core.layout.PatternLayout.<init>(PatternLayout.java:59)
at
org.apache.logging.log4j.core.layout.PatternLayout$Builder.build(PatternLayout.java:660)
at
org.apache.logging.log4j.core.config.AbstractConfiguration.setToDefault(AbstractConfiguration.java:586)
at
org.apache.logging.log4j.core.config.DefaultConfiguration.<init>(DefaultConfiguration.java:47)
at
org.apache.logging.log4j.core.LoggerContext.<init>(LoggerContext.java:86)
at
org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.createContext(ClassLoaderContextSelector.java:171)
at
org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(ClassLoaderContextSelector.java:145)
at
org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:70)
at
org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:57)
at
org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:148)
at
org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:45)
at org.apache.logging.log4j.LogManager.getContext(LogManager.java:194)
at
org.apache.logging.log4j.spi.AbstractLoggerAdapter.getContext(AbstractLoggerAdapter.java:122)
at
org.apache.logging.log4j.jul.AbstractLoggerAdapter.getContext(AbstractLoggerAdapter.java:34)
at
org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:46)
at org.apache.logging.log4j.jul.LogManager.getLogger(LogManager.java:89)
at
java.logging/java.util.logging.LogManager.demandSystemLogger(LogManager.java:569)
at
java.logging/java.util.logging.LogManager$LoggingProviderAccess.demandLoggerFor(LogManager.java:2682)
at
java.logging/sun.util.logging.internal.LoggingProviderImpl.demandJULLoggerFor(LoggingProviderImpl.java:411)
at
java.logging/sun.util.logging.internal.LoggingProviderImpl.demandLoggerFor(LoggingProviderImpl.java:436)
at
java.base/jdk.internal.logger.DefaultLoggerFinder.getLogger(DefaultLoggerFinder.java:161)
at
java.base/jdk.internal.logger.LazyLoggers.getLoggerFromFinder(LazyLoggers.java:389)
at
java.base/jdk.internal.logger.LazyLoggers.getLazyLogger(LazyLoggers.java:444)
at
java.base/sun.util.logging.PlatformLogger.getLogger(PlatformLogger.java:297)
at
java.base/sun.util.locale.provider.LocaleServiceProviderPool.config(LocaleServiceProviderPool.java:125)
at
java.base/sun.util.locale.provider.LocaleServiceProviderPool.getLocalizedObjectImpl(LocaleServiceProviderPool.java:285)
at
java.base/sun.util.locale.provider.LocaleServiceProviderPool.getLocalizedObject(LocaleServiceProviderPool.java:262)
at
java.base/sun.util.locale.provider.CalendarDataUtility.retrieveMinimalDaysInFirstWeek(CalendarDataUtility.java:60)
at java.base/java.util.Calendar.setWeekCountData(Calendar.java:3382)
at java.base/java.util.Calendar.<init>(Calendar.java:1600)
at
java.base/java.util.GregorianCalendar.<init>(GregorianCalendar.java:738)
at java.base/java.util.Calendar$Builder.build(Calendar.java:1482)
at
java.base/sun.util.locale.provider.HostLocaleProviderAdapterImpl$7.getInstance(HostLocaleProviderAdapterImpl.java:435)
at java.base/java.util.Calendar.createCalendar(Calendar.java:1666)
at java.base/java.util.Calendar.getInstance(Calendar.java:1627)
at
org.apache.logging.log4j.core.util.datetime.FixedDateFormat.calcMidnightMillis(FixedDateFormat.java:319)
at
org.apache.logging.log4j.core.util.datetime.FixedDateFormat.updateMidnightMillis(FixedDateFormat.java:310)
at
org.apache.logging.log4j.core.util.datetime.FixedDateFormat.millisSinceMidnight(FixedDateFormat.java:301)
at
org.apache.logging.log4j.core.util.datetime.FixedDateFormat.format(FixedDateFormat.java:370)
at
org.apache.logging.log4j.core.util.datetime.FixedDateFormat.format(FixedDateFormat.java:358)
was (Author: deanwookey):
I added the same test and everything passed. I wasn't able to replicate the
issue in a test possibly due to some static initialization of some object when
running tests.
I was however able to find a workaround for the issue. If you pre-initialise
the Calendar object before setting the log provider,
{code:java}
public static void main(String[] args) {
System.setProperty("java.locale.providers", "HOST");
final Calendar cal = Calendar.getInstance(TimeZone.getDefault());
System.setProperty("java.util.logging.manager",
"org.apache.logging.log4j.jul.LogManager");
Logger.getLogger(LocalePropertyTest.class.getName()).log(Level.WARNING,
"this is a test");
}
{code}
the issue no longer presents itself. That's because while creating the calendar
instance, the host provider calls the following method:
{code:java}
PlatformLogger logger =
PlatformLogger.getLogger(caller.getCanonicalName());
logger.config(message);
{code}
which eventually ends up calling the log4j logger which tries to create an
instance of the Calendar again, causing a stack overflow. If you pre-initialise
the calendar, then it will be cached and cloned the next time getInstance is
called.
Here is the stack trace using jdk 9.0.1 and the main branch of log4j2.
at
org.apache.logging.log4j.core.util.datetime.FixedDateFormat.calcMidnightMillis(FixedDateFormat.java:319)
at
org.apache.logging.log4j.core.util.datetime.FixedDateFormat.updateMidnightMillis(FixedDateFormat.java:310)
at
org.apache.logging.log4j.core.util.datetime.FixedDateFormat.millisSinceMidnight(FixedDateFormat.java:301)
at
org.apache.logging.log4j.core.util.datetime.FixedDateFormat.format(FixedDateFormat.java:370)
at
org.apache.logging.log4j.core.util.datetime.FixedDateFormat.format(FixedDateFormat.java:358)
at
org.apache.logging.log4j.core.pattern.DatePatternConverter$FixedFormatter.format(DatePatternConverter.java:96)
at
org.apache.logging.log4j.core.pattern.DatePatternConverter$CachedTime.<init>(DatePatternConverter.java:145)
at
org.apache.logging.log4j.core.pattern.DatePatternConverter.<init>(DatePatternConverter.java:173)
at
org.apache.logging.log4j.core.pattern.DatePatternConverter.newInstance(DatePatternConverter.java:191)
at jdk.internal.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at
org.apache.logging.log4j.core.pattern.PatternParser.createConverter(PatternParser.java:583)
at
org.apache.logging.log4j.core.pattern.PatternParser.finalizeConverter(PatternParser.java:639)
at
org.apache.logging.log4j.core.pattern.PatternParser.parse(PatternParser.java:415)
at
org.apache.logging.log4j.core.pattern.PatternParser.parse(PatternParser.java:177)
at
org.apache.logging.log4j.core.layout.PatternLayout$SerializerBuilder.build(PatternLayout.java:377)
at
org.apache.logging.log4j.core.layout.PatternLayout.<init>(PatternLayout.java:138)
at
org.apache.logging.log4j.core.layout.PatternLayout.<init>(PatternLayout.java:59)
at
org.apache.logging.log4j.core.layout.PatternLayout$Builder.build(PatternLayout.java:660)
at
org.apache.logging.log4j.core.config.AbstractConfiguration.setToDefault(AbstractConfiguration.java:586)
at
org.apache.logging.log4j.core.config.DefaultConfiguration.<init>(DefaultConfiguration.java:47)
at
org.apache.logging.log4j.core.LoggerContext.<init>(LoggerContext.java:86)
at
org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.createContext(ClassLoaderContextSelector.java:171)
at
org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(ClassLoaderContextSelector.java:145)
at
org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:70)
at
org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:57)
at
org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:148)
at
org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:45)
at org.apache.logging.log4j.LogManager.getContext(LogManager.java:194)
at
org.apache.logging.log4j.spi.AbstractLoggerAdapter.getContext(AbstractLoggerAdapter.java:122)
at
org.apache.logging.log4j.jul.AbstractLoggerAdapter.getContext(AbstractLoggerAdapter.java:34)
at
org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:46)
at org.apache.logging.log4j.jul.LogManager.getLogger(LogManager.java:89)
at
java.logging/java.util.logging.LogManager.demandSystemLogger(LogManager.java:569)
at
java.logging/java.util.logging.LogManager$LoggingProviderAccess.demandLoggerFor(LogManager.java:2682)
at
java.logging/sun.util.logging.internal.LoggingProviderImpl.demandJULLoggerFor(LoggingProviderImpl.java:411)
at
java.logging/sun.util.logging.internal.LoggingProviderImpl.demandLoggerFor(LoggingProviderImpl.java:436)
at
java.base/jdk.internal.logger.DefaultLoggerFinder.getLogger(DefaultLoggerFinder.java:161)
at
java.base/jdk.internal.logger.LazyLoggers.getLoggerFromFinder(LazyLoggers.java:389)
at
java.base/jdk.internal.logger.LazyLoggers.getLazyLogger(LazyLoggers.java:444)
at
java.base/sun.util.logging.PlatformLogger.getLogger(PlatformLogger.java:297)
at
java.base/sun.util.locale.provider.LocaleServiceProviderPool.config(LocaleServiceProviderPool.java:125)
at
java.base/sun.util.locale.provider.LocaleServiceProviderPool.getLocalizedObjectImpl(LocaleServiceProviderPool.java:285)
at
java.base/sun.util.locale.provider.LocaleServiceProviderPool.getLocalizedObject(LocaleServiceProviderPool.java:262)
at
java.base/sun.util.locale.provider.CalendarDataUtility.retrieveMinimalDaysInFirstWeek(CalendarDataUtility.java:60)
at java.base/java.util.Calendar.setWeekCountData(Calendar.java:3382)
at java.base/java.util.Calendar.<init>(Calendar.java:1600)
at
java.base/java.util.GregorianCalendar.<init>(GregorianCalendar.java:738)
at java.base/java.util.Calendar$Builder.build(Calendar.java:1482)
at
java.base/sun.util.locale.provider.HostLocaleProviderAdapterImpl$7.getInstance(HostLocaleProviderAdapterImpl.java:435)
at java.base/java.util.Calendar.createCalendar(Calendar.java:1666)
at java.base/java.util.Calendar.getInstance(Calendar.java:1627)
at
org.apache.logging.log4j.core.util.datetime.FixedDateFormat.calcMidnightMillis(FixedDateFormat.java:319)
at
org.apache.logging.log4j.core.util.datetime.FixedDateFormat.updateMidnightMillis(FixedDateFormat.java:310)
at
org.apache.logging.log4j.core.util.datetime.FixedDateFormat.millisSinceMidnight(FixedDateFormat.java:301)
at
org.apache.logging.log4j.core.util.datetime.FixedDateFormat.format(FixedDateFormat.java:370)
at
org.apache.logging.log4j.core.util.datetime.FixedDateFormat.format(FixedDateFormat.java:358)
> java.locale.providers set to HOST causes Log4j2 to crash in Java 9
> ------------------------------------------------------------------
>
> Key: LOG4J2-2058
> URL: https://issues.apache.org/jira/browse/LOG4J2-2058
> Project: Log4j 2
> Issue Type: Bug
> Components: JUL adapter, Pattern Converters
> Affects Versions: 2.9.0, 2.9.1
> Environment: Windows 10, Java 9
> Reporter: Dean Wookey
> Priority: Blocker
>
> When using the JUL log manager, setting the java.locale.providers property to
> "HOST" causes log4j2 to crash when you next log something.
> {code:java}
> import java.util.logging.Level;
> import java.util.logging.Logger;
> public class LocalePropertyTest {
> /**
> * @param args the command line arguments
> */
> public static void main(String[] args) {
> System.setProperty("java.locale.providers", "HOST,JRE,SPI");
> System.setProperty("java.util.logging.manager",
> "org.apache.logging.log4j.jul.LogManager");
>
> Logger.getLogger(LocalePropertyTest.class.getName()).log(Level.WARNING, "this
> is a test");
> }
> }
> {code}
> Used the following libraries:
> log4j-jul-2.9.1.jar
> log4j-core-2.9.1.jar
> log4j-api-2.9.1.jar
> The error is very long. Here are the first few lines:
> ERROR StatusLogger Error creating converter for d
> java.lang.reflect.InvocationTargetException
> at jdk.internal.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
> at
> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.base/java.lang.reflect.Method.invoke(Method.java:564)
> at
> org.apache.logging.log4j.core.pattern.PatternParser.createConverter(PatternParser.java:582)
> at
> org.apache.logging.log4j.core.pattern.PatternParser.finalizeConverter(PatternParser.java:638)
> at
> org.apache.logging.log4j.core.pattern.PatternParser.parse(PatternParser.java:414)
> at
> org.apache.logging.log4j.core.pattern.PatternParser.parse(PatternParser.java:177)
> at
> org.apache.logging.log4j.core.layout.PatternLayout$SerializerBuilder.build(PatternLayout.java:376)
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)