SpringBoot入门实践(五)-开源日志框架介绍

 我的博客:兰陵笑笑生,欢迎浏览博客!

 上一章 SpringBoot入门实践(四)-RESTFUL API 最佳设计当中,我们介绍了在SpringBoot项目中如何规范的使用RESTful风格的API,。本章简单介绍一下常用的开源日志框架。

前言

 日志是程序设计中很重要的一部分,当然在我刚接触编程的时候,是不怎么在意的,正好有空归纳总结一下。

  在JDK1.4版本之后才有JDK Logger,不过JDK的日志太鸡肋,这里不过多介绍,开源社区当中应用比较广泛的是Apache Commons Logging和Apache Log4j ,Apache Commons Logging是通用的日志API ,Apache Log4j才是很流行的日志实现。后来Slf4j和Logback取代了Apache Commons Logging和Apache Log4j 。

一、Apache Commons Logging

  • 简介:

  Apache Commons Logging 提供了日志的接口,具体的实现根据配置动态调整,它的出现避免了和具体日志实现框架的直接耦合,在日常开发中,可以选择第三方的日志:’

file
  • 使用方式

    pom.xml引入

<dependency>     
    <groupId>commons-logging</groupId>   
    <artifactId>commons-logging</artifactId>     
    <version>1.1.1</version> 
</dependency>
package test;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Test;
public class CommonLogDemo {    
    private Log log=LogFactory.getLog(CommonLogDemo.class); 
    @Test    
    public void test(){   
        log.debug("debug .....");  
        log.info("info .....");      
        log.warn("warn .....");   
        log.error("error .....");    
        log.fatal("fatal .....");  
    }
}

resource目录下添加commons-logging.properties,如果单纯的使用commons-logging,默认的日志对象就是Jdk14Logger,工厂就是LogFactoryImpl

#指定日志对象
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger
#指定工厂
org.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.LogFactoryImpl

二、Apache Log4j

  • 简介

  Log4j是java编写的可靠的、灵活的日志框架,通过使用Log4j 我们能够方便的记录日志,不但弄控制日志的输出,还能控制日志的输出格式:

file

日志级别:

ALL、 DEBUG 、INFO 、WARN、 ERROR、 FATAL 、OFF

Appender :

日志的输出地方

常用的包括

  • ConsoleAppender控制台
  • FileAppender 文件
  • RollingFileAppender 滚动
  • DailyRollingFileAppender

当然还可以写入数据库,异步打印等等高级功能。

file

Layout

格式化

  • HTMLLayout XML形式输出

  • PatternLayout 使用自定义的格式输出

  • SimpleLayout 只包含日志信息的级别和信息字符串

  • TTCCLayout 包括时间、线程,类别等

一般用都是自定义用的比较多PatternLayout

  • 使用方式

public class LoggerDemo {  
    org.apache.log4j.Logger log= org.apache.log4j.Logger.getLogger(LoggerDemo.class);    @Test   
 public void  test(){    
     log.trace("trace log ...");  
     log.debug("debug log ...");   
     log.info("info log ...");   
     log.warn("warn log ...");     
     log.error("error log ...");   
 }

}

在resource目录下添加log4j.properties或者log4j.xml log4j会自动解析

log4j.properties

log4j.rootLogger=INFO, FILE,CONSOLE
#配置输出到控制台#1 ConsoleAppender控制台  2FileAppender 文件  3  RollingFileAppender 滚动  4 DailyRollingFileAppender
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.ImmediateFlush=truelog4j.appender.CONSOLE.Threshold=DEBUG
#layout对日志格式化# 1自定义格式,PatternLayout2
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.encoding=UTF-8
##格式  : %时间 [%线程] %log级别 %完整类名 - %消息 %换行
#%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd 
#HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
#%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL#%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数
#%c 输出所属的类目,通常就是所在类的全名
#%L 代码中的行数。
#%m 输出代码中指定的消息
# 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
log4j.appender.CONSOLE.layout.conversionPattern=%d{ABSOLUTE} %5p %c{1}:%L- %m%n
#配置输出到文件
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=D:\\log\\log.log
log4j.appender.FILE.ImmediateFlush=truelog4j.appender.FILE.Threshold=DEBUGlog4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.encoding=UTF-8
log4j.appender.FILE.layout.conversionPattern=%d{ABSOLUTE} %5p %c{1}:%L- %m%n
  • Log4j的锁和性能优化

​  通常来说,打日志总比不打印日志要好,产生问题是有据可查,但是存在太多的日志,会使服务性能下降。,Log4J默认的Apperders使用同步的锁来实现。

  • 日志事件异步打印

  • 可以使用Log4j 的 AsyncAppender来实现异步打印,

  • springBoot修改底层日志为log4j

第一步:添加springBoot的log4j依赖

<dependency>   
  <groupId>org.springframework.boot</groupId> 
  <artifactId>spring-boot-starter-log4j</artifactId>  
  <version>1.3.8.RELEASE</version>
</dependency>

第二步 :排除springBoot默认的logging

<dependency>  
   <groupId>org.springframework.boot</groupId>  
   <artifactId>spring-boot-starter</artifactId>  
     <exclusions>     
       <exclusion>    
       <groupId>org.springframework.boot</groupId>   
       <artifactId>spring-boot-starter-logging</artifactId>   
       </exclusion>    
     </exclusions>
</dependency>

第三步:resourece目录下添加log4j.properties文件或者log4j.xml

三、Slf4j(Simple Logging Facade for Java)

  • 简介

 和Apache Commons Logging,使用门面模式对外提供统一的接口,应用程序只依赖于Slf4j来实现打印日志,

具体的日志实现由配置来决定使用Log4j还是Logback,在不改变应用代码前提下,切换底层的日志实现。

springBoot就是实现了这种方式,底层使用slf4j+logback的方式进行日志记录 :

file

 Slf4j任然使用了门面模式,相对于Commons Logging做了一些优化,它在编译的时候确定底层的实现,而不是通过配置文件动态的状态底层的实现。,所以只要底层的日志实现的jar包和Slf4j的静态编译转换包在类路径下即可。

 从图上我们可以看到Slf4j的实现结构,除了Logger和LoggerFactory还有一个LoggerFactoryBinder,主要是实现转接器。

 什么意思呢,就是Slf4j对每一种日志实现的框架都提供了一个转换的Jar包,这个Jar包包含了LoggerFactoryBinder接口的实现,比如:Logback转接的Jar包就是logback-classic-1.0.13.jar,提供了LoggerFactoryBinder的实现

  • SLF4J对不同日志的转接包

file
  • 在springBoot中

  • 底层使用slf4j+logback的方式进行日志记录

  • 其他日志会转换成slf4j

看看spring-boot-start-logging的依赖

file

springBoot当中的spring-boot-start-logging默认引入

四、Logback

  • 简介

 Logback是由Log4j的创始人设计的另一个日志组件,它也是目前首选的主流日志记录工具。

我们所学习的springBoot就是默认使用Locback+Slf4j。

logback 分为3个部分

  1. logback-core:是以下2个模块的基础,包括日志的实现

  2. logback-classic :是Log4j的改良版本,在性能方面有较大的提高,并实现了上文说到的接口。

  3. logback-access:与Servlet集成,提供了丰富的Http访问日志功能

  • logback-classic结构:

file
  • 使用方式

package test;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogbackDemo { 
    Logger logger = LoggerFactory.getLogger(LogbackDemo.class);  
    @Test    
    public void Loback() { 
        logger.debug("debug ..."
                    );  
        logger.info("info ...");
        logger.error("info ...");  
        logger.warn("info ..."); 
    }

}

在resource目录下添加logback.xml配置

<?xml version="1.0" encoding="UTF-8"?><configuration>   
    <!-- <include resource="org/springframework/boot/logging/logback/base.xml"/>    -->   
    <!--自定义的pattern属性--> 
    <property name="pattern"
              value="%d{HH:mm:ss.SSS} [%-5level] [%thread] [%logger] %msg%n "/>  
    <!--控制台输出-->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">     
        <encoder>        
            <pattern>${pattern}</pattern>  
            <charset>GBK</charset>    
        </encoder>    
    </appender>  
    <!--滚动记录日志-->  
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">        <!--当前生成的日志文件名称-->     
        <file>D:\\log\\logback.out</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">            <!--根据时间记录日志-->         
            <fileNamePattern>test-log-%d{yyyy-MM-dd}.log</fileNamePattern>         
            <!--归档日志30天-->         
            <maxHistory>30</maxHistory>  
        </rollingPolicy>      
        <encoder>         
            <pattern>${pattern}</pattern>    
            <charset>GBK</charset>     
        </encoder>   
    </appender> 
    
    <logger name="org.springframework.web" level="INFO"/> 
    <!--根root logger 配置-->  
    <logger name="test" level="DEBUG">    
        <appender-ref ref="STDOUT"/>     
        <appender-ref ref="FILE"/>
    </logger>

</configuration>

Logback相对于Log4j的最大提升是效率,在关键的执行路径上性能提升了至少10倍。同步记录日志大概是1.5万/s的吞吐量。

五、总结

 以上就是本期的分享,你还可以关注本博客的#Spring Boot入门实践系列!#

本文由博客一文多发平台 OpenWrite 发布!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容