<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 了!!

          共 3411字,需瀏覽 7分鐘

           ·

          2020-10-14 04:10

          來(lái)源:my.oschina.net/yuchener/blog/4658516

          1、日志框架

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


          JCL(Jakarta Commons Logging) SLF4j(Simple Logging Facade for Java) 「jboss-logging」
          Log4j JUL(java.util.logging) Log4j2 「Logback」
          左邊選一個(gè)門(mén)面(抽象層)、右邊來(lái)選一個(gè)實(shí)現(xiàn);
          日志門(mén)面:SLF4J;
          日子實(shí)現(xiàn):Logback;
          Spring boot:底層是Spring框架,Spring框架默認(rèn)是用JCL;
          「Spring boot選用SLF4J和logback;」

          2. SLF4J 使用

          「1、如何在系統(tǒng)中使用SLF4j ?https://www.slf4j.org」
          以后開(kāi)發(fā)的時(shí)候,日志記錄方法的調(diào)用,不應(yīng)該來(lái)直接調(diào)用日志的實(shí)現(xiàn)類,而是調(diào)用日志抽象層里面的方法;給系統(tǒng)里面導(dǎo)入slf4j的jar和logback的實(shí)現(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");
          ??}
          }
          「圖示:」
          每一個(gè)日志的實(shí)現(xiàn)框架都有自己的配置文件,使用slf4j以后,「配置文件還是做成日志實(shí)現(xiàn)框架自己本身的配置文件;」
          「2. 遺留問(wèn)題」
          a(slf4j+logback): Spring(commons-logging)、Hibernate(jboss-logging)、MyBatis、xxxx
          統(tǒng)一日志記錄,即使是別的框架和我一起統(tǒng)一使用slf4j進(jìn)行輸出?
          「如何讓系統(tǒng)中所有的日志都統(tǒng)一到slf4j:」
          「1.將系統(tǒng)中其他日志框架先排除出去;」
          「2.用中間包來(lái)替換原有的日志框架;」
          「3.我們導(dǎo)入slf4j其他的實(shí)現(xiàn);」

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

          <dependency>????????
          ??<groupId>org.springframework.bootgroupId>????????????
          ??<artifactId>spring‐boot‐starterartifactId>????????????
          dependency>?
          SpringBoot使用它來(lái)做日志功能:
          <dependency>????
          ??<groupId>org.springframework.bootgroupId>????????????
          ??<artifactId>spring‐boot‐starter‐loggingartifactId>????????????
          dependency>?
          「底層依賴關(guān)系:」
          「總結(jié):」
          1)、SpringBoot底層也是使用slf4j+logback的方式進(jìn)行日志記錄。
          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. 、 如果我們要引用其他框架?一定要把這個(gè)框架的默認(rèn)日志依賴移除掉?
          Spring框架用的是commons-logging;
          <dependency>????????
          <groupId>org.springframeworkgroupId>????????????
          <artifactId>spring‐coreartifactId>????????????
          <exclusions>????????????
          <exclusion>????????????????
          <groupId>commons‐logginggroupId>????????????????????
          <artifactId>commons‐loggingartifactId>????????????????????
          exclusion>????????????????
          exclusions>????????????
          dependency>?
          「SpringBoot能自動(dòng)適配所有的日志,而且底層使用slf4j+logback的方式記錄日志,引入其他框架的時(shí)候,只需要把這個(gè)框架依賴的日志框架排除掉即可;」

          4. 日志的使用

          「1.默認(rèn)配置」
          「SpringBoot默認(rèn)幫我們配置好了日志;」
          //記錄器????
          Logger?logger?=?LoggerFactory.getLogger(getClass());????
          @Test????
          public?void?contextLoads()?{????
          //System.out.println();????????
          //日志的級(jí)別;????????
          //由低到高???trace
          //可以調(diào)整輸出的日志級(jí)別;日志就只會(huì)在這個(gè)級(jí)別以以后的高級(jí)別生效????????
          logger.trace("這是trace日志...");????????
          logger.debug("這是debug日志...");????????
          //SpringBoot默認(rèn)給我們使用的是info級(jí)別的,沒(méi)有指定級(jí)別的就用SpringBoot默認(rèn)規(guī)定的級(jí)別;root
          級(jí)別
          ???????
          logger.info("這是info日志...");????????
          logger.warn("這是warn日志...");????????
          logger.error("這是error日志...");????????
          }?
          「日志輸出格式:」%d表示日期時(shí)間,
          %thread表示線程名,
          %‐5level:級(jí)別從左顯示5個(gè)字符寬度
          %logger{50} 表示logger名字最長(zhǎng)50個(gè)字符,否則按照句點(diǎn)分割。
          %msg:日志消息,
          %n是換行符
          ‐‐> %d{yyyy‐MM‐dd HH:mm:ss.SSS} [%thread] %‐5level %logger{50} ‐ %msg%n
          「Spring Boot修改日志的默認(rèn)配置」
          logging.level.com.atguigu=trace
          #logging.path=
          #?不指定路徑在當(dāng)前項(xiàng)目下生成springboot.log日志
          #?可以指定完整的路徑;
          #logging.file=G:/springboot.log
          #?在當(dāng)前磁盤(pán)的根路徑下創(chuàng)建spring文件夾和里面的log文件夾;使用 spring.log 作為默認(rèn)文件
          logging.path=/spring/log
          #??在控制臺(tái)輸出的日志的格式
          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.file
          logging.path
          Example
          Description




          (none)
          (none)

          只在控制臺(tái)輸出
          指定文件名
          (none)
          my.log
          輸出日志到my.log文件
          (none)
          指定目錄
          /var/log
          輸出到指定目錄的 spring.log 文件中
          「2. 指定配置」
          給類路徑下放上每個(gè)日志框架自己的配置文件即可;SpringBoot就不使用他默認(rèn)配置的了。
          Logging System
          Customization


          Logback
          logback-spring.xml , ?logback-spring.groovy , ?logback.xml or logback.groovy
          Log4j2
          log4j2-spring.xml or ?log4j2.xml
          JDK (Java Util Logging)
          logging.properties
          logback.xml:直接就被日志框架識(shí)別了;
          logback-spring.xml:日志框架就不直接加載日志的配置項(xiàng),由SpringBoot解析日志配置,可以使用SpringBoot的高級(jí)Profile功能。
          <springProfile?name="staging">
          ????<!‐‐?configuration?to?be?enabled?when?the?"staging"?profile?is?active?‐‐>
          ???可以指定某段配置只在某個(gè)環(huán)境下生效??
          springProfile>
          <appender?name="stdout"?class="ch.qos.logback.core.ConsoleAppender">
          ????????<!‐‐
          ????????日志輸出格式:
          %d表示日期時(shí)間,????????????
          %thread表示線程名,????????????
          %‐5level:級(jí)別從左顯示5個(gè)字符寬度????????????
          %logger{50}?表示logger名字最長(zhǎng)50個(gè)字符,否則按照句點(diǎn)分割。?????????????
          %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功能,會(huì)有以下錯(cuò)誤
          no?applicable?action?for?[springProfile]

          5. 切換日志框架

          可以按照slf4j的日志適配圖,進(jìn)行相關(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>


          最后給大家送下福利,大家可以關(guān)注Java后端編程公眾號(hào),在后臺(tái)回復(fù)?“666”可以獲取一份我整理的最新Java編程學(xué)習(xí)資料。
          (END)
          最近好文分享
          程序員買(mǎi)房前后對(duì)比,看完后已哭瞎...
          互聯(lián)網(wǎng)相親,是怎么收割單身男女的?
          真臉紅了!2020年輕人性愛(ài)數(shù)據(jù)報(bào)告
          2020最新Java學(xué)習(xí)路線圖,附配套視頻!
          干掉Navicat,推薦一款免費(fèi)的數(shù)據(jù)庫(kù)管理工具!
          更多請(qǐng)掃碼關(guān)注?? Java后端編程

          一個(gè)分享Java后端技術(shù)干貨的公眾號(hào)

          歡迎大家在看、轉(zhuǎn)發(fā)

          瀏覽 48
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  A片视频免费观看 | 苍井空久久 | 天天撸日日干 | 中文字幕第一页在线播放 | 操逼操逼操逼操逼操逼 |