網站首頁 編程語言 正文
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)進行綁定時的框架原理圖:
其實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
相關推薦
- 2023-03-18 Android?UI動態(tài)設置帶有Stroke漸變色背景Drawable_Android
- 2023-05-10 Pandas數據分析多文件批次聚合處理實例解析_python
- 2023-01-10 Redis秒殺實現方案講解_Redis
- 2023-02-02 C語言中的直接插入排序(帶圖詳細)_C 語言
- 2021-12-11 vite-plugin-mock使用方式
- 2022-04-20 python數據類型中的字符串你了解多少_python
- 2022-09-19 利用Python實現批量打包程序的工具_python
- 2022-05-22 go中string、int、float相互轉換的實現示例_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支