logback日志垂直打印

来源:互联网 发布:竞猜源码 编辑:程序博客网 时间:2024/05/17 22:00

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;        }    }}
0 0