天天看點

【Java常用架構精講4】一文搞懂logback系統日志工具(附實戰代碼)

作者:老K玩代碼

Hello,大家好。這裡是老K分享的全網最完整的Java系列教程。

程式員的維護調試都離不開系統日志,常用的系統日志工具包有log4j和logback。

本期我們分享的是logback這個工具包。

不過,logback和log4j之間有着千絲萬縷的聯系 ,這點我們之後再講。

這次先來看看logback。

【Java常用架構精講4】一文搞懂logback系統日志工具(附實戰代碼)

一、準備工作

1. pom.xml

在IDEA中建立maven項目後,第一步就是配置pom檔案,我們這裡主要展示需要導入的依賴,maven的其它配置可以參考我之前的文章,此處有傳送門:《Java項目工程管理神器,建構架構必用 | Java常用架構精講(二)》

<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.1</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.4.5</version>
    </dependency>
</dependencies>           
  • mybatis就是一個持久層架構,用來簡化調用資料庫資料的流程,也是本次demo的應用場景;
  • mysql-connector-java是mysql對應java的接口,是java調用mysql所必須的依賴;
  • junit是最常用的測試架構,在測試用例中運作代碼是一個成熟的習慣;
  • logback-classic是logback工具包中的核心包,也是我們今天介紹的主要内容。

2. 配置MyBatis

本次實戰demo,我們會基于Mybatis的應用場景,是以我們需要配置一些關于MyBatis的設定:

關于MyBatis相關的知識,本例隻是點到為止,要了解Mybatis系統知識的 或 對本例中MyBatis有不了解的,可以移步到我直接介紹MyBatis的文章:《MyBatis精講(一)MyBatis基礎配置及持久層連接配接建立代碼實戰)》

配置mybatis-config.xml:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="True"/>
    </settings>
    <environments default="dev">
        <environment id="dev">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url"
                          value="jdbc:mysql://localhost:3306/javasql?useUnicode=true&characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
</configuration>           
  • 上述内容為mybatis的基本配置,存儲路徑和各個标簽的意義就不贅述了,有需要的可以到我之前寫的文章檢視。

3. 建立資料庫

這個步驟不一定要和我的内容一緻,但為了達到比較好的示範效果,大家可以在自己的資料庫中導入以下sql語句:

DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee`  (
  `id` int UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `depart` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `salary` decimal(10, 2) NOT NULL,
  `age` int NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

DROP TABLE IF EXISTS `department`;
CREATE TABLE `department`  (
  `did` int UNSIGNED NOT NULL AUTO_INCREMENT,
  `depart` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `member` int NULL DEFAULT NULL,
  PRIMARY KEY (`did`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

INSERT INTO `employee` VALUES (5001, '趙乾', '銷售部', 6000.00, 28);
INSERT INTO `employee` VALUES (5002, '孫禮', '銷售部', 7000.00, 34);
INSERT INTO `employee` VALUES (6001, '周武', '技術部', 6500.00, 27);
INSERT INTO `employee` VALUES (6002, '鄭望', '技術部', 7500.00, 40);

INSERT INTO `department` VALUES (1, '銷售部', 5);
INSERT INTO `department` VALUES (2, '技術部', 6);           

4. 編寫測試用例

最後一步是編寫測試用例,一般是放置在./test/java/路徑下。

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.Reader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class MyBatisTest {
    @Test
    public void testSelect() throws IOException {
        Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession sqlSession = null;
        try {
            sqlSession = sqlSessionFactory.openSession();
            Connection connection = sqlSession.getConnection();
            String sql = "select * from employee order by id desc limit 10";
            PreparedStatement stmt = connection.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                System.out.println(rs.getString("name"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
}           
  • 上述測試用例代碼,是MyBatis工具的标準寫法,沒有展開介紹的知識點,有需要可以翻看之前的文章,相關連結:《MyBatis精講(一)MyBatis基礎配置及持久層連接配接建立代碼實戰)》

二、第一次嘗試

1. MyBatis的預設日志

有了上述的準備,我們并且在pom.xml裡配置好logback依賴,這時候運作測試用例,就能看到logging日志在console裡輸出了,内容如下:

17:26:02.931 [main] DEBUG org.apache.ibatis.logging.LogFactory - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
17:26:02.936 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
17:26:02.936 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
17:26:02.936 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
17:26:02.936 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
17:26:02.970 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Opening JDBC Connection
Sat Dec 03 17:26:03 CST 2022 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
17:26:03.371 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - Created connection 1497845528.
17:26:03.371 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@59474f18]
鄭望
周武
孫禮
趙乾
17:26:03.378 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@59474f18]
17:26:03.378 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@59474f18]
17:26:03.378 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - Returned connection 1497845528 to pool.           

2. 自定義日志格式

以上是MyBatis運作後的預設日志格式,如果有需要調整日志格式,可以通過在./src/main/resources/路徑下建立logback.xml後進行設定。

以下是标準化配置代碼:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd} [%thread] %-3level %logger{12} %msg%n</pattern>
        </encoder>
    </appender>
    <root level="debug">
        <appender-ref ref="console"/>
    </root>
</configuration>           
  • <xml>、<configuration>是标準化标簽,不作介紹了;
  • <appender>是輸出源設定,其子标簽<encoder>是設定編碼資訊,<pattern>就是用來設定日志格式模闆的;
  • <pattern>就是用來設定日志格式模闆的,模闆文法會在後續内容中介紹;
  • <root>中的level是用來設定輸出級别的,後續也會進行介紹;
  • <appender-ref>中用來設定日志的輸出源,需要與<appender>标簽中的name屬性對應。

配置好上述xml檔案,再次輸出日志,結果就會變成這樣:

2022-12-03 [main] DEBUG o.a.i.l.LogFactory Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
2022-12-03 [main] DEBUG o.a.i.d.p.PooledDataSource PooledDataSource forcefully closed/removed all connections.
2022-12-03 [main] DEBUG o.a.i.d.p.PooledDataSource PooledDataSource forcefully closed/removed all connections.
2022-12-03 [main] DEBUG o.a.i.d.p.PooledDataSource PooledDataSource forcefully closed/removed all connections.
2022-12-03 [main] DEBUG o.a.i.d.p.PooledDataSource PooledDataSource forcefully closed/removed all connections.
2022-12-03 [main] DEBUG o.a.i.t.j.JdbcTransaction Opening JDBC Connection
Sat Dec 03 17:39:08 CST 2022 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
2022-12-03 [main] DEBUG o.a.i.d.p.PooledDataSource Created connection 1431467659.
2022-12-03 [main] DEBUG o.a.i.t.j.JdbcTransaction Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@5552768b]
鄭望
周武
孫禮
趙乾
2022-12-03 [main] DEBUG o.a.i.t.j.JdbcTransaction Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@5552768b]
2022-12-03 [main] DEBUG o.a.i.t.j.JdbcTransaction Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@5552768b]
2022-12-03 [main] DEBUG o.a.i.d.p.PooledDataSource Returned connection 1431467659 to pool.           

經過上述設定,日志開頭變成了日期,而執行位置logger被裁剪了,父目錄用首字母表示了。

3. 模闆文法

基礎文法是%command{parameter}。

  • 變量是通過%加指令符的格式實作的;
  • 通過在變量名後面添加{}加參數的形式,設定變量的表現現實;
  • {}和參數不是必須的。

以上例中的文法為例,對其變量進行說明:

%d{yyyy-MM-dd} [%thread] %-5level %logger{12} %msg%n

指令符 輸出内容 說明
%d 日期時間 可以設定時間格式:y/年、M/月、d/日、H/時、m/分、s/秒、S/毫秒等
%thread 目前線程 反應目前所線上程
%-5level 設定輸出級别 此處-5表示對其格式為5字元。輸出級别有:error/錯誤、warn/警報、info/資訊、debug/調試、trace/追蹤,優先級從高到低。
%logger 代碼執行位置 反應目前語句所在檔案路徑,參數中的數字是輸出字元串長度上限,超過上限則父目錄名以首字母表示
%msg 日志内容
%n 換行符

三、調用lagback

以上是在利用MyBatis預設配置,輸出log日志的效果,下面我們提供一個demo,教你如何編寫自己的日志内容:

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

public class LogbackTest {

    public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(LogbackTest.class);
        logger.info("Hello World");
    }
}           
  • slf4j是logback的依賴,maven配置好logback後,會自動下載下傳安裝slf4j;
  • Logger是日志輸出執行個體,可以由LoggerFactory生成;
  • 通過調用Logger的info方法,可以輸出INFO級别的日志;
  • 除了info,Logger還有error、warn、debug、trace等方法,可以調用相應級别的輸出;

上述代碼運作後得到的結果是:

2022-12-03 [main] INFO  LogbackTest Hello World           

您可以參考上例執行個體化一個Logger,然後在你程式需要的位置,通過logger的API方法輸出指定級别的日志。

以上,就是我們的常用系統日志工具logback的全部内容了。

本期的内容較多,建議可以收藏這篇文章,多讀幾遍慢慢消化。

如果你對老K分享的内容有任何疑問,歡迎随時在評論區留言或者私信我。

正在學習的小夥伴記得給老K一個贊哦,你的支援是我持續輸出課程内容最大的動力!

【Java常用架構精講4】一文搞懂logback系統日志工具(附實戰代碼)

閱讀推薦

我也分享過其他關于如何學習Java的文章,有需要的小夥伴可以點選下方連結擷取:

《IT大佬推薦!學習Java的最優路徑 分享多個階段的學習資源 建議收藏》

結束語

我是專注于開發領域的@老K玩代碼,會持續生産關于如何學習程式設計語言的優質内容。

如果你想學習Java程式設計,或者想精進你的Java程式設計能力,可以關注我。

如果你對開發、程式設計有任何疑問或者有想了解的内容,而我暫時沒有寫到的,也歡迎随時來找我聊聊。

【Java常用架構精講4】一文搞懂logback系統日志工具(附實戰代碼)

#頭條創作挑戰賽#

繼續閱讀