<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] # 根節點包含的屬性 * scan:當此屬性設置為true時,配置文件如果發生改變,將會被重新加載,默認值為true。 * scanPeriod:設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan為true時,此屬性生效。默認的時間間隔為1分鐘。 * debug:當此屬性設置為true時,將打印出logback內部日志信息,實時查看logback運行狀態。默認值為false。 根節點`<configuration>`有5個子節點,下面一一會詳細介紹。 # 子節點一 `<root>` root節點是必選節點,用來指定最基礎的日志輸出級別,只有一個level屬性。 level:用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能設置為INHERITED或者同義詞NULL。 默認是DEBUG。 可以包含零個或多個元素,標識這個appender將會添加到這個loger。 ~~~ <root level="debug"> <appender-ref ref="console" /> <appender-ref ref="file" /> </root> ~~~ # 子節點二:`<contextName>` 設置上下文名稱 每個logger都關聯到logger上下文,默認上下文名稱為“default”。 但可以使用設置成其他名字,用于區分不同應用程序的記錄。 一旦設置,不能修改,可以通過`%contextName`來打印日志上下文名稱,一般來說我們不用這個屬性,可有可無。 ~~~ <contextName>logback</contextName> ~~~ ![](https://img.kancloud.cn/51/26/51265b5b3f765555692da488744de995_491x460.png) # 子節點三:`<property>`設置變量 用來定義變量值的標簽, 有兩個屬性,name和value;其中name的值是變量的名稱,value的值時變量定義的值。 通過定義的值會被插入到logger上下文中。定義變量后,可以使`"${}"`來使用變量 ~~~ <property name="logback.logdir" value="/Users/inke/dev/log/tomcat"/> <property name="logback.appname" value="app"/> ~~~ # 子節點四:`<appender>` appender用來格式化日志輸出節點,有倆個屬性name和class,class用來指定哪種輸出策略,常用就是控制臺輸出策略和文件輸出策略。 **控制臺輸出`ConsoleAppender`:** * 示例一: ~~~ <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <contextName>logback-demo</contextName> <!--輸出到控制臺 ConsoleAppender--> <appender name="consoleLog1" class="ch.qos.logback.core.ConsoleAppender"> <!--展示格式 layout--> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>%d -1 %msg%n</pattern> </layout> </appender> <!--輸出到控制臺 ConsoleAppender--> <appender name="consoleLog2" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d -2 %msg%n</pattern> </encoder> </appender> <!--指定最基礎的日志輸出級別--> <root level="INFO"> <!--appender將會添加到這個loger--> <appender-ref ref="consoleLog1"/> <appender-ref ref="consoleLog2"/> </root> </configuration> ~~~ 可以看到`layout`和`encoder`,都可以將事件轉換為格式化后的日志記錄,但是控制臺輸出使用`layout`,文件輸出使用`encoder` 具體原因可以看[http://blog.csdn.net/cw\_hello1/article/details/51969554](http://blog.csdn.net/cw_hello1/article/details/51969554) * 示例二: ~~~ <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <contextName>logback-demo</contextName> <!--輸出到控制臺 ConsoleAppender--> <appender name="consoleLog1" class="ch.qos.logback.core.ConsoleAppender"> <!--展示格式 layout--> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern> <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern> </pattern> </layout> <!-- <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> --> </appender> <!--指定最基礎的日志輸出級別--> <root level="INFO"> <!--appender將會添加到這個loger--> <appender-ref ref="consoleLog1"/> <appender-ref ref="consoleLog2"/> </root> </configuration> ~~~ `<encoder>`表示對日志進行編碼: * `%d{HH: mm:ss.SSS}`——日志輸出時間 * `%thread`——輸出日志的進程名字,這在Web應用以及異步任務處理中很有用 * `%-5level`——日志級別,并且使用5個字符靠左對齊 * `%logger{36}`——日志輸出者的名字 * `%msg`——日志消息 * `%n`——平臺的換行符 ThresholdFilter為系統定義的攔截器,例如我們用ThresholdFilter來過濾掉ERROR級別以下的日志不輸出到文件中。如果不用記得注釋掉,不然你控制臺會發現沒日志~ # 輸出到文件`RollingFileAppender` 另一種常見的日志輸出到文件,隨著應用的運行時間越來越長,日志也會增長的越來越多,將他們輸出到同一個文件并非一個好辦法。`RollingFileAppender`用于切分文件日志: ~~~ <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--如果只是想要 Info 級別的日志,只是過濾 info 還是會輸出 Error 日志,因為 Error 的級別高, 所以我們使用下面的策略,可以避免輸出 Error 的日志--> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!--過濾 Error--> <level>ERROR</level> <!--匹配到就禁止--> <onMatch>DENY</onMatch> <!--沒有匹配到就允許--> <onMismatch>ACCEPT</onMismatch> </filter> <!--日志名稱,如果沒有File 屬性,那么只會使用FileNamePattern的文件路徑規則 如果同時有<File>和<FileNamePattern>,那么當天日志是<File>,明天會自動把今天 的日志改名為今天的日期。即,<File> 的日志都是當天的。 --> <File>${logback.logdir}/info.${logback.appname}.log</File> <!--滾動策略,按照時間滾動 TimeBasedRollingPolicy--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--文件路徑,定義了日志的切分方式——把每一天的日志歸檔到一個文件中,以防止日志填滿整個磁盤空間--> <FileNamePattern>${logback.logdir}/info.${logback.appname}.%d{yyyy-MM-dd}.log</FileNamePattern> <!--只保留最近90天的日志--> <maxHistory>90</maxHistory> <!--用來指定日志文件的上限大小,那么到了這個值,就會刪除舊的日志--> <!--<totalSizeCap>1GB</totalSizeCap>--> </rollingPolicy> <!--日志輸出編碼格式化--> <encoder> <charset>UTF-8</charset> <pattern>%d [%thread] %-5level %logger{36} %line - %msg%n</pattern> </encoder> </appender> <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--如果只是想要 Error 級別的日志,那么需要過濾一下,默認是 info 級別的,ThresholdFilter--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>Error</level> </filter> <!--日志名稱,如果沒有File 屬性,那么只會使用FileNamePattern的文件路徑規則 如果同時有<File>和<FileNamePattern>,那么當天日志是<File>,明天會自動把今天 的日志改名為今天的日期。即,<File> 的日志都是當天的。 --> <File>${logback.logdir}/error.${logback.appname}.log</File> <!--滾動策略,按照時間滾動 TimeBasedRollingPolicy--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--文件路徑,定義了日志的切分方式——把每一天的日志歸檔到一個文件中,以防止日志填滿整個磁盤空間--> <FileNamePattern>${logback.logdir}/error.${logback.appname}.%d{yyyy-MM-dd}.log</FileNamePattern> <!--只保留最近90天的日志--> <maxHistory>90</maxHistory> <!--用來指定日志文件的上限大小,那么到了這個值,就會刪除舊的日志--> <!--<totalSizeCap>1GB</totalSizeCap>--> </rollingPolicy> <!--日志輸出編碼格式化--> <encoder> <charset>UTF-8</charset> <pattern>%d [%thread] %-5level %logger{36} %line - %msg%n</pattern> </encoder> </appender> ~~~ 如果同時有`<File>`和`<FileNamePattern>`,根據日期分割日志,代碼注釋寫的很清楚了 ![](https://img.kancloud.cn/d1/d7/d1d7d83727836d8eaff92cb200750e85_565x115.png) 如果要區分`Info`和`Error`級別的日志,那么需要使用過濾規則的策略 # 子節點五`<loger>` `<loger>`用來設置某一個包或者具體的某一個類的日志打印級別、以及指定`<appender>`。 `<loger>`僅有一個name屬性,一個可選的level和一個可選的addtivity屬性。 * name:用來指定受此loger約束的某一個包或者具體的某一個類。 * level:用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還有一個特俗值INHERITED或者同義詞NULL,代表強制執行上級的級別。如果未設置此屬性,那么當前loger將會繼承上級的級別。 * addtivity:是否向上級loger傳遞打印信息。默認是true。 loger在實際使用的時候有兩種情況 先來看一看代碼中如何使用 ~~~ @Controller public class LearnController { private Logger logger = LoggerFactory.getLogger(this.getClass()); @RequestMapping(value = "/login",method = RequestMethod.POST) @ResponseBody public Map<String,Object> login(HttpServletRequest request, HttpServletResponse response){ //日志級別從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設置為WARN,則低于WARN的信息都不會輸出。 logger.trace("日志輸出 trace"); logger.debug("日志輸出 debug"); logger.info("日志輸出 info"); logger.warn("日志輸出 warn"); logger.error("日志輸出 error"); Map<String,Object> map =new HashMap<String,Object>(); String userName=request.getParameter("userName"); String password=request.getParameter("password"); if(!userName.equals("") && password!=""){ User user =new User(userName,password); request.getSession().setAttribute("user",user); map.put("result","1"); }else{ map.put("result","0"); } return map; } } ~~~ 這是一個登錄的判斷的方法,我們引入日志,并且打印不同級別的日志,然后根據logback-spring.xml中的配置來看看打印了哪幾種級別日志。 第一種:帶有`loger`的配置,不指定級別,不指定`appender` `logback-spring.xml`增加`loger`配置如下: ~~~ <logger name="com.dudu.controller"/> ~~~ `<logger name="com.dudu.controller" />`將控制controller包下的所有類的日志的打印,但是并沒用設置打印級別,所以繼承他的上級的日志級別“info”; 沒有設置addtivity,默認為true,將此loger的打印信息向上級傳遞; 沒有設置appender,此loger本身不打印任何信息。 `<root level="info">`將root的打印級別設置為“info”,指定了名字為“console”的appender。 當執行com.dudu.controller.LearnController類的login方法時,LearnController 在包com.dudu.controller中,所以首先執行`<logger name="com.dudu.controller"/>`,將級別為“info”及大于“info”的日志信息傳遞給root,本身并不打印; root接到下級傳遞的信息,交給已經配置好的名為“console”的appender處理,“console” appender 將信息打印到控制臺; 打印結果如下: ~~~ 16:00:17.407 logback [http-nio-8080-exec-8] INFO com.dudu.controller.LearnController - 日志輸出 info 16:00:17.408 logback [http-nio-8080-exec-8] WARN com.dudu.controller.LearnController - 日志輸出 warn 16:00:17.408 logback [http-nio-8080-exec-8] ERROR com.dudu.controller.LearnController - ~~~ 第二種:帶有多個`loger`的配置,指定級別,指定`appender` `logback-spring.xml`增加`loger`配置如下: ~~~ <configuration> <!--logback.LogbackDemo:類的全路徑 --> <logger name="com.dudu.controller.LearnController" level="WARN" additivity="false"> <appender-ref ref="console"/> </logger> </configuration> ~~~ 控制com.dudu.controller.LearnController類的日志打印,打印級別為“WARN”; additivity屬性為false,表示此loger的打印信息不再向上級傳遞; 指定了名字為“console”的appender; 這時候執行com.dudu.controller.LearnController類的login方法時,先執行`<logger name="com.dudu.controller.LearnController" level="WARN" additivity="false">`,將級別為“WARN”及大于“WARN”的日志信息交給此loger指定的名為“console”的appender處理,在控制臺中打出日志,不再向上級root傳遞打印信息。 打印結果如下: ~~~ 16:00:17.408 logback [http-nio-8080-exec-8] WARN com.dudu.controller.LearnController - 日志輸出 warn 16:00:17.408 logback [http-nio-8080-exec-8] ERROR com.dudu.controller.LearnController - 日志輸出 error ~~~ 當然如果你把`additivity="false"`改成`additivity="true"`的話,就會打印兩次,因為打印信息向上級傳遞,logger本身打印一次,root接到后又打印一次。 ~~~ <configuration> <logger name="com.example.demo.controller" level="WARN" additivity="false"> <appender-ref ref="consoleLog"/> </logger> <logger name="com.example.demo.controller"/> <logger name="com.example.demo"/> </configuration> ~~~ 范圍有重疊的話,范圍小的,有效。 # 多環境日志輸出 ~~~ <configuration> <!-- 測試環境+開發環境. 多個使用逗號隔開. --> <springProfile name="test,dev"> <logger name="com.example.demo.controller" level="DEBUG" additivity="false"> <appender-ref ref="consoleLog"/> </logger> </springProfile> <!-- 生產環境. --> <springProfile name="prod"> <logger name="com.example.demo.controller" level="INFO" additivity="false"> <appender-ref ref="consoleLog"/> </logger> </springProfile> </configuration> ~~~ `application.yml`增加環境選擇的配置`active: dev` ~~~ server: port: 9010 spring: profiles: active: dev datasource: url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8 username: root password: root mybatis: type-aliases-package: org.larry.springboot.entity mapper-locations: classpath:mapper/**/*.xml check-config-location: true ~~~ `active: 【test、dev、prod】`,根據`active`的環境,自動采用上面配置的`springProfile`的`logger`日志 自定義日志路徑(application.yml) `application.yml`增加日志相關自定義配置 ~~~ logback: logdir: /Users/inke/dev/log/tomcat/sell appname: sell ~~~ 在`logback-spring.xml` ~~~ <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <!--application.yml 傳遞參數,不能使用logback 自帶的<property>標簽 --> <springProperty scope="context" name="appname" source="logback.appname"/> <springProperty scope="context" name="logdir" source="logback.logdir"/> <contextName>${appname}</contextName> <!--輸出到控制臺 ConsoleAppender--> <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender"> <!--展示格式 layout--> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern> <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern> </pattern> </layout> </appender> ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看