All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.nuls.core.log.logback.LogAppender Maven / Gradle / Ivy

package io.nuls.core.log.logback;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.filter.ThresholdFilter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.Appender;
import ch.qos.logback.core.ConsoleAppender;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy;
import ch.qos.logback.core.util.FileSize;
import ch.qos.logback.core.util.OptionHelper;
import io.nuls.core.model.StringUtils;
import org.slf4j.LoggerFactory;

import java.io.File;

/**
 * 日志打印管理类,日志文件创建,日志文件大小,保存时间,日志输出格式等设置管理
 * Log Printing Management Class, Log File Creation, Log File Size, Save Time, Log Output Format and other settings management
 *
 * @author tag
 * 2018/12/17
 * */
public class LogAppender {

    public static String PROJECT_PATH = StringUtils.isNotBlank(System.getProperty("log.path")) ? System.getProperty("log.path") : (System.getProperty("user.dir") + File.separator + "logs");

    /**
     * 通过传入的名字和级别,动态设置appender
     *
     * @param fileName
     * @return
     */
    @SuppressWarnings("unchecked")
    public static RollingFileAppender getAppender(String fileName, Level level){
        String rootPath = PROJECT_PATH;
        if(!rootPath.endsWith(File.separator)){
            rootPath += File.separator;
        }
        if(fileName.startsWith(File.separator)){
            fileName = fileName.substring(1);
        }
        LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
        RollingFileAppender appender = new RollingFileAppender();
        /*设置上下文,每个logger都关联到logger上下文,默认上下文名称为default。
        但可以使用设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。*/
        appender.setContext(context);

        //这里设置级别过滤器
        LogFilter levelController = new LogFilter();
        ThresholdFilter levelFilter = levelController.getThresholdFilter(level);
        levelFilter.start();
        appender.addFilter(levelFilter);

        //设置文件名
        appender.setFile(OptionHelper.substVars(rootPath+fileName + ".log",context));
        appender.setAppend(true);
        appender.setPrudent(false);
        //设置文件创建时间及大小的类
        SizeAndTimeBasedRollingPolicy policy = new SizeAndTimeBasedRollingPolicy();
        //文件名格式
        String fp = OptionHelper.substVars(rootPath+ fileName + ".%d{yyyy-MM-dd}.%i.zip",context);
        //最大日志文件大小
        policy.setMaxFileSize(FileSize.valueOf("100MB"));
        //设置文件名模式
        policy.setFileNamePattern(fp);
        //设置保存最近3天的日志
        policy.setMaxHistory(3);
        //总大小限制
        policy.setContext(context);
        policy.setTotalSizeCap(FileSize.valueOf("1GB"));
        //设置父节点是appender
        policy.setParent(appender);
        //设置上下文,每个logger都关联到logger上下文,默认上下文名称为default。
        //但可以使用设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
        policy.start();
        PatternLayoutEncoder encoder = new PatternLayoutEncoder();
        //设置上下文,每个logger都关联到logger上下文,默认上下文名称为default。
        //但可以使用设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
        encoder.setContext(context);
        //设置格式
        /*encoder.setPattern("%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] %replace(%caller{1}){'\\t|Caller.{1}0|\\r\\n', ''} - %msg%n");*/
        encoder.setPattern("%d{yyyy-MM-dd HH:mm:ss.SSS}  [%thread] %-5level - %msg%n");
        encoder.start();
        //加入下面两个节点
        appender.setRollingPolicy(policy);
        appender.setEncoder(encoder);
        appender.start();
        return appender;
    }

    @SuppressWarnings("unchecked")
    public static Appender createConsoleAppender(Level level){
        ConsoleAppender appender = new ConsoleAppender();
        LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
        appender.setContext(context);
        //这里设置级别过滤器
        LogFilter levelController = new LogFilter();
        ThresholdFilter levelFilter = levelController.getThresholdFilter(level);
        levelFilter.start();
        appender.addFilter(levelFilter);

        PatternLayoutEncoder encoder = new PatternLayoutEncoder();
        //设置上下文,每个logger都关联到logger上下文,默认上下文名称为default。
        //但可以使用设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
        encoder.setContext(context);
        //设置格式
        encoder.setPattern("%d{yyyy-MM-dd HH:mm:ss.SSS}  [%thread] %-5level - %msg%n");
        encoder.start();
        //加入下面两个节点
        appender.setEncoder(encoder);
        appender.start();
        return appender;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy