我们正在制作一个由几个嵌入式罐子组成的程序。每个jar都需要一个单独的日志文件。问题是,当我们尝试登录核心jar文件时,日志消息将写入其他jar的日志文件中。
这是核心jar文件的代码。
static Logger logCore = LogManager.getLogger(); //log file created
public static void main(String[] args)
{
LoggerContext context = (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
org.apache.logging.log4j.core.selector.BasicContextSelector
File file = new File("/home/pi/NetBeansProjects/CoreService/dist/log4j2.xml");
context.setConfigLocation(file.toURI());
logCore.info("Core Service initiated"); //Log here is done in the lof od the Core jar as expected
//Run methods of another jar (DBcontrollers)
try
{
SmartBoxSN = DBControllers.DeviceSetupController.GetOwnDeviceSetupFieldNameID(3).Value;
}
catch(SQLException | ClassNotFoundException ex)
{
}
logCore.info("Core Service initiated"); //Log here is wrongly done in the log file of DBControllers
}
我们如何选择我们要记录的日志文件?
答案 0 :(得分:1)
所有的jar都是由一个ClassLoader加载的,所以只有一个Log4j实例,因此只有一个配置。
据推测,每个jar文件都有来自不同包的类,您可以根据记录器名称(即生成日志消息的类的名称)将日志消息发送到不同的appender。
因此,定义多个appender,然后使用additivity="false"
配置记录器,并为每个基本包指定要使用的appender。
示例:如果core.jar
包含来自包com.example.core
和子包的类,extension.jar
包含来自包com.example.ext
和子包的类,则可以使用类似的配置这样:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<File name="MainFile" fileName="main.log">
. . .
</File>
<File name="CoreFile" fileName="core.log">
. . .
</File>
<File name="ExtFile" fileName="ext.log">
. . .
</File>
</Appenders>
<Loggers>
<Logger name="com.example.core" level="info" additivity="false">
<AppenderRef ref="CoreFile"/>
</Logger>
<Logger name="com.example.ext" level="info" additivity="false">
<AppenderRef ref="ExtFile"/>
</Logger>
<Root level="info">
<AppenderRef ref="MainFile"/>
</Root>
</Loggers>
</Configuration>