Java Log4j2不同jar的不同日志

Java Log4j2不同jar的不同日志,java,jar,log4j2,Java,Jar,Log4j2,我们正在制作一个由几个装饰过的罐子组成的程序。每个jar都需要一个单独的日志文件。问题是,当我们尝试登录核心jar文件时,日志消息会写入其他jar的日志文件中 这是核心jar文件的代码 static Logger logCore = LogManager.getLogger(); //log file created public static void main(String[] args) { LoggerContext context = (org.apache.logging

我们正在制作一个由几个装饰过的罐子组成的程序。每个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
}

如何选择要记录的日志文件?

所有JAR都由一个类加载器加载,因此只有一个Log4j实例,因此只有一个配置

据推测,每个jar文件都有来自不同包的类,您可以根据记录器名称(即生成日志消息的类的名称)将日志消息发送到不同的appender

因此,定义多个appender,然后使用
additivity=“false”
配置记录器,并为每个基本包指定要使用的appender

示例:如果您有
core.jar
和来自package
com.Example.core
和子包的类,以及
extension.jar
和来自package
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>

. . .
. . .
. . .

所有JAR都由一个类加载器加载,因此只有一个Log4j实例,因此只有一个配置

据推测,每个jar文件都有来自不同包的类,您可以根据记录器名称(即生成日志消息的类的名称)将日志消息发送到不同的appender

因此,定义多个appender,然后使用
additivity=“false”
配置记录器,并为每个基本包指定要使用的appender

示例:如果您有
core.jar
和来自package
com.Example.core
和子包的类,以及
extension.jar
和来自package
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>

. . .
. . .
. . .