logback日志垂直打印

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值