Set log4j log level

2019-01-17 20:18发布

I'm currently working on a project that uses log4j. I'm running a testcase (junit) and would like to set the log level to trace so that I can see if all the values are correct. Classes that use logging in the project contain a line like the following:

private static final Log LOG = LogFactory.getLog(MatchTaskTest.class);

and use a like like this to do the actual debugging

LOG.trace("value");

I have never used log4j before, does anybody know how I can change the log level just for the testcase, preferably simply by defining a parameter in eclipse's run configuration dialog.

6条回答
Viruses.
2楼-- · 2019-01-17 21:05

I don't think this is possible.

The config file is going to let you configure what log messages actually surface in the log, not what level each message is going be logged at. This makes sense - the config should not affect the level of the message.

The javadoc has a method for each log level and a generic log method, which takes in a priority, so I'm not sure there's even a default to be set.

You can set a config file explictly on the command line via -Dlog4j.configuration=<FILE_PATH>, so you could set up a specific config for that test case.

查看更多
欢心
3楼-- · 2019-01-17 21:09

I actually put it in the @Before method. But I believe it could (and should) be placed in the @BeforeClass.

If you set it in the class body you'll get compiler errors.

查看更多
混吃等死
4楼-- · 2019-01-17 21:12

In your junit class put:

Logger.getRootLogger().setLevel(Level.TRACE);

somewhere before the execution of the tested method. It will set the threshold level of the root logger to TRACE.

查看更多
beautiful°
5楼-- · 2019-01-17 21:18

Using another configuration file

Perhaps you could point to another configuration file.

java -Dlog4j.configuration=config file yourApp

Where:

  • config, you file of configuration, e.g. log4j.properties or log4j.xml.
  • file, the log file, e.g. myApp.log
  • yourApp, you app, e.g. MyAppGUI

Or you can use a class

java -Dlog4j.configurationClass=config class yourApp

Where:

  • config, you file of configuration, e.g. log4j.properties or log4j.xml.
  • class, any customized initialization class, like LogManager, should implement the org.apache.log4j.spi.Configurator
  • yourApp, you app, e.g. MyAppGUI

You can see more in Apache log4j 1.2 - Short introduction to log4j on Default Initialization Procedure section.

Modifying the level programmatically

Moreover, you can also use the methods that offers the Logger class, like public void setLevel(Level level), e.g.:

Logger.getRootLogger().setLevel(Level.TRACE);

Since you want only for testing purposes, you could use them. But it is recommended not to use in client code because they overwrite the default configuration parameters in hard coded. The best way is to use an external configuration file.

查看更多
放我归山
6楼-- · 2019-01-17 21:18

If you're using Maven, you can have two log4j configuration files:

  • one in src/main/resources, containing your production logging config
  • one in src/test/resources, containing your test-time logging config

Maven will automatically use the latter at test time, and bundle the former into your artifact (JAR, WAR, etc) so that it's used in production. You don't have to mess around with command line switches or anything.

查看更多
叼着烟拽天下
7楼-- · 2019-01-17 21:19

I have no idea why some of the above didn't work for me. (I don't want to write config file). following works for me

Logger log1 = Deencapsulation.getField(Some.class,"logger");
log1.setLevel(Level.DEBUG);
查看更多
登录 后发表回答