天天看點

【JavaWeb下】SLF4J+LogBack使用配置需要的Jar包logback.xml配置檔案Java代碼測試輸出結果

關于SLF4j和LogBack的相關說明請自行百度

由于換工作原因,現在公司項目是普通JavaWeb項目(JSP那種),而且日志系統是公司自己寫的,每次遇到問題,都不能抛出詳細的報錯資訊,導緻修改線上問題的時候會費很多時間(可能對于新到公司來說吧,老手還好),無奈隻能自己在本地先測試咯,使用了之前的日志架構

SLF4j+LofBack

來重寫日志輸出~~~最後感覺還可以,直接開始~

需要的Jar包

由于沒有用到Maven,所有的Jar包都需自己下載下傳(莫法~),還好隻用到了以下3個Jar包…
  1. logback-classic-1.2.3.jar
  2. logback-core-1.2.3.jar
  3. slf4j-api-1.7.9.jar
下載下傳之後放到

WEB-INF/lib

目錄下,如下圖所示
【JavaWeb下】SLF4J+LogBack使用配置需要的Jar包logback.xml配置檔案Java代碼測試輸出結果

logback.xml配置檔案

這個檔案主要是用來配置日志輸出及相關政策的,我這裡呢根據自己的需要大部分已經配置好了,各位如果覺得有需要改進的地方可以給我說喲~

logback.xml配置檔案放到classpath路徑下

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志級别 -->
<!-- TRACE < DEBUG < INFO < WARN < ERROR  -->
<!-- 根節點<configuration>,包含下面三個屬性: -->
<!-- scan: 當此屬性設定為true時,配置檔案如果發生改變,将會被重新加載,預設值為true。 -->
<!-- scanPeriod: 設定監測配置檔案是否有修改的時間間隔,如果沒有給出時間機關,預設機關是毫秒。當scan為true時,此屬性生效。預設的時間間隔為1分鐘。 -->
<!-- debug: 當此屬性設定為true時,将列印出logback内部日志資訊,實時檢視logback運作狀态。預設值為false。 -->
<configuration scan="false" scanPeriod="60 seconds" debug="false">
	<!-- 子節點<contextName>:用來設定上下文名稱,每個logger都關聯到logger上下文,預設上下文名稱為default。但可以使用<contextName>設定成其他名字,用于區分不同應用程式的記錄。一旦設定,不能修改 -->
	<!-- <contextName>xxx</contextName> -->
	<!-- 上下文變量設定,用來定義變量值,其中name的值是變量的名稱,value的值時變量定義的值。 通過<property>定義的值會被插入到logger上下文中。定義變量後,可以使“${}”來使用變量。 -->
	<!-- 儲存路徑 -->
	<property name="logDir" value="D:/logs" />
	<!-- 日志儲存大小 -->
	<property name="maxFileSize" value="10KB" />
	<!-- 儲存日志天數 -->
	<property name="maxHistory" value="30" />
	<!-- 日志展示形式-->
	<property name="log.pattern" value="%d{yyyy-MM-dd : HH:mm:ss.SSS}[%thread]%-5level%logger{50}-%msg%n"/>
	<!-- 項目名 -->
	<property name="projectName" value="YxWeChat" />
	
	<!-- 配置DEBUG輸出日志 -->
	<appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<encoder>
			<pattern>${log.pattern}</pattern>
		</encoder>
		<!-- 過濾不是DEBUG的日志 -->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>DEBUG</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
		 <file>${logDir}/${projectName}/${projectName}-debug.log</file><!-- 目前的日志檔案存放路徑 -->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/${logDir}/${projectName}/debug/%d{yyyy-MM-dd}/${projectName}-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${maxFileSize}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
	</appender>
	<!-- 配置INFO輸出日志 -->
	<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<encoder charset="utf-8">
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>INFO</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
        <file>${logDir}/${projectName}/${projectName}-info.log</file><!-- 目前的日志檔案存放路徑 -->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/${logDir}/${projectName}/info/%d{yyyy-MM-dd}/${projectName}-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${maxFileSize}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
	</appender>
	<!-- 配置WARN輸出資訊 -->
	<appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<encoder charset="utf-8">
            <pattern>${log.pattern}</pattern>
        </encoder>
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>WARN</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
	    <file>${logDir}/${projectName}/${projectName}-warn.log</file><!-- 目前的日志檔案存放路徑 -->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/${logDir}/${projectName}/warn/%d{yyyy-MM-dd}/${projectName}-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${maxFileSize}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
	</appender>
	<!-- 配置ERROR輸出日志 -->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder charset="utf-8">
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <file>${logDir}/${projectName}/${projectName}-error.log</file><!-- 目前的日志檔案存放路徑 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/${logDir}/${projectName}/error/%d{yyyy-MM-dd}/${projectName}-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${maxFileSize}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>
	
	<root level="DEBUG">
		<appender-ref ref="DEBUG" />
		<appender-ref ref="INFO" />
		<appender-ref ref="ERROR" />
		<appender-ref ref="WARN" />
	</root>
</configuration>
           
此配置檔案的效果為:按天生成日志檔案,每個日志檔案的大小為

10KB

(可通過設定

maxFileSize

屬性來改變單個日志檔案大小),日志檔案按天存放,最大保留30天(可通過設定

maxHistory

屬性來設定儲存時長)

Java代碼測試

建立

test.java

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class test{
    private static Logger log = LoggerFactory.getLogger(test.class);
    public void LogTest() {
        log.info("Info查詢醫院科室");
        log.debug("Debug查詢醫院科室");
        log.warn("Warn查詢醫院科室");
        String a = null;
        try {
            if(a.length()==1) {
                System.out.println("1");
            }
        } catch (Exception e) {
            log.error("查詢醫院科室出錯:{}",e.getMessage(),e);
        }
    }
}
           

輸出結果

進入上述方法之後,會在我們定義的日志目錄中輸出

*-debug.log,*-error.log,*-info.log,*-warn.log

的日志檔案(如圖①所示)

當我們的單個日志檔案超過

10KB

,會自動生成日志檔案夾,并按照我們定義的格式分段儲存當天日志(如圖②③所示)
【JavaWeb下】SLF4J+LogBack使用配置需要的Jar包logback.xml配置檔案Java代碼測試輸出結果
【JavaWeb下】SLF4J+LogBack使用配置需要的Jar包logback.xml配置檔案Java代碼測試輸出結果
【JavaWeb下】SLF4J+LogBack使用配置需要的Jar包logback.xml配置檔案Java代碼測試輸出結果

有些同學可能會問,我們不是設定的日志格式大小為10KB麼?為什麼會出現14KB,11KB的情況?

我們打開圖③的

YxWeChat-error-2019-08-06.0.log

看看
2019-08-06 : 17:51:19.188[default task-8]ERRORYxWeChat.Actions.KSJS.KSJS-查詢醫院科室出錯:null
java.lang.NullPointerException: null
	at YxWeChat.Actions.KSJS.KSJS.QueryKS(KSJS.java:49)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at SOA.YxProGlob.Busy.TBusy.Execute(TBusy.java:23)
	at YxESB.bus.TEsbBus.doEsb(TEsbBus.java:64)
	at YxESB.http.noCheckAction.doPost(noCheckAction.java:62)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
	at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:86)
	at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
	at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
	at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
	at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
	at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
	at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58)
	at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70)
	at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:261)
	at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:248)
	at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:77)
	at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:167)
	at io.undertow.server.Connectors.executeRootHandler(Connectors.java:199)
	at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:761)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
2019-08-06 : 17:51:55.799[default task-15]ERRORYxWeChat.Actions.KSJS.KSJS-查詢醫院科室出錯:null
java.lang.NullPointerException: null
	at YxWeChat.Actions.KSJS.KSJS.QueryKS(KSJS.java:49)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at SOA.YxProGlob.Busy.TBusy.Execute(TBusy.java:23)
	at YxESB.bus.TEsbBus.doEsb(TEsbBus.java:64)
	at YxESB.http.noCheckAction.doPost(noCheckAction.java:62)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
	at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:86)
	at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
	at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
	at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
	at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
	at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
	at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58)
	at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70)
	at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:261)
	at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:248)
	at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:77)
	at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:167)
	at io.undertow.server.Connectors.executeRootHandler(Connectors.java:199)
	at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:761)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
2019-08-06 : 17:51:55.946[default task-19]ERRORYxWeChat.Actions.KSJS.KSJS-查詢醫院科室出錯:null
java.lang.NullPointerException: null
	at YxWeChat.Actions.KSJS.KSJS.QueryKS(KSJS.java:49)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at SOA.YxProGlob.Busy.TBusy.Execute(TBusy.java:23)
	at YxESB.bus.TEsbBus.doEsb(TEsbBus.java:64)
	at YxESB.http.noCheckAction.doPost(noCheckAction.java:62)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
	at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:86)
	at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
	at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
	at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
	at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
	at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
	at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58)
	at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70)
	at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:261)
	at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:248)
	at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:77)
	at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:167)
	at io.undertow.server.Connectors.executeRootHandler(Connectors.java:199)
	at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:761)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
2019-08-06 : 17:51:56.521[default task-26]ERRORYxWeChat.Actions.KSJS.KSJS-查詢醫院科室出錯:null
java.lang.NullPointerException: null
	at YxWeChat.Actions.KSJS.KSJS.QueryKS(KSJS.java:49)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at SOA.YxProGlob.Busy.TBusy.Execute(TBusy.java:23)
	at YxESB.bus.TEsbBus.doEsb(TEsbBus.java:64)
	at YxESB.http.noCheckAction.doPost(noCheckAction.java:62)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
	at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:86)
	at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
	at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
	at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
	at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
	at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
	at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58)
	at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70)
	at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:261)
	at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:248)
	at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:77)
	at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:167)
	at io.undertow.server.Connectors.executeRootHandler(Connectors.java:199)
	at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:761)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

           
可以看到我們的錯誤日志報錯是完整的報錯資訊,那我們是不是可以認為超出我們定義的日志大小,是因為logback為我們做了

優化

呢?哈哈,反正不管怎樣都在我們接受範圍内、好了,關于slf4j+logback的使用基本就這樣啦。

如果有什麼問題或者建議,請在評論區留言哦

,謝謝