日志模块作为一个系统的重要组成部分,似乎其重要性并没有在开发人员的心中引起足够的重视,其实如果抛开其业务模块相关的内容,单纯的就系统架构设计的方面来看,系统的日志模块还是十分重要的,一个好的日志模块的设计不仅能够帮助我们检测程序的执行的状态、系统的的负载情况、更能实时监控系统的运行情况。从这一点而言,如果一个系统设计的时候没有将日志模块摆在重要的位置上,那么这个系统肯定不能称之为一个健壮的系统。
日志的技术选型
目前常用的日志框架大概有下面的几种:log4j、JUI(Java Util Logging)、JCL(Jakarta C ommons logging)、slf4j(sample l ogging facade for java)、log4j2(log for j ava2).
log4j (log for java):最早的日志组件是Apache基金会提供的 log4j,但是不是Apache写的,捐献给apache后,apache开源了:很长的一段时间成为类 java 社区的日志标准;
JUL ( Java Util Logging ) :Apache公司建议sun将log4j收到java的标准库,但是sun拒绝了,可能为了日志市场,sun自己在jdk1.4提供的日志框架: JUL;
JCL (Jakarta C ommons logging) :对于log4j和JUL两个日志框架的出现,Apache觉得开发有点混乱,没有统一的标准也没有关联,有兼容问题,于是乎开发了个 Java Commons logging: 接口抽象层进行适配,完成了日志的兼容,并且也提供了默认的日志实现为 S im ple-Log:但可以兼容整合log4j和JUL;
slf4j ( sample l ogging facade for java ) : Log4j的原作者觉得apache 的Commons logging不够优秀,又使开发出了: slf4j (日志门面接口) + logback (日志的实现,是log4j的升级版),如果想自定义实现日志,只需要添加一个logback.xml文件就可以了。
lg4j2 (log for j ava2): sun公司升级log4j- >log4j2 :由于slf4j和logback出来后,Apache感觉快超越了log4j的体系,所以就升级了log4j为log4j2;
从目前的实际现状来看,大部分的系统都推荐日志门面+日志实现的方式实现日志模块
集成日志
springboot 默认的日志级别是info、默认的技术选型为slf4j+logback, 日志按照级别的高低可分为trace < debug<info<warn<error,因此info级别的日志肯定是够实用了。下面从实战的角度来展开讲解。
1、maven配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
2、application.properties配置
# 日志配置文件的位置
logging.config=/home/mi/learning_java/coding/springboot-common_response/src/main/resources/logback.xml
# 日志的级别
logging.level.root=info
# 日志文件的存放位置
logging.file.path=/home/mi/log
3、logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="/home/mi/log"/>
<!-- 定义日志格式 -->
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] [%-30.30logger{30}] %msg%n"/>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/springboot_common_response_%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>1MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 日志输出级别 -->
<logger name="org.springframework" level="INFO"/>
<logger name="com.kkcl.coding" level="INFO"/>
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
4、使用方式
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Test {
Logger logger = LoggerFactory.getLogger(TestController.class);
logger.info("welcome to enter log test routine path");
}
总结
借助于springboot框架,我们可以清楚的看到集成日志模块显得非常的简单,但是想要再此基础上实现一个更加健壮的日志系统还是需要费一番心思的。
参考博客
[1]、https://blog.youkuaiyun.com/chaitoudaren/article/details/105617533
[2]、https://blog.youkuaiyun.com/gogokongyin/article/details/72860296