Skip to content

Logging in Launcher prevents use of a custom JUL LogManager #9848

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
pwielgolaski opened this issue Jul 24, 2017 · 4 comments
Closed

Logging in Launcher prevents use of a custom JUL LogManager #9848

pwielgolaski opened this issue Jul 24, 2017 · 4 comments
Assignees
Labels
type: bug A general bug
Milestone

Comments

@pwielgolaski
Copy link

pwielgolaski commented Jul 24, 2017

As suggested in #3815 (comment) I create new issue for it.

I want to use log4j-jul instead of SLF4J for JUL logging.
To enable it I need to pass -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager during application start up like described https://logging.apache.org/log4j/log4j-2.8/log4j-jul/

It needs to happen before first JUL logger is created.

When I created simple application
https://github.com/pwielgolaski/boot-with-jul
and start it like that
java -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager -jar target/boot-with-jul-0.0.1-SNAPSHOT.jar

I get errors

Could not load Logmanager "org.apache.logging.log4j.jul.LogManager"
java.lang.ClassNotFoundException: org.apache.logging.log4j.jul.LogManager
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at java.util.logging.LogManager$1.run(LogManager.java:195)
        at java.util.logging.LogManager$1.run(LogManager.java:181)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.util.logging.LogManager.<clinit>(LogManager.java:181)
        at java.util.logging.Logger.demandLogger(Logger.java:448)
        at java.util.logging.Logger.getLogger(Logger.java:502)
        at org.springframework.boot.loader.jar.Handler.<init>(Handler.java:74)
        at org.springframework.boot.loader.jar.JarFile.getUrl(JarFile.java:313)
        at org.springframework.boot.loader.archive.JarFileArchive.getUrl(JarFileArchive.java:74)
        at org.springframework.boot.loader.Launcher.createClassLoader(Launcher.java:62)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:49)
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
Jul 24, 2017 8:08:14 PM me.wielgolaski.boot.BootWithJulApplication main
INFO: Log4j JUL before SpringApplication

All points to https://github.com/spring-projects/spring-boot/blob/master/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/Handler.java#L74

Based on search https://github.com/search?l=&q=java.util.logging+path%3Aspring-boot-tools%2Fspring-boot-loader+repo%3Aspring-projects%2Fspring-boot&ref=advsearch&type=Code&utf8=%E2%9C%93
It is only place where JUL logger is used in loader, so removing this logging could make it work.

@spring-projects-issues spring-projects-issues added the status: waiting-for-triage An issue we've not yet triaged label Jul 24, 2017
@philwebb philwebb added priority: normal type: bug A general bug and removed status: waiting-for-triage An issue we've not yet triaged labels Jul 24, 2017
@philwebb
Copy link
Member

I think I see what's happening here. We're trying to use JUL from our custom nested JAR Handler. When we attempt to get the logger things fail because org.apache.logging.log4j.jul.LogManager isn't available on the classpath yet (since it's a nested JAR).

@electricsam
Copy link

I am running Spring Boot 2.0.0 and am getting a similar error when running an executable war. It looks like it is related to JMX using JUL

java.lang.ClassNotFoundException: org.apache.logging.log4j.jul.LogManager
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:93)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at java.util.logging.LogManager$1.run(LogManager.java:195)
	at java.util.logging.LogManager$1.run(LogManager.java:181)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.util.logging.LogManager.<clinit>(LogManager.java:181)
	at java.util.logging.Logger.demandLogger(Logger.java:448)
	at java.util.logging.Logger.getLogger(Logger.java:502)
	at com.sun.jmx.remote.util.ClassLogger.<init>(ClassLogger.java:55)
	at javax.management.NotificationBroadcasterSupport.<clinit>(NotificationBroadcasterSupport.java:365)
	at javax.management.MBeanServerDelegate.<init>(MBeanServerDelegate.java:72)
	at com.sun.jmx.mbeanserver.MBeanServerDelegateImpl.<init>(MBeanServerDelegateImpl.java:100)
	at com.sun.jmx.mbeanserver.JmxMBeanServer.newMBeanServerDelegate(JmxMBeanServer.java:1374)
	at javax.management.MBeanServerBuilder.newMBeanServerDelegate(MBeanServerBuilder.java:66)
	at javax.management.MBeanServerFactory.newMBeanServer(MBeanServerFactory.java:321)
	at javax.management.MBeanServerFactory.createMBeanServer(MBeanServerFactory.java:231)
	at javax.management.MBeanServerFactory.createMBeanServer(MBeanServerFactory.java:192)
	at java.lang.management.ManagementFactory.getPlatformMBeanServer(ManagementFactory.java:469)
	at org.apache.logging.log4j.core.jmx.Server.reregisterMBeansAfterReconfigure(Server.java:139)
	at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:556)
	at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:617)
	at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:634)
	at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:229)
	at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:153)
	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.commons.logging.LogFactory$Log4jLog.<clinit>(LogFactory.java:199)
	at org.apache.commons.logging.LogFactory$Log4jDelegate.createLog(LogFactory.java:166)
	at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:109)
	at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:99)
	at org.springframework.boot.SpringApplication.<clinit>(SpringApplication.java:198)
	at com.example.Application.main(Application.java:106)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
	at org.springframework.boot.loader.WarLauncher.main(WarLauncher.java:58)

Here is the command I am running it with:
java -Dlogging.config="/path/to/log4j2.xml" -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager -jar application.war

@philwebb
Copy link
Member

@electricsam I don't want to re-open this one because the original issue was fixed. Can you open a new issue and provide a small sample that shows the problem please.

@electricsam
Copy link

Opened #12659

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
type: bug A general bug
Projects
None yet
Development

No branches or pull requests

4 participants