成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

十個Java編程中記錄日志的小技巧

開發 前端
在聯機環境中禁用調試功能非常重要。因為通常系統會有大量的調試日志,各種框架也會大量使用調試日志,在線調試可能會很快填滿磁盤,影響業務系統的正常運行。

在Java編程中,良好的日志記錄是一項重要的實踐。無論是在調試代碼還是在生產環境中追蹤問題,準確的日志信息能夠提供有價值的上下文和跟蹤數據。然而,對于許多開發者來說,正確地記錄日志可能是個挑戰。

本文介紹一些簡單且實用的技巧,以幫助讀者在Java編程中改善日志記錄,使其更加高效和易于調試。

1 選擇適當的日志格式

理想的日志格式應包含最基本的信息,例如當前時間戳(通常精確到毫秒)、日志級別、線程名稱等。可以像下面這樣配置logback日志:

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
       <pattern>%d{HH:mm:ss.SSS} %-5level [%thread][%logger{0}] %m%n</pattern>
    </encoder>
</appender>

如果開發者的日志格式不記錄當前時間,那么甚至無法知道請求發生的時間。

2 選擇適當的日志級別

常見的日志級別有五個,分別是error、warn、info、debug和trace。在日常開發中,開發者需要選擇適當的日志級別,不要直接打印info級別的日志。

  • Error(錯誤):指相對嚴重的錯誤,會影響正常業務,并需要進行運維配置監控。
  • Warn(警告):一般的錯誤,對業務影響較小,但需要開發人員的注意。
  • Info(信息):記錄關鍵的故障排查信息,例如調用時間、輸入輸出參數等。
  • Debug(調試):用于開發階段的關鍵邏輯的運行時數據。
  • Trace(追蹤):最詳細的信息,一般只在日志文件中記錄。

3 當日志級別較低時,進行日志開關判斷

對于較低的日志級別,如trace/debug級別,必須進行日志級別開關判斷。

User user = new User(666L, "demo");
if (log.isDebugEnabled()) {
    log.debug("userId is: {}", user.getId());
}

由于目前存在以下日志代碼:

logger.debug("Processing trade with id: " + id + " and symbol: " + symbol);

如果配置的日志級別是warn,上述日志將不會被打印,但仍會執行字符串拼接操作。如果符號是對象,還將執行toString()方法,這會浪費系統資源。盡管進行了上述操作,但最終日志并未打印出來,因此建議添加日志開關判斷。

4 日志應打印出該方法的輸入和輸出參數

開發人員不需要打印大量的日志,只需要打印能夠快速定位問題的有效日志。什么是有效和關鍵的日志呢?

  • 輸入方法時,打印輸入參數。
  • 方法返回時,打印出參數和返回值。

就參數而言,通常是關鍵信息,比如userId等。

5 日志系統中的API(如Log4j、Logback)不能直接使用,但可以使用日志框架SLF4J中的API

SLF4J是一個以門面模式(facade mode)工作的日志框架,有利于統一各個類的維護和日志處理方法,而且可以輕松替換底層的日志框架且不需要修改代碼。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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

6 當遇到諸如 if...else... 或 switch 等條件語句時,盡量在每個分支的第一行打印日志

當遇到 if...else... 或 switch 等條件語句時,應盡量在分支的第一行打印日志,這樣在排查問題時,可以通過日志確定進入了哪個分支,代碼邏輯更清晰,也更容易排查問題。

if (user.isVip()) {
  log.info("User isVip, Id: {}", user.getUserId());
} else {
  log.info("User not isVip, Id: {}", user.getUserId());
}

以上代碼示例在每個分支的第一行使用日志打印。

7 建議使用參數占位符 {} 代替 + 進行字符串拼接

錯誤的用法:

logger.info("Processing trade with id: " + id + " and symbol: " + symbol);

在上面的例子中,使用 + 運算符來拼接字符串會帶來一定的性能損失。

正確的用法:

logger.info("Processing trade with id: {} and symbol: {}", id, symbol);

在日志中使用花括號 {} 作為占位符,這比使用 + 運算符更加優雅和簡潔。與負面示例相比,占位符的使用只是一個替換操作,可以有效提高性能。

8 不要使用e.printStackTrace()

錯誤的用法:

try {
  ...
} catch (Exception e) {
  e.printStackTrace();
}

正確的用法:

try {
  ...
} catch (Exception e) {
  log.error("error", e);
}

使用e.printStackTrace()打印的堆棧日志與業務代碼日志交織在一起,通常不方便檢查異常日志。

e.printStackTrace()語句生成的字符串記錄了堆棧信息。如果信息過長,字符串常量池所在的內存塊沒有空間,也就是內存已滿,那么用戶的請求會被阻塞。

9 建議以異步方式輸出日志

日志最終會輸出到文件或其他輸出流中,這涉及到IO性能。如果采用異步方式,可以顯著提高IO性能。

除非有特殊要求,建議使用異步方式輸出日志。以logback為例,配置異步非常簡單,只需使用AsyncAppender:

<appender name="FILE_ASYNC" class="ch.qos.logback.classic.AsyncAppender">
    <appender-ref ref="ASYNC"/>
</appender>

以上配置使用AsyncAppender來實現異步輸出日志。

10 禁止在聯機環境中啟用調試功能

在聯機環境中禁用調試功能非常重要。

因為通常系統會有大量的調試日志,各種框架也會大量使用調試日志,在線調試可能會很快填滿磁盤,影響業務系統的正常運行。

責任編輯:武曉燕 來源: Java學研大本營
相關推薦

2024-01-30 00:40:10

2024-12-24 00:00:00

技巧日志框架

2013-09-29 13:36:07

虛擬SAN

2010-12-06 09:49:28

Linux快速啟動

2024-11-29 10:00:00

Python日志記錄

2024-12-24 08:23:31

2022-10-19 15:20:58

pandas數據處理庫技巧

2011-06-01 09:59:52

2021-05-12 09:00:00

WebReactJavaScript

2024-01-03 08:53:35

JavaScrip編程語言NodeJS

2022-03-02 08:20:54

并發編程java后端開發

2022-05-06 13:19:13

JS前端

2019-08-16 02:00:46

AndroidGoogle 移動系統

2025-06-03 09:06:20

2024-12-03 14:33:42

Python遞歸編程

2024-11-18 19:00:29

2018-06-23 14:01:53

字符串Java數組

2023-11-08 18:05:06

Python類型技巧

2025-04-09 00:01:05

2024-09-26 15:00:06

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线播放一区二区三区 | 精品一区二区三区av | 一区二区三区日韩精品 | 中文字幕乱码一区二区三区 | 久久美女网 | 91社影院在线观看 | 欧美1级| 天天艹| 午夜影视大全 | 在线亚洲一区二区 | 国产欧美在线视频 | 久久狼人天堂 | 欧美激情综合网 | 久久久久综合 | 成人a视频片观看免费 | 国产午夜精品久久 | 国产精品美女www爽爽爽视频 | 亚洲精品一区二区三区蜜桃久 | 久久成人国产精品 | 精品一区二区三区在线视频 | 日韩中文一区二区三区 | 国产一区二区三区视频在线观看 | 成人在线精品视频 | 亚洲欧美日本在线 | 亚洲精品精品 | 欧美一区二区免费视频 | 91精品国产91久久久久久 | 中文字幕亚洲专区 | 在线观看国产h | 久久成人一区 | 天天操天天拍 | 一区二区三区视频 | 精品国产一级 | 黄色片av| 成人二区| 欧美一级二级三级视频 | 成人亚洲| 日韩在线免费视频 | 天天夜天天操 | 亚洲 一区| 国产视频日韩 |