# logback-learning **Repository Path**: bannerXu/logback-learning ## Basic Information - **Project Name**: logback-learning - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-01-16 - **Last Updated**: 2022-03-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ![功能要求](https://image.xuguoliang.top/2022/03/01/fPxj8W-YahcTd.png) ### 问题1 ```xml ``` ### 问题2 ```xml ``` ### 问题3,问题4,问题5 ```xml logs/%d{yyyy-MM-dd_HH-mm}.%i.log 4KB 90 10GB %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n utf8 ``` ### 问题6 ```xml    true %d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg %n ${LOG_HOME}/%d{yyyy-MM-dd_HH-mm}.%i.log ${LOG_MAX_FILE_SIZE} ${LOG_MAX_HISTORY} ${LOG_TOTAL_SIZE_CAP} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n utf8 ERROR ${LOG_HOME}/error.%d{yyyy-MM-dd_HH-mm}.%i.log ${LOG_MAX_FILE_SIZE} ${LOG_MAX_HISTORY} ${LOG_TOTAL_SIZE_CAP} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n utf8 ``` ### 问题7 数据脱敏 ```xml true \"phone\"\s*:\s*\"(.*?)\" \"address\"\s*:\s*\"(.*?)\" %-5p [%d{ISO8601,UTC}] [%thread] %c: %m%n%rootException ``` ```java @Component public class MaskingPatternLayout extends PatternLayout { private Pattern multilinePattern; private final List maskPatterns = new ArrayList<>(); public void addMaskPattern(String maskPattern) { maskPatterns.add(maskPattern); multilinePattern = Pattern.compile(String.join("|", maskPatterns), Pattern.MULTILINE); } @Override public String doLayout(ILoggingEvent event) { return maskMessage(super.doLayout(event)); } private String maskMessage(String message) { if (multilinePattern == null) { return message; } StringBuilder sb = new StringBuilder(message); Matcher matcher = multilinePattern.matcher(sb); while (matcher.find()) { IntStream.rangeClosed(1, matcher.groupCount()).forEach(group -> { if (matcher.group(group) != null) { IntStream.range(matcher.start(group), matcher.end(group)).forEach(i -> sb.setCharAt(i, '*')); } }); } return sb.toString(); } } ``` ### 问题8 自定义logger ```java /** *

动态构造 Logger 对象

* */ public class LogbackHolder { /** *

根据名称获取 logger 实例

* */ public static Logger getLogger(String name) { LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); // 如果没有创建 logger if (loggerContext.exists(name) == null) { // 自己动态构造 logger 对象 return buildLogger(name); } return loggerContext.getLogger(name); } /** *

动态构造 logger 实例

* */ @SuppressWarnings({"unchecked", "rawtypes"}) private static Logger buildLogger(String name) { LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); Logger logger = loggerContext.getLogger(name); // 配置 rollingFileAppender RollingFileAppender rollingFileAppender = new RollingFileAppender(); rollingFileAppender.setName(name); rollingFileAppender.setContext(loggerContext); // 配置 rollingPolicy TimeBasedRollingPolicy rollingPolicy = new TimeBasedRollingPolicy(); rollingPolicy.setFileNamePattern("/tmp/log/" + name + ".%d{yyyyMM}.log"); rollingPolicy.setParent(rollingFileAppender); rollingPolicy.setContext(loggerContext); rollingPolicy.start(); // 配置 encoder PatternLayoutEncoder encoder = new PatternLayoutEncoder(); encoder.setCharset(StandardCharsets.UTF_8); encoder.setPattern("%msg%n"); encoder.setContext(loggerContext); encoder.start(); rollingFileAppender.setRollingPolicy(rollingPolicy); rollingFileAppender.setEncoder(encoder); rollingFileAppender.start(); // 配置 logger logger.addAppender(rollingFileAppender); logger.setAdditive(false); logger.setLevel(Level.INFO); return logger; } public static void main(String[] args) { getLogger("gx").info("gx use logback..."); } } ``` ### MDC链路追踪