1 常见日志分类
日志一般根据使用场景分为系统日志和操作日志。 系统日志:排查定位问题 操作日志:记录用户操作,业务数据回溯与统计。
2 系统日志格式
系统日志主要是为开发排查问题提供依据,日志一般打印在日志文件中,可读性要求没那么高。 SpringBoot 默认选择的是 slf4j + logback 的组合,默认会将日志打印到控制台上。
日期时间:精确到毫秒。 日志级别:打印 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 等级别日志信息。 进程 ID:当前项目进程 ID 。 分隔符:— 是分隔符,分隔符后面代表具体的日志内容。 线程名:方括号中间的内容表示线程名称。 类名:当前日志打印所属的类名称。 日志内容:开发人员设定的日志具体内容。
实际工程中规范的日志信息:
- 单机项目建议打印:时间(精度根据需要制定)、日志级别、线程、类名、异常堆栈、日志内容(包括方法名、关键请求参数与返回参数);
- 分布式项目建议额外包含:用户标识、机器ip/主机名、traceId;
在.yml文件里的配置
logging:
level:
root: debug
pattern:
console: "%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) - %clr([%t]){faint} %X{userId} %X{traceId}%clr(:) {faint} %m%n%wEx"
logging:
level:
root: info
pattern:
console: "%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) -- %clr([%t]){faint} %X{hostIp} %X{userId} %X{traceId}%clr(:) %m%n%wEx"
实际工程项目中,常需要更改为其他日志系统(如 log4j2 ),则可以在配置文件里进行一些符合个人习惯的设置。 如果启动项目时觉得日志打印太多,还可以调整项目日志的记录级别为 WARN ,打印 WARN 及优先级更高的 ERROR 级别的日志。
@SpringBootTest
class LogTest {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Test
void testPrintLog() {
logger.trace("I am trace log..");
logger.debug("I am debug log..");
logger.info("I am info log..");
logger.warn("I am warn log..");
logger.error("I am error log..");
}
}
(2)日志级别等自定义设置 Springboot默认的打印级别是info,而trace、debug不打印,调试时若想打印debug日志,可以在配置文件中进行自定义设置,如下:
@GetMapping("start")
public void normalLog(){
List<String> requestList = new ArrayList<>();
requestList.add("入参列表1");
requestList.add("入参列表2");
Gson gson = new Gson();
String userNo = "userId007";
MDC.put("userId", userNo);
logger.info("【normalLog】menuFolderList:{}", gson.toJson(requestList));
}
如果启动项目时觉得日志打印太多,还可以调整项目日志的记录级别为 WARN ,打印 WARN 及优先级更高的 ERROR 级别的日志。
@WebFilter(filterName = "traceIdFilter", urlPatterns = "/*")
@Component
public class TraceFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
MDC.put("traceId", UUID.randomUUID().toString());
filterChain.doFilter(httpServletRequest,httpServletResponse);
String podIp = new InetUtils(new InetUtilsProperties()).findFirstNonLoopbackHostInfo().getIpAddress();
MDC.put("hostIp", podIp);
filterChain.doFilter(httpServletRequest, httpServletResponse);
}
}
(3)定制操作日志配置 通过配置 Log 的配置文件,把有关操作日志的 Log 单独放到一日志文件中。不同业务日志记录到不同的文件 在logging-logback的defaults.xml文件里,对日志进行了一些基本定义,比如CONSOLE_LOG_PATTERN和LOG_FILE【边讲解边演示】 我们一起来看看控制台、日志文件的日志显示格式的自定义方式和效果【解释日期、线程号、靠左输出日志级别、全类名字符数量、日志消息换行符】 第一步: 文件配置 logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger{50}- %msg%n 在logback的日志追加器XX-appender里,我们可以自己扩展更多的定义
1、yml配置日志文件
logging: config: classpath:log4j2/log4j2-local.xml
2、xml进行日志具体配置
<configuration status="debug">
<appenders>
<XMDFile name="requestLog" fileName="request.log" rolloverMax="5"></XMDFile>
<XMDFile name="errorLog" fileName="error.log">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</XMDFile>
<Scribe name="ScribeAppender">
<LcLayout/>
</Scribe>
<Async name="ScribeAsyncAppender" blocking="false">
<AppenderRef ref="ScribeAppender"/>
</Async>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{DEFAULT} [%t] %-5p (%C{1}:%L) - %m%n"/>
</Console>
</appenders>
<loggers>
<logger name="com.meituan" level="info"/>
<logger name="org.springframework" level="info"/>
<root level="info">
<appender-ref ref="requestLog"/>
<appender-ref ref="warnLog"/>
<appender-ref ref="errorLog"/>
<appender-ref ref="ScribeAsyncAppender"/>
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>
|