天天看點

java之日志管理(非原創)

一. 為什麼要使用日志

二. 常見日志架構介紹

三. Logback+SLF4J實戰

四. 項目源碼下載下傳

五. 參考文章

java之日志管理(非原創)

一. 為什麼要使用日志

1. 對IT安全至關重要

  當您使用強大的日志管理軟體自動觸發以保護您的系統時,您已經赢得了一半的戰鬥,以確定您的IT基礎設施安全。某些日志管理工具具有阻止可疑IP位址,删除帳戶,甚至完全關閉顯示受感染迹象的計算機的内置功能。

  此外,有效的日志管理工具可以實作并簡化您的入侵檢測系統。是以,當您的入侵檢測系統發出惡意活動信号時,您可以快速檢查由日志管理工具生成和維護的日志檔案。日志檔案可以進一步提供重要線索,便于故障排除以幫助您。

2. 幫助企業更有效地營運

  使用日志管理工具的直接好處之一是它可以最大限度地減少生産中的停機時間。日志管理工具是解決方案帶中的主要力量,可以使您智能地掌握與生産相關的可能問題。它允許您知道什麼時候重要的事情已經改變或改變。反過來,這會對您的技術平穩運作以及整個業務流程産生重大影響。

  此外,有效的日志管理對于滿足合規性也很重要。某些合規性要求您監控和記錄每個應用程式以及IT基礎架構中的系統的事件。

3. 找到問題的根源

  使用複雜的日志管理工具維護日志檔案允許進行根本原因分析,稍後便于調試。你可以避免艱苦的手工努力,試圖弄清楚什麼是軌道,以及究竟是什麼導緻了一個可能的問題。這進一步使您在處理所有類型的問題時越來越有效。

  您可以浏覽日志檔案,甚至可以使用該工具發現任何違規行為。這有助于使系統恢複正常工作。日志管理工具可幫助您更深入地識别現代組織遇到的威脅。

二. 常見日志架構介紹

1. JDKLog

  JDKLog是JDK官方提供的一個記錄日志的方式,直接在JDK中就可以使用

import java.util.logging.Logger;
 
/****
 ** JDKLog Demo
 **/
public class JDKLog
{
    public static void main( String[] args )
    {
        Logger logger = Logger.getLogger("JDKLog");
        logger.info("Hello World.");
    }
}
           

溫馨提示:JDKLog 的有點是使用非常簡單,直接在 JDK 中就可以使用。但 JDKLog 功能比較太過于簡單,不支援占位符顯示,拓展性比較差,是以現在用的人也很少

2. Log4J

  Log4J 是 Apache 的一個日志開源架構,有多個分級(DEBUG/INFO/WARN/ERROR)記錄級别,可以很好地将不同日志級别的日志分開記錄,極大地友善了日志的檢視。

3. LogBack

  LogBack 其實可以說是 Log4J 的進化版,因為它們兩個都是同一個人(Ceki Gülcü)設計的開源日志元件。LogBack 除了具備 Log4j 的所有優點之外,還解決了 Log4J 不能使用占位符的問題。

4. SLF4J:擴充卡

  JDKLog、Log4J、LogBack 這幾個常用的日志記錄架構,它們都有各自的優缺點,适合在不同的場景下使用。可能簡單的項目直接用 JDKLog 就可以了,而複雜的項目需要用上 Log4J。

  很多時候我們做項目都是從簡單到複雜,也就是我們很可能一開始使用的是 JDKLog,之後業務複雜了需要使用 Log4J,這時候我們如何将原來寫好的日志用新的日志架構輸出呢?

  一個最死闆的方法就是一行行代碼修改,把之前用 JDKLog 的日志代碼全部修改成 Log4J 的日志接口。但是這種方式不僅效率低下,而且做的工作都是重複性的工作,這怎麼能忍呢。

  正是因為在實際的項目應用中,有時候可能會從一個日志架構切換到另外一個日志架構的需求,這時候往往需要在代碼上進行很大的改動。為了避免切換日志元件時要改動代碼,這時候一個叫做 SLF4J(Simple Logging Facade for Java,即Java簡單日志記錄接口集)的東西出現了。

  SLF4J(Simple Logging Facade for Java,即Java簡單日志記錄接口集)是一個日志的接口規範,它對使用者提供了統一的日志接口,屏蔽了不同日志元件的差異。這樣我們在編寫代碼的時候隻需要看 SLF4J 這個接口文檔即可,不需要去理會不同日之架構的差別。而當我們需要更換日志元件的時候,我們隻需要更換一個具體的日志元件Jar包就可以了。

三. Logback+SLF4J實戰

1. maven添加依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.wxc</groupId>
    <artifactId>testlog</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>

        <!-- 添加slf4j日志api -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.20</version>
        </dependency>
        <!-- 添加logback-classic依賴 -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
        <!-- 添加logback-core依賴 -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.2.3</version>
        </dependency>

    </dependencies>

</project>
           

2. 在項目的資源檔案中添加logback.xml代碼

xml存放位置

java之日志管理(非原創)

代碼如下

<!-- ch.qos.logback.classic.filter.ThresholdFilter  臨界值過濾器, 過濾掉低于指定臨界值的日志
ch.qos.logback.classic.filter.LevelFilter   将過濾器的日志級别配置為INFO,所有INFO級别的日志交給appender處理,非INFO級别的日志,被過濾掉。 -->
<configuration>
    <property name="APP_Name" value="testlog" /> //這裡為此項目的日志檔案夾名
    <property name="log.dir" value="F:/home"></property> //這裡為日志的存儲位址
    <timestamp key="bySecond" datePattern="yyyyMMdd HHmmss"/>
    <contextName>${APP_Name}</contextName>
 
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{85} [%file:%line] - %msg%n</Pattern>
        </layout>
    </appender>
 
    <!-- 按日期和大小區分的滾動日志 -->
    <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{85} - %msg%n</Pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.dir}/${APP_Name}/info/info.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <maxHistory>30</maxHistory>
 
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>
 
 
    <!-- 按日期和大小區分的滾動日志 -->
    <appender name="FILE_DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 必須指定,否則不會往檔案輸出内容 -->
        <encoder>
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{85} - %msg%n</Pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
 
        <!-- 必需要指定rollingPolicy 與 triggeringPolicy 屬性   否則不會生成檔案-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.dir}/${APP_Name}/debug/debug.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <maxHistory>30</maxHistory>
 
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
 
        </rollingPolicy>
    </appender>
 
 
    <!-- error級别隻按日期滾動生成日志 -->
    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 必須指定,否則不會往檔案輸出内容 -->
        <encoder>
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{85} - %msg%n</Pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
            <!--    <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>-->
        </filter>
 
        <!-- 必需要指定rollingPolicy 與 triggeringPolicy 屬性   否則不會生成檔案-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.dir}/${APP_Name}/error/error.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <maxHistory>30</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 預設值是10MB。 -->
        <!--     <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                  <maxFileSize>5MB</maxFileSize>
            </triggeringPolicy>  -->
    </appender>
 
    <!-- 滾動記錄檔案 -->
    <appender name="MONITOR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{85} - %msg%n</Pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>