1、需要的jar包pom.xml
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
2、创建一个java类LogBackExtDiscriminator.java,用于配置logback
package trade.base;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.sift.AbstractDiscriminator;
public class LogBackExtDiscriminator extends AbstractDiscriminator<ILoggingEvent> {
private static final String KEY = "logFileName";
private String defaultValue;
@Override
public String getDiscriminatingValue(ILoggingEvent event) {
String loggerName = event.getLoggerName();
if(loggerName==null){
return defaultValue;
}
return loggerName;
}
@Override
public String getKey() {
return KEY;
}
public String getDefaultValue() {
return defaultValue;
}
public void setDefaultValue(String defaultValue) {
this.defaultValue = defaultValue;
}
}
3、logback.xml配置文件代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!-- 上下文名称 -->
<contextName>umm-egate</contextName>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 -->
<property name="LOG_HOME" value="logs/umm-egate" />
<!-- 读取配置文件 [log.name=aaa]-->
<property resource="umm-log.properties" />
<appender name="logSiftAppender" class="ch.qos.logback.classic.sift.SiftingAppender">
<!--
<discriminator>
<Key>logFileName</Key>
<DefaultValue>test</DefaultValue>
</discriminator>
-->
<discriminator class="trade.base.LogBackExtDiscriminator">
<defaultValue>test</defaultValue>
</discriminator>
<sift>
<appender name="logRollingAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- [:-]设置默认值 -->
<!-- <File>${LOG_HOME}/${log.name2:-xxx}-testA.log</File> -->
<File>${LOG_HOME}/${logFileName:-logTest}.log</File>
<encoder>
<!--格式化输出,%d:日期;%thread:线程名;%-5level:级别,从左显示5个字符宽度;%msg:日志消息;%n:换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 严格控制日志的级别 -->
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件输出的文件名 - 注意:加上%i-->
<fileNamePattern>${LOG_HOME}/${logFileName}/${logFileName}.log.%i.%d{yyyy-MM-dd}</fileNamePattern>
<!-- 日志文件保留天数(根据yyyy-MM-dd来确定单位是 天/月/年等) -->
<maxHistory>30</maxHistory>
<!--日志文件最大的大小 单位KB\MB\GB-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
</sift>
</appender>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出,%d:日期;%thread:线程名;%-5level:级别,从左显示5个字符宽度;%msg:日志消息;%n:换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!--myibatis log configure -->
<logger name="com.apache.ibatis" level="TRACE" />
<logger name="java.sql.Connection" level="DEBUG" />
<logger name="java.sql.Statement" level="DEBUG" />
<logger name="java.sql.PreparedStatement" level="DEBUG" />
<!--
additivity="false" 只打印在 testA对应的日志文件中,注意:2个test是LoggerFactory.getLogger("testA")的名字
-->
<logger name="test0" additivity="false" level="INFO" >
<appender-ref ref="logSiftAppender"/>
</logger>
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="logSiftAppender" />
<!-- <appender-ref ref="STDOUT" /> -->
<!-- <appender-ref ref="FILE" /> -->
</root>
</configuration>
4、测试一下
package trade.a;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import trade.base.LogConstants;
public class TestA {
private static final Logger logger = LoggerFactory.getLogger(LogConstants.TEST_A);
private static final Logger logger2 = LoggerFactory.getLogger(TestA.class);
public static void main(String[] args) {
//MDC.put(LogConstants.LOG_FILE_NAME, LogConstants.TEST_A);
logger2.info("testA info level test.....");
logger.info("---------------------------------------------------");
logger.error("testA debug level test.....");
try {
for(int j=0;j<14;j++){
for (int i = 0; i < 1000; i++) {
logger.info("testA info level stg....." + i);
}
logger.info("count:" + j);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
5、一个logUtil类
package trade.base;
import org.slf4j.ILoggerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogUtil {
//private static final String LOG_FILE_NAME = "logFileName";
public static final int ERROR = 0;
public static final int INFO = 1;
public static final int DEBUG = 2;
public static final int WARN = 3;
public static final int TRACE = 4;
public static void trace(String name,String msg){
LogUtil.log(LogUtil.TRACE, name, msg);
}
public static void trace(String name,String msg,Throwable t){
LogUtil.log(LogUtil.TRACE, name, msg,t);
}
public static void w(String name,String msg){
LogUtil.log(LogUtil.WARN, name, msg);
}
public static void w(String name,String msg,Throwable t){
LogUtil.log(LogUtil.WARN, name, msg,t);
}
public static void d(String name,String msg){
LogUtil.log(LogUtil.DEBUG, name, msg);
}
public static void d(String name,String msg,Throwable t){
LogUtil.log(LogUtil.DEBUG, name, msg,t);
}
public static void i(String name,String msg){
LogUtil.log(LogUtil.INFO, name, msg);
}
public static void i(String name,String msg,Throwable t){
LogUtil.log(LogUtil.INFO, name, msg,t);
}
public static void e(String name,String msg){
LogUtil.log(LogUtil.ERROR, name, msg);
}
public static void e(String name,String msg,Throwable t){
LogUtil.log(LogUtil.ERROR, name, msg,t);
}
public static void log(int level, String name,String msg) {
LogUtil.log(level, name, msg,null);
}
public static void log(int level, String name,String msg,Throwable t) {
ILoggerFactory factory = LoggerFactory.getILoggerFactory();
Logger logger = factory.getLogger(name);
//MDC.put(LogUtil.LOG_FILE_NAME, name);
switch (level) {
case 0:
logger.error(msg, t);
break;
case 1:
logger.info(msg, t);
break;
case 2:
logger.debug(msg, t);
break;
case 3:
logger.warn(msg,t);
break;
case 4:
logger.trace(msg, t);
break;
default:
logger.trace(msg, t);
break;
}
}
}