• LogbackUtil 自定义logback日志框架


    1、前言

    logback原有的日志功能不满足项目的需求,需将日志按功能模块输出

    2、说明

    1、使用需配置父目录 parentDir,也就是主目录,

    2、配置日志路径,功能模块名为子文件夹,模块名+日期+日志级别为文件名称

    3、使用.txt后缀,方便文本编辑器打开,具体细节,酌情配置。

    /*日志路径*/
    String fp = OptionHelper.substVars(parentDir + "/" + name + "/" + name + " %d{yyyy_MM_dd} .%i. " + level.levelStr.toLowerCase() + ".txt", context);
    

    3、代码

    import ch.qos.logback.classic.*;
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
    import ch.qos.logback.classic.filter.LevelFilter;
    import ch.qos.logback.core.rolling.*;
    import ch.qos.logback.core.spi.FilterReply;
    import ch.qos.logback.core.util.*;
    
    import java.util.*;
    
    public class LogbackUtil {
        public static String parentDir = "E:/TCC_CADS_Logs";
    
        public static Logger getLogger(String moduleName, String className) {
            Logger logger = LoggerBuilder.getLogger(moduleName, className);
            return logger;
        }
    
        private static class LoggerBuilder {
            private static final Map<String, Logger> maps = new HashMap<>();
    
            public static Logger getLogger(String moduleName, String className) {
                if (maps.containsKey(moduleName)) {
                    return maps.get(moduleName);
                }
                synchronized (LoggerBuilder.class) {
                    Logger build = build(moduleName, className);
                    maps.put(moduleName, build);
                    return build;
                }
            }
    
            private static Logger build(String moduleName, String className) {
                RollingFileAppender errorAppender = Appender.getAppender(moduleName, className, Level.ERROR);
                RollingFileAppender infoAppender = Appender.getAppender(moduleName, className, Level.INFO);
                RollingFileAppender warnAppender = Appender.getAppender(moduleName, className, Level.WARN);
                RollingFileAppender debugAppender = Appender.getAppender(moduleName, className, Level.DEBUG);
                LoggerContext context = (LoggerContext) org.slf4j.LoggerFactory.getILoggerFactory();
                Logger logger = context.getLogger("FILE-" + moduleName);
    
                //设置不向上级打印信息
                logger.setAdditive(false);
                logger.addAppender(errorAppender);
                logger.addAppender(infoAppender);
                logger.addAppender(warnAppender);
                logger.addAppender(debugAppender);
    
                return logger;
            }
        }
    
        private static class Appender {
            public static RollingFileAppender getAppender(String moduleName, String className, Level level) {
                // DateFormat format = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.SIMPLIFIED_CHINESE);
                LoggerContext context = (LoggerContext) org.slf4j.LoggerFactory.getILoggerFactory();
                //这里是可以用来设置appender的,在xml配置文件里面,是这种形式:
                // <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
                RollingFileAppender appender = new RollingFileAppender();
                //ConsoleAppender consoleAppender = new ConsoleAppender();
    
                //这里设置级别过滤器
                LevelFilter levelFilter = getLevelFilter(level);
                levelFilter.start();
                appender.addFilter(levelFilter);
    
                //设置上下文,每个logger都关联到logger上下文,默认上下文名称为default。
                // 但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
                appender.setContext(context);
                //appender的name属性
                appender.setName("FILE-" + moduleName);
                //设置文件名
                appender.setAppend(true);
    
                appender.setPrudent(false);
    
                //设置文件创建时间及大小的类
                TimeBasedRollingPolicy policy = new TimeBasedRollingPolicy();
    
                /*日志路径*/
                String fp = OptionHelper.substVars(parentDir + "/" + moduleName + "/" + className + " %d{yyyy_MM_dd} .%i. " + level.levelStr.toLowerCase() + ".txt", context);
                policy.setFileNamePattern(fp);
    
                /*设置滚动*/
                SizeAndTimeBasedFNATP triggeringPolicy = new SizeAndTimeBasedFNATP();
                triggeringPolicy.setMaxFileSize(FileSize.valueOf("1MB"));
    
                policy.setTimeBasedFileNamingAndTriggeringPolicy(triggeringPolicy);
    
                /*最大保存日期*/
                policy.setMaxHistory(60);
    
                //设置父节点是appender
                policy.setParent(appender);
                //设置上下文,每个logger都关联到logger上下文,默认上下文名称为default。
                // 但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
                policy.setContext(context);
                policy.start();
    
                PatternLayoutEncoder encoder = new PatternLayoutEncoder();
                //设置上下文,每个logger都关联到logger上下文,默认上下文名称为default。
                // 但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
                encoder.setContext(context);
                //设置格式
                encoder.setPattern("%d %p %thread (%file:%line\)- %m%n");
                encoder.start();
    
                //加入下面两个节点
                appender.setRollingPolicy(policy);
                appender.setEncoder(encoder);
                appender.start();
                return appender;
            }
    
            private static LevelFilter getLevelFilter(Level level) {
                LevelFilter levelFilter = new LevelFilter();
                levelFilter.setLevel(level);
                levelFilter.setOnMatch(FilterReply.ACCEPT);
                levelFilter.setOnMismatch(FilterReply.DENY);
                return levelFilter;
            }
        }
    }
    
  • 相关阅读:
    向对象数组中添加新的属性 Jim
    vuecli3.0 postcsspxtoviewport将px转化为vwvh适配/Web 端屏幕适配方案 Jim
    js深拷贝与浅拷贝 Jim
    行业死亡案例汇总(客观记录不做评价)
    wins和linux 系统不同编码格式导致的.py执行问题: bad interpreter: No such or file directory
    Pyhon之类学习1
    How to handle error In $.get()
    sql 修改列名及表名
    程序设计类网站
    数据类型
  • 原文地址:https://www.cnblogs.com/kikyoqiang/p/15255608.html
Copyright © 2020-2023  润新知