淘客網(wǎng)站+wordpress上海百度seo優(yōu)化
前言,本篇就是介紹在Java中使用相關(guān)的日志,適合初學(xué)者看,如果對(duì)這篇不感興趣的可以移步了,本篇主要圍繞我們Java中的幾種日志類型,也說不上有多深入,算的上淺入淺出吧,如果你有一段時(shí)間的開發(fā)經(jīng)驗(yàn)或者以及學(xué)過日志了,其實(shí)這篇文章對(duì)你并無太大用處。
說到日志,這玩意就很重要了,我們?cè)趯?shí)際開發(fā)中或者我們?cè)谧鲰?xiàng)目的時(shí)候,我們一般查找問題往日志查看,包括我們上線的項(xiàng)目,如果項(xiàng)目出現(xiàn)什么問題了,那我們第一件事情,就是下載項(xiàng)目運(yùn)行日志,然后根據(jù)日志來判斷程序在哪里出現(xiàn)了問題。目前Java中提供的日志有以下幾種類型:
- JDK Logging: JDK自帶的日志框架,也是Java官方推薦的日志框架,可以通過java.util.logging包來使用。
- Log4j:Apache開源的日志框架,提供了豐富的配置選項(xiàng)和靈活的日志輸出方式,可以通過log4j包使用
- Logback:Log4j的升級(jí)版,也是由Apache開源的日志框架,提供了更好的性能和更加豐富的功能,可以通過logback包來使用。
- SLF4J:Simple Logging Facade for Java,是一個(gè)抽象層,可以在不同的日志框架之間進(jìn)行切換,可以通過slf4j包來使用。
接下來我們將采用這些案例進(jìn)行demo日志打印:
第一個(gè)引入相關(guān)依賴:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- Spring Boot Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.32</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>1.7.32</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version><scope>compile</scope></dependency>
配置了相關(guān)依賴之后,咱們來配置我們的相關(guān)配置文件:
#端口號(hào)
server.port=9091
#開啟應(yīng)用調(diào)試模式
debug=true
#debug展示包以下的記錄的日志級(jí)別為debug
logging.level.com.miaow=debug# 而logging.logback.rollingpolicy是Logback日志框架的滾動(dòng)策略配置
# clean-history-on-start表示是否在應(yīng)用程序啟動(dòng)時(shí)清除歷史日志文件,默認(rèn)為false。
logging.logback.rollingpolicy.clean-history-on-start=false
# file-name-pattern表示日志文件名的格式,默認(rèn)為%d{yyyy-MM-dd}/%i.log,其中%d{yyyy-MM-dd}表示按照日期劃分日志文件,%i表示日志文件的序號(hào)。
logging.logback.rollingpolicy.file-name-pattern=
#max-history表示保留的歷史日志文件的最大數(shù)量,默認(rèn)為7。
logging.logback.rollingpolicy.max-history=7
# max-file-size表示單個(gè)日志文件的最大大小,默認(rèn)為10MB。
logging.logback.rollingpolicy.max-file-size=10MB
# total-size-cap表示所有日志文件的總大小上限,默認(rèn)為0B,表示沒有上限。
logging.logback.rollingpolicy.total-size-cap=0B
需要注意的是,logging.logback.rollingpolicy是Logback的配置項(xiàng),如果您使用的是其他日志框架,可能需要使用不同的配置項(xiàng)。
也可以:
logging:level:root: infocom.example: debugfile:name: myapp.logpath: /var/log/myapp/
上面的配置表示將根日志級(jí)別設(shè)置為info
,將com.example
包下的日志級(jí)別設(shè)置為debug
,并將日志輸出到/var/log/myapp/myapp.log
文件中。
咱們創(chuàng)建四個(gè)類表示以上的四種日志方式:
import java.util.logging.Logger;/*** @date 2023年11月29日 14:52* @description*/
public class MyClass1 {private static final Logger LOGGER = Logger.getLogger(MyClass1.class.getName());public void myMethod() {LOGGER.info("============>JDK Logging<============");LOGGER.info("This is an info message");LOGGER.warning("This is a warning message");LOGGER.severe("This is a severe message");}
}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class MyClass3 {private static final Logger LOGGER = LoggerFactory.getLogger(MyClass3.class);public void myMethod() {LOGGER.info("================>Logback<================");LOGGER.info("This is an info message");LOGGER.warn("This is a warning message");LOGGER.error("This is an error message");}
}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class MyClass4 {private static final Logger LOGGER = LoggerFactory.getLogger(MyClass4.class);public void myMethod() {LOGGER.info("===============>SLF4J<=================");LOGGER.info("This is an info message");LOGGER.warn("This is a warning message");LOGGER.error("This is an error message");}
}
import org.apache.log4j.Logger;
/*** @date 2023年11月29日 14:53* @description*/
public class MyClass5 {private static final Logger LOGGER = Logger.getLogger(MyClass5.class);public void myMethod() {LOGGER.info("==============>Log4j<==================");LOGGER.info("This is an info message");LOGGER.warn("This is a warning message");LOGGER.error("This is an error message");}
}
然后我們?cè)赟pring Boot中啟動(dòng)類中配置:
@Slf4j
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);MyClass1 m1 = new MyClass1();MyClass5 m2 = new MyClass5();MyClass3 m3 = new MyClass3();MyClass4 m4 = new MyClass4();m1.myMethod();m2.myMethod();m3.myMethod();m4.myMethod();}
}
如果你到這一步就以為結(jié)束了?
你不妨啟動(dòng)一下項(xiàng)目,我們發(fā)現(xiàn)MyClass5好像沒生效,并且控制臺(tái)報(bào)錯(cuò)了:
log4j:WARN No appenders could be found for logger
(org.apache.ibatis.logging.LogFactory).log4j:WARN Please initialize the log4j system properly. log4j:WARN See
http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
我們發(fā)現(xiàn)問題出在,我們需要在Resources目錄下建立一個(gè)log4j.properties文件
# Global logging configuration 開發(fā)時(shí)候建議使用 debug
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
放上如上代碼,在啟動(dòng),ok,我們發(fā)現(xiàn)日志如下。
2023-11-29 15:27:02.250 INFO 26848 --- [ main] com.miaow.demo.MyClass1 : ============>JDK Logging<============
2023-11-29 15:27:02.250 INFO 26848 --- [ main] com.miaow.demo.MyClass1 : This is an info message
2023-11-29 15:27:02.250 WARN 26848 --- [ main] com.miaow.demo.MyClass1 : This is a warning message
2023-11-29 15:27:02.250 ERROR 26848 --- [ main] com.miaow.demo.MyClass1 : This is a severe messageINFO [main] - ==============>Log4j<==================INFO [main] - This is an info messageWARN [main] - This is a warning message
ERROR [main] - This is an error message
2023-11-29 15:27:02.250 INFO 26848 --- [ main] com.miaow.demo.MyClass3 : ================>Logback<================
2023-11-29 15:27:02.250 INFO 26848 --- [ main] com.miaow.demo.MyClass3 : This is an info message
2023-11-29 15:27:02.250 WARN 26848 --- [ main] com.miaow.demo.MyClass3 : This is a warning message
2023-11-29 15:27:02.250 ERROR 26848 --- [ main] com.miaow.demo.MyClass3 : This is an error message
2023-11-29 15:27:02.250 INFO 26848 --- [ main] com.miaow.demo.MyClass4 : ===============>SLF4J<=================
2023-11-29 15:27:02.250 INFO 26848 --- [ main] com.miaow.demo.MyClass4 : This is an info message
2023-11-29 15:27:02.250 WARN 26848 --- [ main] com.miaow.demo.MyClass4 : This is a warning message
2023-11-29 15:27:02.251 ERROR 26848 --- [ main] com.miaow.demo.MyClass4 : This is an error message
在Spring Boot中使用日志有以下幾個(gè)好處:
-
問題排查和調(diào)試:日志是開發(fā)和運(yùn)維過程中非常重要的工具,它可以幫助我們追蹤和定位應(yīng)用程序中的問題。通過記錄關(guān)鍵信息和異常堆棧跟蹤,我們可以更快地定位和解決問題。
-
運(yùn)行時(shí)監(jiān)控:日志可以提供應(yīng)用程序的運(yùn)行時(shí)監(jiān)控信息,包括請(qǐng)求處理時(shí)間、數(shù)據(jù)庫(kù)查詢時(shí)間、方法執(zhí)行時(shí)間等。這些信息可以幫助我們了解應(yīng)用程序的性能狀況,及時(shí)發(fā)現(xiàn)潛在的性能問題并進(jìn)行優(yōu)化。
-
安全審計(jì):日志可以記錄應(yīng)用程序的操作和事件,包括用戶登錄、權(quán)限驗(yàn)證、敏感數(shù)據(jù)訪問等。這些日志可以用于安全審計(jì),幫助我們追蹤和分析系統(tǒng)的安全事件,及時(shí)發(fā)現(xiàn)異常行為和潛在的安全威脅。
-
業(yè)務(wù)分析和統(tǒng)計(jì):通過日志記錄關(guān)鍵業(yè)務(wù)操作和事件,我們可以進(jìn)行業(yè)務(wù)分析和統(tǒng)計(jì)。例如,統(tǒng)計(jì)用戶訪問量、分析用戶行為、跟蹤業(yè)務(wù)流程等,這些信息可以幫助我們了解用戶需求和行為,優(yōu)化產(chǎn)品和服務(wù)。
-
運(yùn)維管理:日志可以幫助運(yùn)維人員監(jiān)控和管理應(yīng)用程序的運(yùn)行狀態(tài)。通過日志,我們可以了解應(yīng)用程序的運(yùn)行情況、資源利用情況、錯(cuò)誤和異常情況等,及時(shí)發(fā)現(xiàn)和解決問題,保證應(yīng)用程序的穩(wěn)定運(yùn)行。
總之,使用日志可以提供豐富的運(yùn)行時(shí)信息和統(tǒng)計(jì)數(shù)據(jù),幫助我們更好地了解和管理應(yīng)用程序。在開發(fā)和運(yùn)維過程中,合理配置和利用日志可以提高開發(fā)效率、問題排查能力和系統(tǒng)穩(wěn)定性。