需求为:需要用ELK进行日志分析,日志为json格式方便存储及查询
则实现:将日志打印时统一转换为json格式
实现步骤:
一:选择一个公共模块中的pom.xml 引入jar
<!-- 日志文件管理包 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
二:在该模块下创建类继承LayoutBase 并编写自定义日志格式化代码
public class PattenLayOutDeal extends LayoutBase<ILoggingEvent> {
@Override
public String doLayout(ILoggingEvent event) {
StringBuilder sb = new StringBuilder();
sb.append("{");
sb.append("\"date\":");
sb.append("\"").append(new Timestamp(event.getTimeStamp())).append("\"");
sb.append(", \"level\":");
sb.append("\"").append(event.getLevel()).append("\"");
sb.append(", \"thread\":");
sb.append("\"").append(event.getThreadName()).append("\"");
sb.append(", \"className\": ");
sb.append("\"").append(event.getLoggerName()).append("\"");
sb.append(",\"message\": ");
String message = event.getFormattedMessage();
String reqService = "";
String reqMethod = "";
if (event.getThrowableProxy() != null) {
ExtendedThrowableProxyConverter throwableConverter = new ExtendedThrowableProxyConverter();
throwableConverter.start();
message = event.getFormattedMessage() + "" + throwableConverter.convert(event);
throwableConverter.stop();
}
if (message!=null) {
message = message.replaceAll("\\\\", "");
message = message.replaceAll("\"","'");
}
sb.append("\"").append(message).append("\"");
if(reqService != null && reqMethod != null) {
sb.append(reqService);
sb.append(reqMethod);
}
sb.append("}");
sb.append(CoreConstants.LINE_SEPARATOR);
return sb.toString();
}
三:修改logback-spring.xml内容(这里贴个简单的)
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<timestamp key="bySecond" datePattern="yyyy-MM-dd"/>
<!-- 日志 输出地址-->
<property name="COMMON_LOG_HOME" value="/wdata/logs/${logging.app.name}"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class = "ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<!-- 指定你创建的类的类路径 -->
<layout class="com.dh.op.model.PattenLayOutDeal" />
<immediateFlush>true</immediateFlush>
</encoder>
</appender>
<appender name="common.rolling" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${COMMON_LOG_HOME}/${logging.app.name}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${COMMON_LOG_HOME}/${logging.app.name}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>30</maxHistory>
<TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<MaxFileSize>100MB</MaxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<!-- 指定你创建的类的类路径 -->
<layout class="com.dh.op.model.PattenLayOutDeal" />
<immediateFlush>true</immediateFlush>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="common.rolling"/>
</root>
</configuration>
完结,启动看日志则为json格式了。