繁体   English   中英

使用Log4j登录单独的.log文件

[英]Logging in separate .log files using Log4j

我正在开发一个多模块Maven Web项目。

假设结构看起来像这样:

Project
    Module1
    Module2
    Persist
        log4j.properties

我设法将所有日志条目记录到一个文件中(将log4j.properties文件放置在project-persist模块中)。 到目前为止,这很清楚。 现在,有一些模块我想将日志分成其他文件。 仅添加一个新的附加程序(示例中为testAppender)对我不起作用,因为那样一来,我就无法获取写入日志的.java文件的路径。 如果我这样写:

Logger log = Logger.getLogger("testAppender");

我得到这样的东西:

2017-276-06 15:00:00,032 [INFO ] Start rule activation. (testAppender)[__ejb-thread-pool3]

这就是我想要的:

2016-06-06 15:00:00,032 [INFO ] Start rule activation. (Module1.src.main.java.somepkg.MyClass)[__ejb-thread-pool3]

其中MyClass是.java文件。

我还尝试向Maven模块(Module1和Module2)中添加一个全新的(独立的)log4j.properties文件,就像在Persist模块中一样,我想使用不同的路径将日志与.log分开。文件,但它仅记录来自Maven测试的条目-这是我遇到的另一个问题,但一次只能记录一个。

有没有一种方法可以添加一个新的附加程序,该附加程序将按其所来自的模块分隔日志条目,并将其打印在.log文件中?

在jar模块中,从jar中排除文件:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <version>2.3.1</version>
  <configuration>
    <excludes>
        <exclude>log4j.xml</exclude>
    </excludes>
  </configuration>
</plugin>

使用buildhelper插件将log4j.xml作为单独的工件附加到构建

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>build-helper-maven-plugin</artifactId>
  <version>1.5</version>
  <executions>
    <execution>
      <id>attach-artifacts</id>
      <phase>package</phase>
      <goals>
        <goal>attach-artifact</goal>
      </goals>
      <configuration>
        <artifacts>
          <artifact>
            <file>${project.build.outputDirectory}/log4j.xml</file>
              <type>xml</type>
            <classifier>log4j</classifier>
          </artifact>
        </artifacts>
      </configuration>
    </execution>
  </executions>
</plugin>

现在在您的战争工件中,将xml复制到输出目录:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <executions>
    <execution>
      <id>copy</id>
      <phase>prepare-package</phase>
      <goals>
        <goal>copy</goal>
      </goals>
      <configuration>
        <artifactItems>
          <artifactItem>
            <groupId>${project.groupId}</groupId>
            <artifactId>your.jar.project.artifactId</artifactId>
            <version>${project.version}</version>
            <type>xml</type>
            <classifier>log4j</classifier>
            <outputDirectory>${project.build.outputDirectory}
            </outputDirectory>
            <destFileName>log4j.xml</destFileName>
          </artifactItem>
        </artifactItems>
      </configuration>
    </execution>
  </executions>
 </plugin>

但是当然,首先将文件放在[web-artifact] / src / main / resources中会更容易:-)

因此,我找到了解决此问题的方法。

我创建了一个获取记录器对象的类,并从记录器对象中获取了将它们分开所需的信息。 我会手动初始化记录器。 希望这会对某人有所帮助!

在每个使用Logger的类中,我也称为初始化器。

public class ClassA{

     private final Logger LOGGER = Logger.getLogger(ClassA.class);
     static{         
        LOGGER.addAppender(LogConfig.init(LOGGER));    
     }

     some code...
  }

这是我在LogConfig类中所做的:

public class LogConfig {

public static RollingFileAppender init(Logger LOGGER) {

    String logInfo = LOGGER.getClass().toString();

    String loglevel = getLogLevel(logInfo);
    String logClazz = getLogClazz(logInfo);
    String logModule = getModule(logInfo);

    PatternLayout PL = new PatternLayout("%d [%-5p] %m (%c)[%t]%n");

    try {
        if (logModule == "presentation") {
        RollingFileAppender appender = new RollingFileAppender(PL, "PathToLogFile_1.log", true);
        return appender;
    } 
    else if (logModule == "business") {
        RollingFileAppender appender = new RollingFileAppender(PL, "PathToLogFile_2.log", true);
        return appender;
    }

    RollingFileAppender appender = new RollingFileAppender(PL, "PathToLogFile_3.log", true);
    return appender;

    }catch (IOException e) {
        e.printStackTrace();
    }
    return null;
    }

private static String getLogClazz(String logInfo) {
    return logInfo.substring(logInfo.indexOf("("), logInfo.indexOf(")") + 1);
}

private static String getLogLevel(String logInfo) {
    return logInfo.substring(24, 31);
}

private static String getModule(String logInfo) {
    logInfo = logInfo.substring(logInfo.indexOf("(") + 15, logInfo.length());
    return logInfo.substring(0, logInfo.indexOf("."));
    }
}

如果您曾经使用此代码,请注意,您将不得不调整三种返回类名,日志级别和模块名的方法,具体取决于您对包,类,模块等的命名方式。

LOGGER.getClass()。toString(); 返回一个看起来像这样的字符串

[timestamp]    (moduleName.packageName.src.java.yourClassName);

使用String.class()方法,您可以轻松获取所需的信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM