[ 
https://issues.apache.org/jira/browse/LOG4J2-2058?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16235686#comment-16235686
 ] 

Dean Wookey commented on LOG4J2-2058:
-------------------------------------

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)

Reply via email to