# 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

### 问题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链路追踪