目录
前言
-
日志是了解系统运行的显示器,了解系统的指示牌,问题追踪器,数据运营分析的基础。
1、日志框架的发展
-
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;
2、日志框架的选择
-
日志门面:
-
JCL(2014年之后就不升级了)
-
slf4j( 推荐)
-
-
日志实现:
-
Log4j, logback是其升级版- 推荐( 和 slf4j都是同一个作者,兼容强);
-
JUL ,jdk工具包自带的一个简单的日志工具;
-
Log4j2 ,Apache开发的优秀日志实现, 推荐;
-
-
方案一:Slf4j + logback(springboot的默认日志框架);
-
方案二:Slf4j + log4j2;
3、日志框架的使用
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello World");
}
}
这样我们就可以使用日志了,这里springboot的日志使用的是logback,如果想要用其他的也是OK的,只需要导入相应的jar包即可,日志框架组合依赖包关系如下(资料参考):
4、SpringBoot日志遗留问题-框架的切换
-
开发系统A: 使用slf4j + logback;
-
依赖的Spring框架使用commons-logging
-
依赖的Mybaties使用JUL等等;
-
1、将系统中其他日志框架先排除出去;
-
2、导入中间包来替换原有的日志框架包进行适配转换,偷天换日;
-
3、导入我们需要的日志实现类,比如:日志门面slf4j + 日志实现log4j2;
-
第一步:排除Spring的commons-logging.jar包;
-
第二步:导入jcl-over-slf4j.jar适配转换包,将Commons-logging API桥接转换为slf4j-api的接口;
-
第三步:导入我们需要的slf4j和logbackjar包就OK了;
5、SpringBoot底层的日志框架
Springboot中依赖了很多的starter,其中有两个很重要的starter,选择其中一个starter即可。
方案一:slf4j + log4j2的日志组合框架
<dependencies>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
但是你会发现这两个jar包里什么文件都没有,只是导入了其他的几种日志包的实现和转换包,这也是非常典型的面向接口编程思想,让使用和实现解耦,大大提高了程序的可扩展性和灵活性。通过maven依赖树分析其底层的日志包依赖关系如下:
SpringBoot日志框架总结:
-
SpringBoot能适配所有的日志,而且底层默认使用slf4j + logback的方式记录日志;
-
引入其他框架的时候,只需要把这个框架依赖的日志框架排除掉,其他什么都不用做。
-
springboot提供了转换的中间包进行了适配,偷天换日的操作;
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
6、SpringBoot日志的配置
-
SpringBoot默认帮我们配置好了 日志slf4j + logback。
-
SpringBoot默认的日志级别: info
-
日志级别从低到高 :trace < debug<info<warn<error,项目中一般到info级别就够了;设置后高级别生效;
-
级别规则:只输出级别不低于设定级别的日志信息,例:loggers级别为INFO,则INFO、WARN、ERROR、FATAL级别的日志信息都会输出,而级别比INFO低的DEBUG则不会输出;
6.1、日志参数配置
2017-06-05 10:57:51.112 INFO 45469 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/7.0.52
2017-06-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
默认输出格式解析:The following items are output:
-
时间:Date and Time — Millisecond precision and easily sortable.
-
日志级别:Log Level — ERROR , WARN , INFO , DEBUG or TRACE .
-
线程id:Process ID.
-
分隔符:A --- separator to distinguish the start of actual log messages.
-
线程名字:Thread name — Enclosed in square brackets (may be truncated for console output).
-
日志的类名:Logger name — This is usually the source class name (often abbreviated).
-
日志信息:The log message.
|
参数
|
描述
|
Example
|
result
|
|
logging.path
|
指定日志路径
|
/var/log
|
输出到/var/log/spring.log文件中
|
|
logging.file
|
制定日志文件名
|
my.log
|
输出日志到my.log文件
|
|
logging.pattern.console
|
终端日志格式
|
|
|
|
logging.pattern.file
|
指定日志文件内容格式
|
|
|
<Properties>
<Property name="PATTERN">%d %p [%t] %C{1} (%F:%L) [%marker] - %m%n</Property>
<Property name="LOG_DIR">/opt/log</Property>
</Properties>
# %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
6.2、日志配置文件
<springProfile name="staging">
<!-- configuration to be enabled when the "staging" profile is active -->
</springProfile>
思考:如何定义自己的日志配置文件呢?
|
Logging System
|
Customization
|
|
Logback
|
logback-spring.xml
,
logback.xml
|
|
Log4j2
|
log4j2-spring.xml
or
log4j2.xml
|
|
JDK (Java Util Logging)
|
logging.properties
|
<springProfile name="dev">
<PatternLayout pattern=" dev-log %d %p [%t] %C{1} (%F:%L) [%marker] - %m%n"/>
</springProfile>
<springProfile name="!dev">
<PatternLayout pattern=" non-dev-log %d %p [%t] %C{1} (%F:%L) [%marker] - %m%n"/>
</springProfile>
这里需要在applicaton.properties文件或者命令行中设置激活的日志文件,参数如下:
spring.profiles.active=dev
设置完成之后,日志的输出格式就会是dev环境下的格式了,非常灵活;
7、 项目中日志收集流程
-
1、配置pom.xml中的dependency;
-
2、配置log4j2.xml中的appender;
-
3、配置日志名category;
-
4、打印日志;
8、小结
-
1、 快速定位分析问题,行为记录跟踪;
-
2、监控 系统运行情况, 持久化数据;
-
3、数据的统计和分析;
-
4、当然,在很多大型的互联网应用中,基于日志的收集以及分析可以了解用户画像,比如兴趣爱好/点击行为。
本文详细介绍了日志框架的发展历程、选择与使用方法,并深入探讨了SpringBoot中日志框架的配置及适配问题。
1004

被折叠的 条评论
为什么被折叠?



