<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          居然還有人在用 System.out.println打日志的嗎?

          共 3438字,需瀏覽 7分鐘

           ·

          2020-10-21 10:21

          點擊上方藍色“程序猿DD”,選擇“設(shè)為星標”

          回復(fù)“資源”獲取獨家整理的學(xué)習(xí)資料!

          作者 |?雨爾辰辰

          來源 |?my.oschina.net/yuchener/blog/4658516
          1024 致敬極客精神,我們有一個3天的秘境邀請!

          1、日志框架

          小張;開發(fā)一個大型系統(tǒng): 1、System.out.println("");將關(guān)鍵數(shù)據(jù)打印在控制臺;去掉?寫在一個文件?2、框架來記錄系統(tǒng)的一些運行時信息;日志框架 ;zhanglogging.jar;3、高大上的幾個功能?異步模式?自動歸檔?xxxx?zhanglogging-good.jar?4、將以前框架卸下來?換上新的框架,重新修改之前相關(guān)的API;zhanglogging-prefect.jar;5、JDBC---數(shù)據(jù)庫驅(qū)動;寫了一個統(tǒng)一的接口層;日志門面(日志的一個抽象層);logging-abstract.jar;給項目中導(dǎo)入具體的日志實現(xiàn)就行了;我們之前的日志框架都是實現(xiàn)的抽象層;

          「市面上的日志框架:」

          JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j....

          日志門面 (日志的抽象層)日志實現(xiàn)
          JCL(Jakarta Commons Logging) SLF4j(Simple Logging Facade for Java)?「jboss-logging」Log4j JUL(java.util.logging) Log4j2?「Logback」

          左邊選一個門面(抽象層)、右邊來選一個實現(xiàn);

          日志門面:SLF4J;

          日子實現(xiàn):Logback;

          Spring boot:底層是Spring框架,Spring框架默認是用JCL;

          「Spring boot選用SLF4J和logback;」

          2. SLF4J 使用

          「1、如何在系統(tǒng)中使用SLF4j ?https://www.slf4j.org」

          以后開發(fā)的時候,日志記錄方法的調(diào)用,不應(yīng)該來直接調(diào)用日志的實現(xiàn)類,而是調(diào)用日志抽象層里面的方法;給系統(tǒng)里面導(dǎo)入slf4j的jar和logback的實現(xiàn)jar。

          import?org.slf4j.Logger;
          import?org.slf4j.LoggerFactory;
          public?class?HelloWorld?{
          ??public?static?void?main(String[]?args)?{
          ????Logger?logger?=?LoggerFactory.getLogger(HelloWorld.class);
          ????logger.info("Hello?World");
          ??}
          }

          「圖示:」

          每一個日志的實現(xiàn)框架都有自己的配置文件,使用slf4j以后,「配置文件還是做成日志實現(xiàn)框架自己本身的配置文件;」

          「2. 遺留問題」

          a(slf4j+logback): Spring(commons-logging)、Hibernate(jboss-logging)、MyBatis、xxxx

          統(tǒng)一日志記錄,即使是別的框架和我一起統(tǒng)一使用slf4j進行輸出?

          「如何讓系統(tǒng)中所有的日志都統(tǒng)一到slf4j:」

          「1.將系統(tǒng)中其他日志框架先排除出去;」

          「2.用中間包來替換原有的日志框架;」

          「3.我們導(dǎo)入slf4j其他的實現(xiàn);」

          3. SpringBoot 日志關(guān)系

          <dependency>????????
          ??<groupId>org.springframework.bootgroupId>????????????
          ??<artifactId>spring‐boot‐starterartifactId>????????????
          dependency>?

          SpringBoot使用它來做日志功能:

          <dependency>????
          ??<groupId>org.springframework.bootgroupId>????????????
          ??<artifactId>spring‐boot‐starter‐loggingartifactId>????????????
          dependency>?

          「底層依賴關(guān)系:」

          「總結(jié):」

          1)、SpringBoot底層也是使用slf4j+logback的方式進行日志記錄。

          2)、SpringBoot也把其他的日志都替換成了slf4j;

          3)、中間替換包?

          @SuppressWarnings("rawtypes")
          public?abstract?class?LogFactory?{
          ????static?String?UNSUPPORTED_OPERATION_IN_JCL_OVER_SLF4J?=
          "http://www.slf4j.org/codes.html#unsupported_operation_in_jcl_over_slf4j";
          ????static?LogFactory?logFactory?=?new?SLF4JLogFactory();
          1. 、 如果我們要引用其他框架?一定要把這個框架的默認日志依賴移除掉?

          Spring框架用的是commons-logging;

          <dependency>????????
          <groupId>org.springframeworkgroupId>????????????
          <artifactId>spring‐coreartifactId>????????????
          <exclusions>????????????
          <exclusion>????????????????
          <groupId>commons‐logginggroupId>????????????????????
          <artifactId>commons‐loggingartifactId>????????????????????
          exclusion>????????????????
          exclusions>????????????
          dependency>?

          「SpringBoot能自動適配所有的日志,而且底層使用slf4j+logback的方式記錄日志,引入其他框架的時候,只需要把這個框架依賴的日志框架排除掉即可;」

          4. 日志的使用

          「1.默認配置」

          「SpringBoot默認幫我們配置好了日志;」

          //記錄器????
          Logger?logger?=?LoggerFactory.getLogger(getClass());????
          @Test????
          public?void?contextLoads()?{????
          //System.out.println();????????
          //日志的級別;????????
          //由低到高???trace
          //可以調(diào)整輸出的日志級別;日志就只會在這個級別以以后的高級別生效????????
          logger.trace("這是trace日志...");????????
          logger.debug("這是debug日志...");????????
          //SpringBoot默認給我們使用的是info級別的,沒有指定級別的就用SpringBoot默認規(guī)定的級別;root
          級別
          ???????
          logger.info("這是info日志...");????????
          logger.warn("這是warn日志...");????????
          logger.error("這是error日志...");????????
          }?

          「日志輸出格式:」%d表示日期時間,
          %thread表示線程名,
          %‐5level:級別從左顯示5個字符寬度
          %logger{50} 表示logger名字最長50個字符,否則按照句點分割。
          %msg:日志消息,
          %n是換行符
          ‐‐> %d{yyyy‐MM‐dd HH:mm:ss.SSS} [%thread] %‐5level %logger{50} ‐ %msg%n

          「Spring Boot修改日志的默認配置」

          logging.level.com.atguigu=trace
          #logging.path=
          #?不指定路徑在當前項目下生成springboot.log日志
          #?可以指定完整的路徑;
          #logging.file=G:/springboot.log
          #?在當前磁盤的根路徑下創(chuàng)建spring文件夾和里面的log文件夾;使用 spring.log 作為默認文件
          logging.path=/spring/log
          #??在控制臺輸出的日志的格式
          logging.pattern.console=%d{yyyy‐MM‐dd}?[%thread]?%‐5level?%logger{50}?‐?%msg%n
          #?指定文件中日志輸出的格式
          logging.pattern.file=%d{yyyy‐MM‐dd}?===?[%thread]?===?%‐5level?===?%logger{50}?====?%msg%n
          logging.filelogging.pathExampleDescription
          (none)(none)
          只在控制臺輸出
          指定文件名(none)my.log輸出日志到my.log文件
          (none)指定目錄/var/log輸出到指定目錄的 spring.log 文件中

          「2. 指定配置」

          給類路徑下放上每個日志框架自己的配置文件即可;SpringBoot就不使用他默認配置的了。

          Logging SystemCustomization
          Logbacklogback-spring.xml , ?logback-spring.groovy , ?logback.xml or logback.groovy
          Log4j2log4j2-spring.xml or ?log4j2.xml
          JDK (Java Util Logging)logging.properties

          logback.xml:直接就被日志框架識別了;

          logback-spring.xml:日志框架就不直接加載日志的配置項,由SpringBoot解析日志配置,可以使用SpringBoot的高級Profile功能。

          <springProfile?name="staging">
          ????<!‐‐?configuration?to?be?enabled?when?the?"staging"?profile?is?active?‐‐>
          ???可以指定某段配置只在某個環(huán)境下生效??
          springProfile>
          <appender?name="stdout"?class="ch.qos.logback.core.ConsoleAppender">
          ????????<!‐‐
          ????????日志輸出格式:
          %d表示日期時間,????????????
          %thread表示線程名,????????????
          %‐5level:級別從左顯示5個字符寬度????????????
          %logger{50}?表示logger名字最長50個字符,否則按照句點分割。?????????????
          %msg:日志消息,????????????
          %n是換行符????????????
          ????????‐‐>

          ????????<layout?class="ch.qos.logback.classic.PatternLayout">
          ????????????<springProfile?name="dev">
          ????????????????<pattern>%d{yyyy‐MM‐dd?HH:mm:ss.SSS}?‐‐‐‐>?[%thread]?‐‐‐>?%‐5level
          %logger{50}?‐?%msg%npattern>
          ????????????springProfile>
          ????????????<springProfile?name="!dev">
          ????????????????<pattern>%d{yyyy‐MM‐dd?HH:mm:ss.SSS}?====?[%thread]?====?%‐5level
          %logger{50}?‐?%msg%npattern>
          ????????????springProfile>
          ????????layout>
          ????appender>

          如果使用logback.xml作為日志配置文件,還要使用profile功能,會有以下錯誤

          no?applicable?action?for?[springProfile]

          5. 切換日志框架

          可以按照slf4j的日志適配圖,進行相關(guān)的切換;

          slf4j+log4j的方式:

          dependency>
          ??<groupId>org.springframework.bootgroupId>
          ??<artifactId>spring‐boot‐starter‐webartifactId>
          ??<exclusions>
          ????<exclusion>
          ??????<artifactId>logback‐classicartifactId>
          ??????<groupId>ch.qos.logbackgroupId>
          ????exclusion>
          ????<exclusion>
          ??????<artifactId>log4j‐over‐slf4jartifactId>
          ??????<groupId>org.slf4jgroupId>
          ????exclusion>
          ??exclusions>
          dependency>
          <dependency>
          ??<groupId>org.slf4jgroupId>
          ??<artifactId>slf4j‐log4j12artifactId>
          dependency>

          「切換為log4j2」

          <dependency>
          ????<groupId>org.springframework.bootgroupId>
          ????<artifactId>spring‐boot‐starter‐webartifactId>
          ????<exclusions>
          ????<exclusion>
          ???????<artifactId>spring‐boot‐starter‐loggingartifactId>
          ??????<groupId>org.springframework.bootgroupId>
          ????exclusion>
          ??exclusions>
          dependency>
          <dependency>
          ??<groupId>org.springframework.bootgroupId>
          ??<artifactId>spring‐boot‐starter‐log4j2artifactId>
          dependency>


          往期推薦

          不錯的秒殺系統(tǒng)架構(gòu)分析與實戰(zhàn)!

          LinkedList 真的是查找慢增刪快?

          盤點幾個開源的高仿項目,B站最像~

          一個讓你敲代碼的同時,找回童年樂趣的 IntelliJ 插件

          完美,竟然用一個腳本就把系統(tǒng)升級到https了,且永久免費!


          掃一掃,關(guān)注我

          一起學(xué)習(xí),一起進步

          每周贈書,福利不斷


          深度內(nèi)容

          推薦加入


          最近熱門內(nèi)容回顧? ?#社會人系列

          瀏覽 61
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费看日逼视频的网站 | 精品无码色哟哟一区 | 内射视频网站免费观看 | 日韩三级片在线看 | 激情乱伦俺也去 |