I am trying to use commons-logging wi开发者_开发问答th log4j to write my app logs to a file, but my logs keep going to SystemOut.log. The log file did get created, but its empty.
Here's my log4j.properties and commons-logging.properties(both should be on classpath - they're under WEB-INF/classes)
WEB-INF/classes/ log4j.properties :
log4j.rootLogger=INFO, AppLogAppender
log4j.logger.org.apache.struts2.util.TextProviderHelper=ERROR, AppLogAppender
log4j.logger.com.wawanesa=DEBUG, AppLogAppender
# AppLogAppender
log4j.appender.AppLogAppender=org.apache.log4j.FileAppender
log4j.appender.AppLogAppender.File=/waslogs/applogs/us.log
log4j.appender.AppLogAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.AppLogAppender.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
WEB-INF/classes/commons-logging.properties:
priority=1
org.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.LogFactoryImpl
I have log4j.jar and commons-logging.jar on my application classpath.I have seen the classloader problem in was6.0 where you have to make it "app first", but I dont see any commons-logging classes from the base Websphere classpath in the classloader views.
The issue with this is that the WebSphere itself using commons-logging so what is happening is that you are picking up the application server's common logging properties file. Try and change the classloader order for the module to "Load application classes first", this should mean that when your application starts up it grabs its own logging configuration rather than the servers.
The fact that the file is empty is telling us that indeed your own log4j.properties
is being called, and not some other log4j.properties
/ log4j.xml
in the classpath. Remember, File Appenders in log4j are designed so the output file is created as soon as log4j initializes - not waiting for the first log line to go there.
Now, I think you're missing this in your commons-logging.properties:
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
If that doesn't help, add the necessary system property to your WAS instance to activate log4j in "debug mode" - property name log4j.debug
, value true
.
A better solution is to use JCL over SLF4J, and Log4j bridge. This will eliminate need for commons-logging.jar in the deployable artifact, and does not require changing class loader to parent last.
Details of JCL over SLF4J are here http://www.slf4j.org/legacy.html
Use the following maven dependencies to get log4j logging to file appender in WebSphere Application Server v8.5
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.1.RELEASE</version>
<scope>runtime</scope>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.21</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
<scope>runtime</scope>
</dependency>
精彩评论