zoukankan      html  css  js  c++  java
  • 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;
            }
        }
    }
    
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 字符串逆序
    Java实现 蓝桥杯VIP 算法训练 字符串逆序
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 成绩的等级输出
    Java实现 蓝桥杯VIP 算法训练 成绩的等级输出
    Qt 自定义model实现文件系统的文件名排序
  • 原文地址:https://www.cnblogs.com/kikyoqiang/p/15255608.html
Copyright © 2011-2022 走看看