Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to configure Log4J2

I have spent a couple hours now trying to figure this out and am at a complete loss. I find the new configuration process unnecessarily complex.

I have a Servlet with a web.xml file with the following:

<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>file:///etc/myApp/log4j2.xml</param-value>
</context-param>

It doesn't seem to have any effect. I am using Tomcat 7.0.42, and I have removed all references to log4j*.jar in the catalina.properties file. The logs in my app are still being sent, but they are just being sent to System.out with none of the formatting I specified.

So, I tried to just do it by hand on my own:

InputStream in =
    new FileInputStream(new File("/etc/myApp/log4j2.xml"));
ConfigurationSource source = new ConfigurationSource(in);
ConfigurationFactory factory = new XMLConfigurationFactory();
Configuration configuration = factory.getConfiguration(source);
LoggerContext context = (LoggerContext) LogManager.getContext();
context.start(configuration);
context.updateLoggers();

Logger.getLogger("Test").log(Level.INFO, "This is a logging message.");

First, this seems entirely convoluted. Clearly there exists some code that will search for different files and assume file types based on their extensions via the "log4jConfiguration" property, so why isn't there a LogManger.reconfigure(String) that has the same effect?

Second, this has no effect either. Again, the log is printed to System.out, and none of the requested formatting is being done.

Here is the contents of my log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>

    <File name="LogFile" fileName="/var/log/myApp/myApp.log">
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %p %c{1.} [%t] %m%n"/>
    </File>
  </Appenders>
  <Loggers>
    <Root level="DEBUG">
      <AppenderRef ref="Console" level="DEBUG"/>
      <AppenderRef ref="LogFile" level="DEBUG"/>
    </Root>
  </Loggers>
</Configuration>

The output in both cases comes out something like:

Dec 03, 2013 6:06:45 PM test.Test main
INFO: This is a logging message.

Thanks in advance,

John

EDIT: This is actually working. It appears that I was missing, "log4j-jcl-2.0-beta9.jar". Remko Popma's answer works as well, if the "context-param" above is not working.

like image 576
jojenki Avatar asked Dec 03 '13 23:12

jojenki


People also ask

How do I enable log4j2?

Configuration of Log4j 2 can be accomplished in 1 of 4 ways: Through a configuration file written in XML, JSON, YAML, or properties format. Programmatically, by creating a ConfigurationFactory and Configuration implementation.

What is configuration status in log4j2?

Configuration: the root element of a log4j2 configuration file; the status attribute represents the level at which internal log4j events should be logged. Appenders: this element contains a list of appenders; in our example, an appender corresponding to the System console is defined.

Where is the log4j2 configuration file?

By default, we'll leave the Log4j2 configuration file (log4j2. xml/log4j2-spring. xml) in the project classpath or resources folder.


1 Answers

There are many possible scenarios with webapp logging, which makes configuration more complex than the ideal. Putting the log4j2 jars and the config file in your webapp's classpath should work. Did you see the manual page for log4j2 use in web apps? If the issue remains, please file a log4j2 jira ticket.

like image 162
Remko Popma Avatar answered Oct 02 '22 14:10

Remko Popma