1. 程式人生 > >logback 入門教程系列-01-logback 入門使用案例

logback 入門教程系列-01-logback 入門使用案例

Logback

Logback 旨在作為流行的log4j專案的後續版本,從而恢復log4j離開的位置。

Logback旨在成為流行的log4j專案的後續版本。它由log4j的創始人CekiGülcü設計。

它建立在設計工業強度測井系統的十年經驗之上。

由此產生的產品,即 back,比所有現有的測井系統更快並且佔地面積更小,有時候是大幅度的。

同樣重要的是,logback提供了其他日誌記錄系統中缺少的獨特且非常有用的功能。

模組

Logback的體系結構足夠通用,以便在不同情況下應用。

目前,logback分為三個模組:logback-core,logback-classic和logback-access。

logback-core模組為其他兩個模組奠定了基礎。

logback-classic模組可以被同化為log4j的顯著改進版本。

此外,logback-classic本身實現了SLF4J API,因此您可以在logback和其他日誌框架(如log4j或java.util.logging(JUL))之間來回切換。

logback-access模組​​與Servlet容器(如Tomcat和Jetty)整合,以提供HTTP訪問日誌功能。

請注意,您可以在logback-core之上輕鬆構建自己的模組。

快速開始

你可以在 logback-learn-base 下載原始碼。

專案結構

│  pom.xml
│
└─src
    └─main
        ├─java
        │  └─com
        │      └─github
        │          └─houbb
        │              └─logback
        │                  └─learn
        │                      └─base
        │                              Main.java
        │
        └─resources
                logback.xml

jar 的引入

本專案使用 Maven 管理 Jar

  • pom.xml

引入 logback

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.0.13</version>
</dependency>
  • logback.xml

相關配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
        </layout>
    </appender>

    <logger name="com.github.houbb.logback.learn.base" level="TRACE"/>

    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>

</configuration>

注意:com.github.houbb.logback.learn.base 這個是我測試的對應包,在測試時你可以根據自己需要進行調整。

  • Main.java

最簡單的方法,模擬使用日誌。

package com.github.houbb.logback.learn.base;

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

/**
 * @author binbin.hou
 * @date 2018/11/19 11:41
 */
public class Main {

    private static final Logger LOG = LoggerFactory.getLogger(Main.class);

    public static void main(String[] args) {
        LOG.trace("Hello World!");
        LOG.debug("How are you today?");
        LOG.info("I am fine.");
        LOG.warn("I love programming.");
        LOG.error("I am programming.");
    }

}

ps: 你會發現這裡直接使用的是 SFL4j 的介面。

日誌資訊

測試日誌資訊如下:

11:45:40,911 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
11:45:40,911 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
11:45:40,911 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/D:/github/logback-learn/logback-learn-base/target/classes/logback.xml]
11:45:40,996 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
11:45:41,012 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
11:45:41,032 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
11:45:41,148 |-WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - This appender no longer admits a layout as a sub-component, set an encoder instead.
11:45:41,148 |-WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - To ensure compatibility, wrapping your layout in LayoutWrappingEncoder.
11:45:41,148 |-WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - See also http://logback.qos.ch/codes.html#layoutInsteadOfEncoder for details
11:45:41,148 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.github.houbb.logback.learn.base] to TRACE
11:45:41,148 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG
11:45:41,148 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
11:45:41,148 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
11:45:41,148 |-INFO in [email protected] - Registering current configuration as safe fallback point

11:45:41.163 [main] TRACE c.g.houbb.logback.learn.base.Main - Hello World!
11:45:41.163 [main] DEBUG c.g.houbb.logback.learn.base.Main - How are you today?
11:45:41.163 [main] INFO  c.g.houbb.logback.learn.base.Main - I am fine.
11:45:41.163 [main] WARN  c.g.houbb.logback.learn.base.Main - I love programming.
11:45:41.163 [main] ERROR c.g.houbb.logback.learn.base.Main - I am programming.

最下面的就是我們相應的日誌資訊,上面有一些配置載入的資訊,我們後面會逐漸介紹。

特性

我們要從 log4j 切換到 logback,肯定是因為 logback 有足夠的優勢,能夠吸引我們去切換。

  • 優先於log4j進行logback的原因

Logback對log4j進行了大量改進,無論大小。它們太多了,無法詳盡地列舉。然而,這裡是從log4j切換到logback的原因的非詳盡列表。請記住,logback在概念上與log4j非常相似,因為兩個專案都是由同一個開發人員建立的。如果您已熟悉log4j,您將很快感到賓至如歸。如果你喜歡log4j,你可能會喜歡logback。

更快的實施

基於我們之前關於log4j的工作,已經重寫了logback內部,以便在某些關鍵執行路徑上執行大約十倍的速度。不僅logback元件更快,而且記憶體佔用更少。

大量的測試

Logback包含了在幾年和無數小時工作中開發的大量測試。雖然log4j也經過測試,但logback將測試帶到了完全不同的水平。在我們看來,這是優先於log4j進行logback的最重要原因。您希望您的日誌框架即使在不利條件下也能夠堅如磐石且可靠。

logback-classic本身就說SLF4J

由於logback-classic中的Logger類本身實現了SLF4J API,因此在呼叫帶有logback-classic作為底層實現的SLF4J記錄器時,會產生零開銷。此外,由於logback-classic強烈鼓勵使用SLF4J作為其客戶端API,如果需要切換到log4j或j.u.l.,可以通過將一個jar檔案替換為另一個jar檔案來實現。您無需通過SLF4J API觸控程式碼記錄。這可以大大減少切換日誌框架所涉及的工作。

廣泛的文件

Logback隨附詳細且不斷更新的文件。

XML或Groovy中的配置檔案

配置logback的傳統方法是通過XML檔案。文件中的大多數示例都使用此XML語法。

但是,從logback版本0.9.22開始,也支援用Groovy編寫的配置檔案。與XML相比,Groovy風格的配置更直觀,更一致,並且語法更短。

還有一個工具可以自動將logback.xml檔案遷移到logback.groovy。

自動重新載入配置檔案

Logback-classic可以在修改後自動重新載入其配置檔案。掃描過程快速,無爭用,並且動態擴充套件到數百個執行緒上每秒數百萬次呼叫。它在應用程式伺服器中也能很好地執行,更常見的是在JEE環境中,因為它不涉及建立單獨的掃描執行緒。

從 I/O 故障中順利恢復

Logback的FileAppender及其所有子類(包括RollingFileAppender)可以從I/O故障中正常恢復。

因此,如果檔案伺服器暫時失敗,則不再需要重新啟動應用程式以使日誌記錄再次執行。

一旦檔案伺服器恢復,相關的logback appender將從之前的錯誤狀態透明地快速恢復。

自動刪除舊的日誌存檔

通過設定TimeBasedRollingPolicy或SizeAndTimeBasedFNATP的maxHistory屬性,可以控制最大歸檔檔案數。如果您的滾動策略要求每月滾動並且您希望保留一年的日誌,只需將maxHistory屬性設定為12.將自動刪除超過12個月的存檔日誌檔案。

自動壓縮存檔的日誌檔案

RollingFileAppender可以在翻轉期間自動壓縮歸檔日誌檔案。壓縮始終以非同步方式發生,因此即使對於大型日誌檔案,也不會在壓縮期間阻止應用程式。

謹慎的模式

在謹慎模式下,在多個JVM上執行的多個FileAppender例項可以安全地寫入同一個日誌檔案。由於某些限制,謹慎模式擴充套件到RollingFileAppender。

Lilith

Lilith是一個用於logback的日誌記錄和訪問事件檢視器。

它與log4j的 chainsaw 相當,只不過Lilith設計用於處理大量的測井資料而不會退縮。

條件處理配置檔案

開發人員經常需要在針對不同環境(如開發,測試和生產)的多個logback配置檔案之間進行操作。

這些配置檔案有很多共同之處,僅在少數幾個地方有所不同。

為了避免重複,logback支援在 <if><then><else>元素的幫助下對配置檔案進行條件處理,以便單個配置檔案可以充分地針對多個環境。

過濾器

Logback提供了大量的過濾功能,遠遠超出了log4j所提供的功能。

例如,假設您在生產伺服器上部署了業務關鍵型應用程式。在處理大量事務的情況下,將日誌記錄級別設定為WARN,以便僅記錄警告和錯誤。

現在想象一下,您遇到了一個可以在生產系統上重現的錯誤,但由於這兩個環境(生產/測試)之間存在未指定的差異,因此在測試平臺上仍然難以捉摸。

使用log4j,您唯一的選擇是將生產系統上的日誌記錄級別降低到DEBUG以嘗試識別問題。不幸的是,這將產生大量的記錄資料,使分析變得困難。更重要的是,廣泛的日誌記錄會影響應用程式在生產系統上的效能。

使用logback,您可以選擇將所有使用者的日誌記錄保持在WARN級別,除了負責識別問題的一個使用者Alice。當Alice登入時,她將以DEBUG級別登入,而其他使用者可以繼續登入WARN級別。這個專長可以通過在配置檔案中新增4行XML來實現。在本手冊的相關部分中搜索MDCFilter。

SiftingAppender

SiftingAppender是一個非常多才多藝的appender。它可用於根據任何給定的執行時屬性分離(或篩選)日誌記錄。

例如,SiftingAppender可以根據使用者會話分離日誌記錄事件,以便每個使用者生成的日誌進入不同的日誌檔案,每個使用者一個日誌檔案。

堆疊跟蹤包裝資料

當logback列印異常時,堆疊跟蹤將包含打包資料。

以下是logback-demo Web應用程式生成的示例堆疊跟蹤。

14:28:48.835 [btpool0-7] INFO  c.q.l.demo.prime.PrimeAction - 99 is not a valid value
java.lang.Exception: 99 is invalid
  at ch.qos.logback.demo.prime.PrimeAction.execute(PrimeAction.java:28) [classes/:na]
  at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431) [struts-1.2.9.jar:1.2.9]
  at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236) [struts-1.2.9.jar:1.2.9]
  at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) [struts-1.2.9.jar:1.2.9]
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) [servlet-api-2.5-6.1.12.jar:6.1.12]
  at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:502) [jetty-6.1.12.jar:6.1.12]
  at ch.qos.logback.demo.UserServletFilter.doFilter(UserServletFilter.java:44) [classes/:na]
  at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115) [jetty-6.1.12.jar:6.1.12]
  at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:361) [jetty-6.1.12.jar:6.1.12]
  at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:417) [jetty-6.1.12.jar:6.1.12]
  at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) [jetty-6.1.12.jar:6.1.12]

從上面可以看出,應用程式正在使用Struts 1.2.9版,並在jetty版本6.1.12下部署。

因此,堆疊跟蹤將快速告知讀者介入異常的類以及它們所屬的包和包版本。

當您的客戶向您傳送堆疊跟蹤時,作為開發人員,您將不再需要讓他們向您傳送有關他們正在使用的軟體包版本的資訊。

該資訊將成為堆疊跟蹤的一部分。

Logback-access

Logback-access,即帶有大腦的HTTP訪問日誌記錄,是logback的一個組成部分

最後但並非最不重要的是,logback-access模組是logback發行版的一部分,它與Servlet容器(如Jetty或Tomcat)整合,以提供豐富而強大的HTTP訪問日誌功能。 由於logback-access是初始設計的一部分,因此您喜歡的所有logback-classic功能也可用於logback-access。

綜上所述

我們列出了一些優先考慮log4j的logback的原因。 鑑於logback建立在我們之前關於log4j的工作上,簡單地說,logback只是一個更好的log4j。

拓展閱讀

log4j2

slf4j

日誌最佳實踐

專案管理的哲學

當 logback 被廣泛的使用之後,版本的更迭替換就要考慮很多東西。

jdk

比如 jdk8 的使用,就通過問卷調查的形式。

Logback JDK version

我覺得這是一種很讚的方式,讓反饋從使用者的角度出發,而不只是作者本人考量。

參考資料

快速開始

how-to-setup-slf4j-and-logback-in-a-web-app-fast

logback 語法