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">
<!-- 配置日志文件的存放路径和日志的文件名称 -->
<param name="File" value="/opt/tomcat/log/info.log"/>
<!-- 配置日志文件支持最大为2G -->
<param name="MaxFileSize" value="2048MB"/>
<!-- 最大记录日志文件数 -->
<param name="MaxBackupIndex" value="9"/>
<!-- 设置日志的打印格式 2016-10-27 18:08:24,739 SPECIALL(日志级别) com.itouzi.example.controller.Test(日志打印位置) - SPECIALL1(内容) -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %5p %c %x - %m%n"/>
</layout>
<!-- 设置日志文件的打印级别,即只要在此范围内的打印操作都会将信息打印到此日志文件中 -->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<!-- 输出最低级别 -->
<param name="LevelMin" value="INFO"/>
<!-- 输出的最大级别 -->
<param name="LevelMax" value="INFO"/>
</filter>
</appender>
再将RollingFileAppender引入到AsyncAppender中,配置如下:
<!-- 配置日志的异步打印 -->
<appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
<!-- 日志缓冲大小 -->
<param name="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 class AuditLogFilter extends Filter {
boolean acceptOnMatch = false;
private String levelMin;
private String levelMax;
public String getLevelMin() {
return levelMin;
}
public void setLevelMin(String levelMin) {
this.levelMin = levelMin;
}
public String getLevelMax() {
return levelMax;
}
public void setLevelMax(String levelMax) {
this.levelMax = levelMax;
}
public boolean isAcceptOnMatch() {
return acceptOnMatch;
}
public void setAcceptOnMatch(boolean acceptOnMatch) {
this.acceptOnMatch = acceptOnMatch;
}
@Override
public int decide(LoggingEvent lgEvent) {
int inputLevel = lgEvent.getLevel().toInt();
if(inputLevel>=getLevel(levelMin) && inputLevel <= getLevel(levelMax)){
return 0;
}
return -1;
}
private int getLevel(String level){
level = level.toUpperCase();
switch (level){
case "AUDIT" : return LevelType.AUDIT.getType();
case "SPECIAL" : return LevelType.SPECIAL.getType();
case "OFF" : return LevelType.OFF.getType();
case "FATAL" : return LevelType.FATAL.getType();
case "ERROR" : return LevelType.ERROR.getType();
case "INFO" : return LevelType.INFO.getType();
case "WARN" : return LevelType.WARN.getType();
case "DEBUG" : return LevelType.DEBUG.getType();
case "ALL" : return LevelType.ALL.getType();
default: return LevelType.OFF.getType();
}
}
private static enum LevelType{
OFF(2147483647),
FATAL(50000),
ERROR(40000),
WARN(30000),
INFO(20000),
DEBUG(10000),
ALL(-2147483648),
AUDIT(20050),
SPECIAL(30050);
int type;
public int getType() {
return type;
}
private LevelType(int type) {
this.type = type;
}
}
}
(2)自定义一个打印自定义优先级日志的AuditLog类,如下:
public class AuditLog {
/**
* 继承Level
* @author Sevencm
*
*/
private static class AuditLogLevel extends Level{
/**
*
*/
private static final long serialVersionUID = 2016093009090900L;
public AuditLogLevel(int level, String levelStr, int syslogEquivalent) {
super(level, levelStr, syslogEquivalent);
}
}
/**
* 自定义级别名称,以及级别范围 AUDIT
*/
private static final Level AuditLevel = new AuditLogLevel(20050,"AUDIT",SyslogAppender.LOG_LOCAL0);
/**
* 自定义级别名称,以及级别范围 SPECIALL
*/
private static final Level SpecialLevel = new AuditLogLevel(30050,"SPECIAL",SyslogAppender.LOG_LOCAL0);
/**
* 使用日志打印logger中的log方法
*
* @param logger
* @param objLogInfo
*/
public static void auditLog(Logger logger,Object objLogInfo){
logger.log(AuditLevel, objLogInfo);
}
/**
* 使用日志打印logger中的log方法
*
* @param logger
* @param objLogInfo
*/
public static void specialLog(Logger logger,Object objLogInfo){
logger.log(SpecialLevel, objLogInfo);
}
}
(3)配饰Log4j.xml文件,具体配置信息如下:
<appender name="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 final Logger logger = Logger.getLogger(Test.class);//初始化
AuditLog.auditLog(logger, "测试");