Log4j日志优先级和自定义优先级
1、log4j依赖包导入
log4j优先级是日志打印过程中根据需求通过不同的优先级打印不同的日志(如日常日志和错误日志通过不同级别来输出到不同的文件中)。在使用log4j之前先得在pom.xml(maven管理项目的依赖包的配置)里面增加log4j的依赖配置,具体配置如下:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
</dependency>
2、log4j.xml配置
导入log4j后需要在resources目录下添加log4j.xml配置文件,并根据需要进行配置。
首先配置RollingFileAppender,具体配置信息如下:
<!-- Appenders配置滚动日志-->
<appender name="ROLLING"class="org.apache.log4j.RollingFileAppender">
<!--配置日志文件的存放路径和日志的文件名称-->
<paramname="File"value="/opt/tomcat/log/info.log"/>
<!--配置日志文件支持最大为2G -->
<paramname="MaxFileSize"value="2048MB"/>
<!--最大记录日志文件数-->
<paramname="MaxBackupIndex"value="9"/>
<!--设置日志的打印格式 2016-10-27 18:08:24,739 SPECIALL(日志级别) com.itouzi.example.controller.Test(日志打印位置) - SPECIALL1(内容) -->
<layoutclass="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"value="%d %5p %c %x - %m%n"/>
</layout>
<!--设置日志文件的打印级别,即只要在此范围内的打印操作都会将信息打印到此日志文件中-->
<filterclass="org.apache.log4j.varia.LevelRangeFilter">
<!--输出最低级别-->
<paramname="LevelMin"value="INFO"/>
<!--输出的最大级别-->
<paramname="LevelMax"value="INFO"/>
</filter>
</appender>
再将RollingFileAppender引入到AsyncAppender中,配置如下:
<!--配置日志的异步打印-->
<appender name="ASYNC"class="org.apache.log4j.AsyncAppender">
<!--日志缓冲大小-->
<paramname="BufferSize"value="100000"/>
<param name="Blocking"value="false"/>
<appender-ref ref="ROLLING"/>
</appender>
最后将AsyncAppender加入到root logger中,配置如下:
<!-- Root Logger -->
<root>
<level value="info"/>
<appender-ref ref="ASYNC"/>
</root>
这样,log4j需要手动配置的部分已经完成,在项目启动时就会在指定的文件夹下生成指定的日志文件,并将项目中对应级别的日志信息打印到对应的日志文件当中。
3、自定义log4j优先级
在log4j打印日志时,有时候需要打印一些特殊的日志,这时候可以根据自己的需要定义一个自定义优先级来打印对应的日志信息。
(1)新建一个设置优先级的AuditLogFilter类,这个类支持设置日志的优先级范围,具体代码如下:
public classAuditLogFilter extendsFilter {
booleanacceptOnMatch =false;
private StringlevelMin;
private StringlevelMax;
public StringgetLevelMin() {
returnlevelMin;
}
public voidsetLevelMin(String levelMin) {
this.levelMin= levelMin;
}
publicString getLevelMax() {
returnlevelMax;
}
public voidsetLevelMax(String levelMax) {
this.levelMax= levelMax;
}
public booleanisAcceptOnMatch() {
returnacceptOnMatch;
}
public voidsetAcceptOnMatch(booleanacceptOnMatch) {
this.acceptOnMatch= acceptOnMatch;
}
@Override
public intdecide(LoggingEvent lgEvent) {
intinputLevel = lgEvent.getLevel().toInt();
if(inputLevel>=getLevel(levelMin) && inputLevel <= getLevel(levelMax)){
return0;
}
return-1;
}
private intgetLevel(String level){
level = level.toUpperCase();
switch (level){
case"AUDIT" :return LevelType.AUDIT.getType();
case "SPECIAL": returnLevelType.SPECIAL.getType();
case "OFF": returnLevelType.OFF.getType();
case "FATAL": returnLevelType.FATAL.getType();
case "ERROR": returnLevelType.ERROR.getType();
case "INFO": returnLevelType.INFO.getType();
case "WARN": returnLevelType.WARN.getType();
case "DEBUG": returnLevelType.DEBUG.getType();
case "ALL": returnLevelType.ALL.getType();
default:return LevelType.OFF.getType();
}
}
private static enumLevelType{
OFF(2147483647),
FATAL(50000),
ERROR(40000),
WARN(30000),
INFO(20000),
DEBUG(10000),
ALL(-2147483648),
AUDIT(20050),
SPECIAL(30050);
int type;
public int getType() {
returntype;
}
privateLevelType(inttype) {
this.type= type;
}
}
}
(2)自定义一个打印自定义优先级日志的AuditLog类,如下:
public classAuditLog {
/**
* 继承Level
* @authorSevencm
*
*/
private static classAuditLogLevel extendsLevel{
/**
*
*/
private static final longserialVersionUID =2016093009090900L;
public AuditLogLevel(intlevel,String levelStr, intsyslogEquivalent) {
super(level,levelStr,syslogEquivalent);
}
}
/**
* 自定义级别名称,以及级别范围AUDIT
*/
private static finalLevel AuditLevel= newAuditLogLevel(20050,"AUDIT",SyslogAppender.LOG_LOCAL0);
/**
* 自定义级别名称,以及级别范围SPECIALL
*/
private static finalLevel SpecialLevel= newAuditLogLevel(30050,"SPECIAL",SyslogAppender.LOG_LOCAL0);
/**
* 使用日志打印logger中的log方法
*
* @paramlogger
*@param objLogInfo
*/
public static voidauditLog(Logger logger,Object objLogInfo){
logger.log(AuditLevel,objLogInfo);
}
/**
* 使用日志打印logger中的log方法
*
* @paramlogger
*@param objLogInfo
*/
public static voidspecialLog(Logger logger,Object objLogInfo){
logger.log(SpecialLevel,objLogInfo);
}
}
(3)配饰Log4j.xml文件,具体配置信息如下:
<appendername="ROLLINGC"class="org.apache.log4j.RollingFileAppender">
<param name="File"value="/opt/tomcat/auditlog/audit1.log"/>
<param name="MaxFileSize"value="2048MB"/>
<param name="MaxBackupIndex"value="9"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"value="%d %5p %c %x - %m%n"/>
</layout>
<filter class="com.example.log.AuditLogFilter">
<param name="LevelMin"value="AUDIT"/>
<param name="LevelMax"value="AUDIT"/>
</filter>
</appender>
(4)测试代码
private static finalLogger logger= Logger.getLogger(Test.class);//初始化
AuditLog.auditLog(logger,"测试");