IDEA中配置使用SpringBoot+Log4j2+Fastjson
文章分两部分,分别是配置自定义的log4j2日志系统以及配置使用fastjson的使用。
在进行相关配置使用之前,需要先创建一个SpringBoot项目,创建过程可以看另一条博文:
https://blog.csdn.net/weixin_42009068/article/details/104443191
配置自定义日志文件log4j2
我们常用的日志框架有:
- java.util.logging:是JDK在1.4版本中引入的Java原生日志框架。
- Log4j:Apache的一个开源项目,可以控制日志信息输送的目的地是控制台、文件、GUI组件等,可以控制每一条日志的 输出格式,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。虽然已经停止维护了,但目前绝大部分企业都是用的log4j。
- LogBack:是Log4j的一个改良版本。
以及我们现在就要使用的log4j2,而之所以选择它,也是因为相比较于其他的日志系统丢失数据的情况少,在多线程环境下,性能高于logback;利用jdk5的并发特性,减少了死锁的发生。
在这里先列举一下参考其他博客的性能测评:
可以看出在同步日志模式下,Logback的性能是最糟糕的,log4j2的性能无论是在同步日志模式还是异步模式下都是最佳的。
而log4j2的优越性在于其使用了LMAX,一个无锁的线程间通信库代替了logback和log4j之前的队列,并发性能从而大大提升。
整合步骤
1、导入maven依赖包,在这里我的SpringBoot版本是2.2.4.RELEASE,因此需要导入的版本是2.2.2.RELEASE。
springboot默认是用logback的日志框架的,所以需要排除logback,不然会出现jar依赖冲突的报错。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!-- 去掉springboot默认配置,使用依赖log4j2-->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
2、导入依赖后,在项目的resource文件下新建一个命名为log4j2-spring.xml的文件,并在其中配置所需要的信息。
这里是我的一些自己的配置。
<?xml version="1.0" encoding="UTF-8"?>
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration monitorInterval="5"><!--输出重要的信息,使用较多-->
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--变量配置-->
<Properties>
<!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
<!-- %logger{36} 表示 Logger 名字最长36个字符 -->
<property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
<!-- 定义日志存储的路径,不要配置相对路径 -->
<property name="FILE_PATH" value="日志所在路径"/>
<!--项目名称-->
<property name="FILE_NAME" value="这里填你的项目名称"/>
</Properties>
<appenders>
<console name="Console" target="SYSTEM_OUT">
<!--输出日志的格式-->
<PatternLayout pattern="${LOG_PATTERN} %highlight{%-5level} [%t] %highlight{%c{1.}.%M(%L)}: %msg%n"/>
<!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</console>
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用-->
<File name="Filelog" fileName="${FILE_PATH}/test.log" append="false">
<PatternLayout pattern="${LOG_PATTERN}"/>
</File>
<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log"
filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}" />
<Policies>
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
<!-- 这个会打印出所有的error及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log"
filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
</appenders>
<!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。-->
<!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
<logger name="org.mybatis" level="info" additivity="false">
<AppenderRef ref="Console"/>
</logger>
<!--监控系统信息-->
<!--若是additivity设为false,则 子Logger 只会在自己的appender里输出,而不会在 父Logger 的appender里输出。-->
<logger name="org.springframework" level="info" additivity="false">
<AppenderRef ref="Console"/>
</logger>
<root level="info">
<appender-ref ref="Console"/>
<appender-ref ref="Filelog"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
</root>
</loggers>
</configuration>
这里是一些关键一点的信息:
<property name="FILE_PATH" value="这里是日志所在路径"/>
<property name="FILE_NAME" value="这里是项目名称"/>
日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL
写一个测试的类用于输出INFO信息,加上@Slf4j以及用log.info("输出info级别的日志"); 运行项目后可以看到控制台打印了该信息。
而且在项目目录中可以看到先前设置的日志输出目录中出现了日志文件;
至此,一个自定义的log4j2日志框架就搭建好了。
小提醒:这里我发现控制台输出的日志信息文字颜色是白色的,这样不利用观看,因此可以利用配置文件中,使日志提醒高光强提醒(也就是加个颜色上去)。这里只需要在log4j2-spring.xml文件中的<PatternLayout/>标签的pattern属性中加上
“%highlight{%-5level} [%t] %highlight{%c{1.}.%M(%L)}: %msg%n” 以及在VM option中添加“-Dlog4j.skipJansi=false”值即可。
项目配置FastJson处理器
我们常用的JSON处理器除了jask-databind之外,还有Google的Gson以及FastJson。在SpringBoot中默认提供了Gson的自动转换类GsonHttpMessageConvertersConfiguration类,因此,在使用Gson的时候只需要导入maven依赖就可以像使用jask-databind那样直接使用。
而我们之所以使用FastJson,是因为其是目前JSON解析速度最快的开源框架,(当然具体用哪个还是看具体需要吧)。FastJson的框架也可以集成到SpringBoot,但不同于Gson的是,fastjson完成继承后不能够直接使用,需要开发者提供相应的HttpMessageConverter后才能使用,以下是集成配置fastjson的步骤。
1、首先导入fastjson的maven依赖。
引入使用fastJson,需要先除去springboot默认使用的jackson-databind依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!--除去jackson-databind依赖-->
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
2、导入依赖后,创建一个配置类,用于配置使用fastjson。
配置完需要在spring配置文件中设置一下响应编码,否则返回json中文会乱码
#配置使用编码
server.tomcat.uri-encoding=utf-8
#配置MyFastJsonConfig响应编码
spring.http.encoding.force-response=true
@Configuration
public class MyFastJsonConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
System.out.println("---初始化配置fastjson---");
FastJsonHttpMessageConverter converter=new FastJsonHttpMessageConverter();
List<MediaType> supportedMediaTypes = new ArrayList<>();
supportedMediaTypes.add(MediaType.APPLICATION_JSON);
// supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
supportedMediaTypes.add(MediaType.APPLICATION_PDF);
supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);
supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
supportedMediaTypes.add(MediaType.APPLICATION_XML);
supportedMediaTypes.add(MediaType.IMAGE_GIF);
supportedMediaTypes.add(MediaType.IMAGE_JPEG);
supportedMediaTypes.add(MediaType.IMAGE_PNG);
supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM);
supportedMediaTypes.add(MediaType.TEXT_HTML);
supportedMediaTypes.add(MediaType.TEXT_MARKDOWN);
supportedMediaTypes.add(MediaType.TEXT_PLAIN);
supportedMediaTypes.add(MediaType.TEXT_XML);
converter.setSupportedMediaTypes(supportedMediaTypes);
//创建配置类
FastJsonConfig config=new FastJsonConfig();
//JSON的解析过程,设置日期格式
config.setDateFormat("yyyy-MM-dd");
//数据编码
config.setCharset(Charset.forName("UTF-8"));
config.setSerializerFeatures(
//是否在生成json时输出类名
// SerializerFeature.WriteClassName,
//是否输出value为null的数据
SerializerFeature.WriteMapNullValue,
//生成的json格式化
SerializerFeature.PrettyFormat,
//空集合输出[]而不是null
SerializerFeature.WriteNullListAsEmpty,
//空字符串输出"",而不是null
SerializerFeature.WriteNullStringAsEmpty
);
converter.setFastJsonConfig(config);
converters.add(converter);
}
}
3、配置完成后,如果有使用了SerializerFeature.WriteClassName属性在解析输出后打印类型,那么在返回的数据中会返回类名。
到这里配置就完成了,项目demo实现后期会在前一个搭建的框架上实现,现在就不做展示了。
在这里我就不做一些demo了,就靠你们自己去弄了。
总结:自定义的日志框架以及fastjson的配置到这里就结束了,希望有更好点子的人能够多进行分享,让博主也学习一下啊。