java之日志管理(非原創)


一. 為什么要使用日志

二. 常見日志框架介紹

三. Logback+SLF4J實戰

四. 項目源碼下載

五. 參考文章

 

一. 為什么要使用日志

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存放位置

 

代碼如下

<!-- 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> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.dir}/${APP_Name}/monitor/monitor.%d{yyyy-MM-dd}-%i.log</fileNamePattern> <maxHistory>30</maxHistory> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>10MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> </appender> <logger name="org" level="INFO" /> <!--將org包下面的所有日志級別設為了ERROR --> <logger name="monitor" additivity="false" level="DEBUG" /> <logger name="monitor" additivity="false" level="DEBUG"> <appender-ref ref="MONITOR" /> </logger> <root level="DEBUG"> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE_INFO" /> <appender-ref ref="FILE_DEBUG" /> //上線時 這個需注釋掉,debug級別的日志 <appender-ref ref="FILE_ERROR" /> </root> </configuration> 

3. 測試代碼

public class TestLogback { private final static Logger logger = LoggerFactory.getLogger(TestLogback.class); public static void main(String[] args) { logger.error("測試出錯了"); logger.info("測試出錯了"); logger.debug("測試出錯了"); } public static void testErr() { String[] name = {"1", "2", "3"}; try { System.out.println(name[5]); } catch (Exception e) { e.printStackTrace(); logger.error("出現異常:"+e); logger.error("數據越界了"); } } } 

4. 運行結果

 
 
 

四. 項目源碼下載

鏈接:https://pan.baidu.com/s/1pzxMlDKl92AlamO8cg9jFA
提取碼:rhgu

五. 參考文章

https://www.cnblogs.com/baizhanshi/p/7911123.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM