通常我们在项目中手动配置log4j,一般是根据log4j的PropertyConfigurator方法,把log4j的配置文件放在项目根目录下,因为配置文件可以容易找到。
但是本人配置外部log4j的原因是:
在osgi项目中配置log4j文件时,因为是聚合项目,项目打包bundle后不一定可以找到项目根目录下的配置文件
要在karaf容器中发布,并且需要集成日志监控和elk功能,外部配置的话容易修改路径,移植性比较好
log4j 日志文件
在karaf解压目录中新建文件夹config,在config中新建文件夹logs
- karaf
- config
- logs
- log4j.properties
- config
### direct log messages to stdout ###
log4j.appender.consoleout=org.apache.log4j.ConsoleAppender
log4j.appender.consoleout.layout=org.apache.log4j.PatternLayout
log4j.appender.consoleout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c:%L - %m%n
### direct messages to file myfile.log ###
log4j.appender.karaf-log4j=org.apache.log4j.DailyRollingFileAppender
log4j.appender.karaf-log4j.File=config/logs/karaf-log4j.log
log4j.appender.karaf-log4j.DatePattern='.'yyyy-MM-dd
log4j.appender.karaf-log4j.layout=org.apache.log4j.PatternLayout
log4j.appender.karaf-log4j.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c:%L - %m%n
log4j.rootLogger==info,consoleout,karaf-log4j
log4j配置文件中的karaf-log4j.log最终会生成在logs文件夹内部
注意:log4j.rootLogger中的karaf-log4j名字必须和log4j.appender.{name}的name值保持一致
log4j.appender.karaf-log4j.*
log4j.rootLogger==info,consoleout,karaf-log4j
pom 依赖
注意:
必须在插件maven-bundle-plugin中注明Export-Package,不然在其他服务依赖此服务的时候会出现异常,找不到要加载的LoggerFactory类,Export-Package的值就是LoggerFactory的目录
maven项目的打包方式必须是bundle模式,这时候packaging可能会报异常或者错误
解决方法是:在插件maven-bundle-plugin中配置 true
<packaging>bundle</packaging>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.core</artifactId>
<version>6.0.0</version>
<scope>provided</scope>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Export-Package>
com.common.log
</Export-Package>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
LoggerFactory 加载log4j的配置文件
package com.common.log;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import java.io.File;
public class LoggerFactory {
//log配置文件相对于容器的相对路径
public static final String CONFIG_DIR = "config";
//log配置文件名称
public static final String LOG4J_CONFIG = "karaf-log4j.properties";
private static String fileName = getFileName();
public static Logger getLogger(Class clazz) {
Logger logger = Logger.getLogger(clazz);
loadProperty();
return logger;
}
private static String getFileName() {
//System.getProperty("user.dir") + File.separator 容器的绝对路径
return System.getProperty("user.dir") + File.separator + CONFIG_DIR
+ File.separator + LOG4J_CONFIG;
}
public static void loadProperty() {
PropertyConfigurator.configure(fileName);
}
}