日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

spingboot默認日志系統(tǒng)LogBack、Log4j和slf4j使用詳解

作者:柯柯不會Java 更新時間: 2022-10-11 編程語言

spingboot默認日志系統(tǒng)LogBack、Log4j和slf4j使用詳解

spingboot默認日志系統(tǒng)LogBack

依賴引入

Spring Boot默認使用LogBack日志系統(tǒng),如果不需要更改為其他日志系統(tǒng)如Log4j2等,則無需多余的配置,LogBack默認將日志打印到控制臺上。

如果要使用LogBack,原則上是需要添加dependency依賴的

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

但是因為新建的Spring Boot項目一般都會引用spring-boot-starter或者spring-boot-starter-web,而這兩個起步依賴中都已經包含了對于spring-boot-starter-logging的依賴,所以,無需額外添加依賴。

如何在項目中打印日志

新建一個配置類LogConfig,注入一個Bean,并在方法中打印日志

package com.jackie.springbootdemo.config;

import com.jackie.springbootdemo.model.Person;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration 
public class LogConfig {
    private static final Logger LOG = LoggerFactory.getLogger(LogConfig.class);

    @Bean
    public Person logMethod() {
        LOG.info("==========print log==========");
        return new Person();
    }
}

Spring Boot默認的日志級別為INFO,這里打印的是INFO級別的日志所以可以顯示。

很多開發(fā)者在日常寫private static final Logger LOG = LoggerFactory.getLogger(LogConfig.class);總覺得后面的LogConfig.class可有可無,因為隨便寫個其他類也不會報錯,但是準確編寫class信息能夠提供快速定位日志的效率。

我們看到打印的日志內容左側就是對應的類名稱,這個是通過private static final Logger LOG = LoggerFactory.getLogger(LogConfig.class);實現的。

如果將LogConfig.class換成xxx.class,輸出日志就會顯示對應的xxx類名。這樣聲明的好處就是方便定位日志。

如何將日志信息存儲到文件

在本機環(huán)境,我們習慣在控制臺看日志,但是線上我們還是要通過將日志信息保存到日志文件中,查詢日志文件即可。

那么應該如何配置才能將日志信息保存到文件呢?

在我們創(chuàng)建的springboot項目中,resources目錄下有個application.yml文件添加如下配置

logging:
  # 和file二寫一,同時配置不能全部生效
  path: 
  file: springbootdemo.log

logging.path

該屬性用來配置日志文件的路徑

logging.file

該屬性用來配置日志文件名,如果該屬性不配置,默認文件名為spring.log

如何設置日志級別

日志級別總共有 ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF ,且級別是逐漸提供,如果日志級別設置為INFO,則意味TRACE和DEBUG級別的日志都看不到。ALL 最低等級的,用于打開所有日志記錄。OFF 最高等級的,用于關閉所有日志記錄。

上例中我們打印了一個INFO級別的日志,因為Spring Boot默認級別就是INFO,如果我們改為WARN,是否還能看到這行日志信息。

logging.level

該屬性用于配置日志級別。

在applicaition.yml中添加

logging:
  level:
    root: warn

這里是用的root級別,即項目的所有日志,我們也可以使用package級別,即指定包下使用相應的日志級別,這里我們可以改動root還是INFO級別,將指定包下的日志級別設置為其它級別

logging:
  level:
    root: info
    com.fastech.framework: warn
    com.fastech.framework.mqtt.service: debug
    org.apache.hadoop.util.Shell: OFF
    org.mongodb.driver.*: OFF
    org.apache.zookeeper.ZooKeeper: OFF

如何定制自己的日志格式

在application.yml中添加

logging:
  pattern:
    console: "%clr(%d{MM-dd HH:mm:ss.SSS}){faint} %clr(${server.name} ${LOG_LEVEL_PATTERN}) %clr(${PID:- }){magenta} %clr([%5.5t]){faint} %clr(%-20.20logger{39} %5.5line){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx}}"
    file: "%clr(%d{MM-dd HH:mm:ss.SSS}){faint} %clr(${server.name} ${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr([%5.5t]){faint} %clr(%-20.20{39} %5.5line){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx}}"

logging.pattern.console

該屬性用于定制日志控制臺輸出格式。

logging.pattern.file

該屬性用于定制日志文件輸出格式。

上述配置的編碼中,對應符號的含義如下

%d{HH:mm:ss.SSS}——日志輸出時間
%thread——輸出日志的進程名字,這在Web應用以及異步任務處理中很有用
%-5level——日志級別,并且使用5個字符靠左對齊
%logger- ——日志輸出者的名字
%msg——日志消息
%n——平臺的換行符

Log4j的使用

依賴引入

在創(chuàng)建Spring Boot工程時,我們引入了spring-boot-starter,其中包含了spring-boot-starter-logging,該依賴內容就是Spring Boot默認的日志框架Logback,所以我們在引入log4j之前,需要先排除該包的依賴,再引入log4j的依賴。

需要注意的是
Spring Boot 只有1.3.x和1.3.x以下版本才支持log4j的日志配置,1.3.x以上版本只支持log4j2。

區(qū)別在于需要引入的包

<artifactId>spring-boot-starter-log4j</artifactId>

<artifactId>spring-boot-starter-log4j2</artifactId>

Spring Boot 1.3.x和1.3.x以下版本的pom文件如下:

<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>

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

Spring Boot 1.3.x以上版本的pom文件如下:

<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>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

如果找不到

<artifactId>spring-boot-starter</artifactId>

則查找

<artifactId>spring-boot-starter-web</artifactId>

因為log4j2對于log4j來說有很多變動,如果不喜歡用log4j2,1.3.x版本以上的spring boot框架也可以引入以下兩個包使用log4j。

<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

配置log4j2.xml

在引入了log4j依賴之后,只需要在src/main/resources目錄下加入log4j-spring.properties配置文件,就可以開始對應用的日志進行配置使用。

注意:Spring Boot官方推薦優(yōu)先使用帶有-spring的文件名作為你的日志配置(如使用log4j-spring.properties,而不是log4j.properties,不過取名為log4j.properties也是沒有問題的)

但是 log4j2版本則需要注意,只能使用非properties文件進行配置,xml或者yml,或者Json。

更多配置文件格式相關參考:https://logging.apache.org/log4j/2.x/manual/configuration.html

在application.properties中指定特定配置文件

logging.config=classpath:log4j2.xml

配置輸出日志到控制臺

通過如下配置,設定root日志的輸出級別為INFO,appender為控制臺輸出stdout

LOG4J根配置

log4j.rootCategory=INFO, stdout

其中INFO是日志輸出級別,共有5級:

FATAL 0
ERROR 3
WARN 4
INFO 6
DEBUG 7

控制臺輸出log4j-spring.properties格式配置

log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n

對應的xml格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
  <Appenders>
<Console name="Console" target="SYSTEM_OUT">
  <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n"/>
</Console>
  </Appenders>
  <Loggers>
<Root level="info">
  <AppenderRef ref="Console"/>
</Root>
  </Loggers>
</Configuration>

Layout:日志輸出格式,Log4j提供的layout有以下幾種:

org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串),
org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息)

配置輸出日志到文件log4j-spring.properties格式配置

在開發(fā)環(huán)境,我們只是輸出到控制臺沒有問題,但是到了生產或測試環(huán)境,或許持久化日志內容,方便追溯問題原因。可以通過添加如下的appender內容,按天輸出到不同的文件中去,同時還需要為log4j.rootCategory添加名為file的appender,這樣root日志就可以輸出到logs/all.log文件中了。

LOG4J配置

log4j.rootCategory=INFO, stdout, file

輸出到文件

log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.file=logs/all.log
log4j.appender.file.DatePattern='.'yyyy-MM-dd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n

Appender 為日志輸出目的地,Log4j提供的appender有以下幾種:

org.apache.log4j.ConsoleAppender(控制臺),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件),
org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件),
org.apache.log4j.WriterAppender(將日志信息以流格式發(fā)送到任意指定的地方)

配置日志分類輸出log4j-spring.properties格式配置
當我們日志量較多的時候,查找問題會非常困難,常用的手段就是對日志進行分類,比如:

例子一:

可以按不同package進行輸出。通過定義輸出到logs/my.log的appender,并對com.test包下的日志級別設定為DEBUG級別、appender設置為輸出到logs/my.log的名為test的appender。

com.test包下的日志配置

log4j.category.com.test=DEBUG, testfile

com.test下的日志輸出

log4j.appender.testfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.testfile.file=logs/my.log
log4j.appender.testfile.DatePattern='.'yyyy-MM-dd
log4j.appender.testfile.layout=org.apache.log4j.PatternLayout
log4j.appender.testfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L ---- %m%n

可以對不同級別進行分類,比如對ERROR級別輸出到特定的日志文件中,具體配置可以如下。

log4j.logger.error=errorfile

error日志輸出

log4j.appender.errorfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorfile.file=logs/error.log
log4j.appender.errorfile.DatePattern='.'yyyy-MM-dd
log4j.appender.errorfile.Threshold = ERROR
log4j.appender.errorfile.layout=org.apache.log4j.PatternLayout
log4j.appender.errorfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n
例子二:

set log levels

log4j.rootLogger = debug ,  stdout ,  D ,  E

輸出到控制臺

log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern =  %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n

輸出到日志文件

log4j.appender.D.File = logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG ## 輸出DEBUG級別以上的日志
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

保存異常信息到單獨文件

log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = logs/error.log ## 異常日志文件名
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR ## 只輸出ERROR級別以上的日志!!!
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

配置日志輸出到數據庫log4j-spring.properties格式配置

將日志文件輸出到數據庫配置:

LOG4J配置

log4j.rootCategory=INFO,stdout,jdbc

數據庫輸出

log4j.appender.jdbc=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.jdbc.driver=com.mysql.jdbc.Driver
log4j.appender.jdbc.URL=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=true
log4j.appender.jdbc.user=root
log4j.appender.jdbc.password=root
log4j.appender.jdbc.sql=insert into log_icecoldmonitor(level,category,thread,time,location,note) values('%p','%c','%t','%d{yyyy-MM-dd HH:mm:ss:SSS}','%l','%m')

引入數據庫驅動:

<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
</dependency>

創(chuàng)建表:

CREATE TABLE `log_icecoldmonitor` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `level` varchar(255) NOT NULL DEFAULT '' COMMENT '優(yōu)先級',
  `category` varchar(255) NOT NULL DEFAULT '' COMMENT '類目',
  `thread` varchar(255) NOT NULL DEFAULT '' COMMENT '進程',
  `time` varchar(30) NOT NULL DEFAULT '' COMMENT '時間',
  `location` varchar(255) NOT NULL DEFAULT '' COMMENT '位置',
  `note` text COMMENT '日志信息',
  PRIMARY KEY (`Id`)
)

這樣就可以保存到日志到數據庫了,可能會出現如下異常信息:Java連接Mysql數據庫警告:Establishing SSL connection

原因是MySQL在高版本需要指明是否進行SSL連接。解決方案如下:在mysql連接字符串url中加入ssl=true或者false即可,如下所示。

url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=true

測試代碼

package com.imooc.controller;

import org.apache.logging.log4j.Logger;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;

import org.apache.logging.log4j.LogManager;

/**
 * @ClassName: Log4jController
 * @Description:
 * @Author: keke
 * @Date: 2022/4/2
 */
@ApiIgnore //該controller就不會在api文檔中出現
@RestController //默認所有請求返回的都是json對象
public class Log4jController {

    final static Logger logger = LogManager.getLogger(Log4jController.class);

    @GetMapping("/hello")
    public Object hello() {

        logger.debug("debug: hello~");
        logger.info("info: hello~"); 
        logger.warn("warn: hello~");
        logger.error("error: hello~");

        return "Hello World~";
    }

}

slf4j的使用

依賴引入

<!--排除springboot自帶的logging日志jar包-->
<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>

<!--引入slf4j日志依賴 抽象層 與 實現層-->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.21</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.21</version>
</dependency>

log4j.properties配置

log4j.rootLogger=DEBUG,stdout,file
log4j.additivity.org.apache=true

# 控制臺輸出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.threshold=INFO
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-5p %c{1}:%L - %m%n

# 文件輸出
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.DatePattern='.'yyyy-MM-dd-HH-mm
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
log4j.appender.file.Threshold=INFO
log4j.appender.file.append=true
# 輸出路徑
log4j.appender.file.File=/IdeaProjects/JGS/workspaces/logs/foodie-api/imooc.log

測試代碼

package com.imooc.controller;

import org.slf4j.ILoggerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;

@ApiIgnore //該controller就不會在api文檔中出現
@RestController //默認所有請求返回的都是json對象
public class HelloController {

    final static Logger logger = LoggerFactory.getLogger(HelloController.class);

    @GetMapping("/hello")
    public Object hello() {

        logger.debug("debug: hello~");
        logger.info("info: hello~"); //會打印info及以上日志級別 因為log4j.properties里設置了log4j.appender.stdout.threshold=INFO
        logger.warn("warn: hello~");
        logger.error("error: hello~");

        return "Hello World~";
    }
  
}

將日志文件寫入數據庫

在上面項目的基礎上加上連接數據庫的jar包

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.18</version>
</dependency>

log4j.properties的配置文件中添加將日志文件插入數據庫的配置,同時需要將第一行配置文件改為:

# 日記級別(單個級別) 文件/控制臺
log4j.rootLogger=DEBUG, stdout,file,datasource

下面是配置將日志信息插入數據庫

配置輸出目標為數據庫(假如要將日志在控制臺輸出,配置為log4j.appender. stdout =org.apache.log4j.ConsoleAppender;將日志寫入文件,配置為log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender#這樣的配置在許多地方都要有,需要可查有關資料),當然你也可以自己擴展org.apache.log4j.jdbc.JDBCAppender這個類,只需要在這里配置就可以了例如我們配置我自己擴展的MyJDBCAppender,配置為#log4j.appender.db=com.neam.commons.MyJDBCAppender

log4j.appender.datasource=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.datasource.layout=org.apache.log4j.PatternLayout
log4j.appender.datasource.driver=com.mysql.jdbc.Driver
#定義什么級別的錯誤將寫入到數據庫中
log4j.appender.datasource.BufferSize=1
#設置緩存大小,就是當有1條日志信息是才忘數據庫插一次,我設置的數據庫名和表名均為user
log4j.appender.datasource.URL=jdbc\:mysql\://localhost\:3306/user?characterEncoding\=UTF8&zeroDateTimeBehavior\=convertToNull
log4j.appender.datasource.user=root
log4j.appender.datasource.password=root
log4j.appender.datasource.sql=insert into user (class,method,create_time,log_level,log_line,msg) values ('%C','%M','%d{yyyy-MM-dd HH:mm:ss}','%p','%l','%m')

數據庫設計

對比總結

1.SLF4J(Simple logging Facade for Java)

SLF4J意思為簡單日志門面,它是把不同的日志系統(tǒng)的實現進行了具體的抽象化,只提供了統(tǒng)一的日志使用接口,使用時只需要按照其提供的接口方法進行調用即可,由于它只是一個接口,并不是一個具體的可以直接單獨使用的日志框架,所以最終日志的格式、記錄級別、輸出方式等都要通過接口綁定的具體的日志系統(tǒng)來實現,這些具體的日志系統(tǒng)就有l(wèi)og4j,logback,java.util.logging等,它們才實現了具體的日志系統(tǒng)的功能。

如何使用SLF4J?

既然SLF4J只是一個接口,那么實際使用時必須要結合具體的日志系統(tǒng)來使用,我們首先來看SLF4J和各個具體的日志系統(tǒng)進行綁定時的框架原理圖:

img

其實slf4j原理很簡單,他只提供一個核心slf4j api(就是slf4j-api.jar包),這個包只有日志的接口,并沒有實現,所以如果要使用就得再給它提供一個實現了些接口的日志包,比 如:log4j,common logging,jdk log日志實現包等,但是這些日志實現又不能通過接口直接調用,實現上他們根本就和slf4j-api不一致,因此slf4j又增加了一層來轉換各日志實現包的使 用,當然slf4j-simple除外。其結構如下:
slf4j-api(接口層)
|
各日志實現包的連接層( slf4j-jdk14, slf4j-log4j)
|
各日志實現包

所以,結合各日志實現包使用時提供的jar包情況為:

SLF4J和logback結合使用時需要提供的jar:slf4j-api.jar,logback-classic.jar,logback-core.jar

SLF4J和log4j結合使用時需要提供的jar:slf4j-api.jar,slf4j-log412.jar,log4j.jar

SLF4J和JDK中java.util.logging結合使用時需要提供的jar:slf4j-api.jar,slf4j-jdk14.jar

SLF4J和simple(SLF4J本身提供的一個接口的簡單實現)結合使用時需要提供的jar:slf4j-api.jar,slf4j-simple.jar

當然還有其他的日志實現包,以上是經常會使用到的一些。

注意,以上slf4j和各日志實現包結合使用時最好只使用一種結合,不然的話會提示重復綁定日志,并且會導致日志無法輸出。

slf4j-api.jar:對外提供統(tǒng)一的日志調用接口,該接口具體提供的調用方式和方法舉例說明:見上slf4j的使用

如果系統(tǒng)中之前已經使用了log4j做日志輸出,想使用slf4j作為統(tǒng)一的日志輸出,該怎么辦呢?

如果之前系統(tǒng)中是單獨使用log4j做為日志輸出的,這時再想使用slf4j做為日志輸出時,如果系統(tǒng)中日志比較多,此時更改日志輸出方法肯定是不太現實的,這個時候就可以使用log4j-over-slf4j.jar將使用log4j日志框架輸出的日志路由到slf4j上來統(tǒng)一采用slf4j來輸出日志。

為什么要使用SLF4J?

  • slf4j是一個日志接口,自己沒有具體實現日志系統(tǒng),只提供了一組標準的調用api,這樣將調用和具體的日志實現分離,使用slf4j后有利于根據自己實際的需求更換具體的日志系統(tǒng),比如,之前使用的具體的日志系統(tǒng)為log4j,想更換為logback時,只需要刪除log4j相關的jar,然后加入logback相關的jar和日志配置文件即可,而不需要改動具體的日志輸出方法,試想如果沒有采用這種方式,當你的系統(tǒng)中日志輸出有成千上萬條時,你要更換日志系統(tǒng)將是多么龐大的一項工程。如果你開發(fā)的是一個面向公眾使用的組件或公共服務模塊,那么一定要使用slf4的這種形式,這有利于別人在調用你的模塊時保持和他系統(tǒng)中使用統(tǒng)一的日志輸出。
  • slf4j日志輸出時可以使用{}占位符,如,logger.info(“testlog: {}”, “test”),而如果只使用log4j做日志輸出時,只能以logger.info(“testlog:”+“test”)這種形式,前者要比后者在性能上更好,后者采用+連接字符串時就是new 一個String 字符串,在性能上就不如前者。

2.log4j(log for java)

Log4j是Apache的一個開源項目,通過使用Log4j,我們可以控制日志信息輸送的目的地是控制臺、文件、GUI組件,甚至是套接口服務器、NT的事件記錄器、UNIX Syslog守護進程等;我們也可以控制每一條日志的輸出格式;通過定義每一條日志信息的級別,我們能夠更加細致地控制日志的生成過程。最令人感興趣的就是,這些可以通過一個配置文件來靈活地進行配置,而不需要修改應用的代碼。

如何使用?

  • 引入jar,使用log4j時需要的jar為:log4j.jar。
  • 定義配置文件log4j.properties或log4j.xml
  • 在具體的類中進行使用:
    • 在需要日志輸出的類中加入:private static final Logger logger = Logger.getLogger(Tester.class); //通過Logger獲取Logger實例
    • 在需要輸出日志的地方調用相應方法即可:logger.debug(“System ……”)

關于如何單獨使用log4j,建議詳細閱讀以下文章:

https://blog.csdn.net/u012422446/article/details/51199724

3.logback

logback同樣是由log4j的作者設計完成的,擁有更好的特性,用來取代log4j的一個日志框架,是slf4j的原生實現(即直接實現了slf4j的接口,而log4j并沒有直接實現,所以就需要一個適配器slf4j-log4j12.jar),logback一共有以下幾個模塊:

  • logback-core:其它兩個模塊的基礎模塊
  • logback-classic:它是log4j的一個改良版本,同時它完整實現了slf4j API使你可以很方便地更換成其它日志系統(tǒng)如log4j或JDK14 Logging
  • logback-access:訪問模塊與Servlet容器集成提供通過Http來訪問日志的功能

同樣,單獨使用它時,需要引入以上jar,然后進行配置文件的配置,最后就是在相關類中進行使用,使用時加入以下語句:

private final static Logger logger = LoggerFactory.getLogger(Test.class);

logger.info(“打印日志”);

對于logback的使用,詳細使用方法及配置推薦閱讀以下文章:

https://www.cnblogs.com/warking/p/5710303.html

4.總結如下:

1、slf4j是java的一個日志門面,實現了日志框架一些通用的api,log4j和logback是具體的日志框架。

2、他們可以單獨的使用,也可以綁定slf4j一起使用。

單獨使用,分別調用框架自己的方法來輸出日志信息。綁定slf4j一起使用。調用slf4j的api來輸入日志信息,具體使用與底層日志框架無關(需要底層框架的配置文件)。顯然不推薦單獨使用日志框架。假設項目中已經使用了log4j,而我們此時加載了一個類庫,而這個類庫依賴另一個日志框架。這個時候我們就需要維護兩個日志框架,這是一個非常麻煩的事情。而使用了slf4j就不同了,由于應用調用的抽象層的api,與底層日志框架是無關的,因此可以任意更換日志框架。

參考文章

https://www.cnblogs.com/bt2882/p/13820092.html

https://www.cnblogs.com/hanszhao/p/9754419.html

https://zzq23.blog.csdn.net/article/details/87629782

原文鏈接:https://blog.csdn.net/qq_46601365/article/details/123923553

欄目分類
最近更新