ssm框架怎麼利用log4j2.xml在控制檯輸出sql日誌

我不知道在幹什麼,反正就是弄出來了。
JDK1.8 MAVEN3.5.3 Tomcate7.x
1.pom.xml引入相關依賴|

<!--日誌開始-->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-web</artifactId>
      <version>2.8.2</version>
    </dependency>
    <!--    https://blog.csdn.net/zeal9s/article/details/86078097-->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-slf4j-impl</artifactId>
      <version>2.8.2</version>
    </dependency>

    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.9.5</version>
    </dependency>
    <!--日誌結束-->

2.在resources文件夾下新建log4j2.xml文件
在這裏插入圖片描述
內容如下

<?xml version="1.0" encoding="UTF-8"?>
<!--日誌級別以及優先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration後面的status,這個用於設置log4j2自身內部的信息輸出,可以不設置,當設置成trace時,你會看到log4j2內部各種詳細輸出-->
<configuration  status="info">
    <!-- 變量配置 應該是日誌文件保存路徑-->
    <Properties>
        <!-- (*必須,各應用需要修改) 部署應用的名稱,命名規則 :全部小寫字母、中短橫線、數字,與微服務命名,disconf中命名一致 -->
        <property name="APPNAME">park-service</property>
        <!-- (各應用需要修改)日誌文件本地存放目錄路徑 建議各個環境跟生產環境統一起來,方便維護 -->
        <!--sys:catalina.home  tomcat的根目錄-->
        <Property name="logBaseFolder">${sys:catalina.home}/logs/zcrTest/</Property>
        <!-- *必須並強制遵守 日誌文件的編碼 -->
        <property name="log_charset">UTF-8</property>
        <!--輸出日誌格式-->
        <property name="log_pattern">
            %d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n
        </property>
    </Properties>

    <!--先定義所有的appender-->
    <appenders>
        <!--這個輸出控制檯的配置-->
        <console name="Console" target="SYSTEM_OUT">
            <!--輸出日誌的格式 %l :表示某個類-->
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%t] %-5p %c{1}:%L - %msg%n"/>
        </console>

        <!-- 這個會打印出所有的info及以下級別的信息,每次大小超過size,則這size大小的日誌會自動存入按年份-月份建立的文件夾下面並進行壓縮,作爲存檔-->
        <RollingFile name="RollingFileInfo" fileName="${logBaseFolder}/${APPNAME}-info.log"
                     filePattern="${logBaseFolder}/%d{yyyy-MM}/${APPNAME}-info-%d{dd HH:mm:ss}.%i.log.gz">
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <!-- 日誌輸出格式 -->
            <PatternLayout charset="${log_charset}" pattern="${log_pattern}" />
            <!-- 以下是日誌壓縮包目錄的建議格式名稱 建議1天歸檔依次,壓縮文件上線建議爲200,這裏預估每個磁盤存儲空間200G左右,每個壓縮包最大值200MB -->
            <Policies>
                <TimeBasedTriggeringPolicy  modulate="true" interval="1"/>
                <SizeBasedTriggeringPolicy size="20 MB"/>
            </Policies>
        </RollingFile>

        <RollingFile name="RollingFileError" fileName="${logBaseFolder}/${APPNAME}-error.log"
                     filePattern="${logBaseFolder}/%d{yyyy-MM}/${APPNAME}-error-%d{dd HH:mm:ss}.%i.log.gz">
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout charset="${log_charset}" pattern="${log_pattern}" />
            <Policies>
                <TimeBasedTriggeringPolicy  modulate="true" interval="1"/>
                <SizeBasedTriggeringPolicy size="20 MB"/>
            </Policies>
        </RollingFile>
    </appenders>

    <!--然後定義logger,只有定義了logger並引入的appender,appender纔會生效-->
    <loggers>
        <!--過濾掉spring和mybatis的一些無用的DEBUG信息-->
        <logger name="org.springframework" level="INFO"/>
        <logger name="org.mybatis" level="INFO"/>

        <root level="all">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileError"/>
        </root>
    </loggers>

</configuration>

**3.web.xml文件**
    <!--日誌-->
    <!-- log4j2-begin-->
    <!--監聽器和過濾器-->
    <listener>
        <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
    </listener>

    <filter>
        <filter-name>log4jServletFilter</filter-name>
        <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>log4jServletFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>

    <context-param>
        <param-name>log4jConfiguration</param-name>
        <param-value>classpath:log4j2.xml</param-value>
    </context-param>
    <!--動態修改log4j2.xml:容器會每60秒掃描log4j的配置文件-->
    <context-param>
        <param-name>log4jRefreshInterval</param-name>
        <param-value>60000</param-value>
    </context-param>
    <!-- log4j2-end -->

4.日誌管理類LogInterceptor
在這裏插入圖片描述
內容如下

package com.hr.interceptor;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Component;
@Component
public  class LogInterceptor {
    private static final Logger logger = LogManager.getLogger(LogInterceptor.class); 
    String logStr=null;
    //用來做環繞通知的方法可以第一個參數定義爲org.aspectj.lang.ProceedingJoinPoint類型
    public Object around(ProceedingJoinPoint call) throws Throwable {
        Object result = null;
        //取得類名和方法名
        String className = call.getTarget().getClass().getName();
        String methodName = call.getSignature().getName();
        //相當於前置通知
        logStr=className+"類的"+methodName+"方法開始執行******Start******";
        logger.info(logStr);
        try {
            result = call.proceed();
            //相當於後置通知
            logStr=className+"."+methodName+"()方法正常執行結束...";
            logger.info(logStr);
        } catch (Throwable e) {
            //相當於異常拋出後通知
            StackTraceElement stackTraceElement= e.getStackTrace()[e.getStackTrace().length-1];
            Object[] args=call.getArgs();
            logger.error("----------------------------------------------------------------------------------");
            logger.error ( "===執行{}類的{}()方法的{}行",className,methodName,stackTraceElement.getLineNumber());
            logger.error("===異常信息爲:{}  ",e.fillInStackTrace().toString());
            logger.error("===參數信息爲:{}  ",args);
            throw e;
        }finally{
            //相當於最終通知
            logStr=className+"類的" +methodName+"方法執行結束******End******";
            logger.info(logStr);
        } 
        return result;
    }
}


5.spring.xml中配置AOP
在這裏插入圖片描述
內容如下

    <!--日誌-->
    <!-- 使用xml配置aop ,引入AOP的命名空間-->
    <bean id="logInterceptor" class="com.hr.interceptor.LogInterceptor"></bean>
    <!-- 強制使用cglib代理,如果不設置,將默認使用jdk的代理,但是jdk的代理是基於接口的 -->
    <aop:config proxy-target-class="true" />
    <aop:config>
        <!--定義切面-->
        <aop:aspect id="logAspect" ref="logInterceptor">
            <!--定義切入點-->
            <aop:pointcut expression="execution(* com.hr.web.*.*(..))"  id="logPointCut"/>
            <!--方法執行之前被調用執行的-->
            <!--<aop:before method="before" pointcut-ref="logPointCut"/>&lt;!&ndash;一個切入點的引用&ndash;&gt;-->
            <!--<aop:after method="after" pointcut-ref="logPointCut"/>&lt;!&ndash;一個切入點的引用&ndash;&gt;-->
            <!--<aop:after-throwing method="afterThrowing" pointcut-ref="logPointCut" />-->
            <!--<aop:after-returning method="afterReturn" pointcut-ref="logPointCut" />-->
            <aop:around method="around" pointcut-ref="logPointCut"/>
        </aop:aspect>
    </aop:config>

接下來啓動SSM項目,訪問查詢功能
http://localhost:8888/ssm2page_war_exploded/book/list
在這裏插入圖片描述
如果要在代碼中,將異常添加到日誌

private static Logger logger = LogManager.getLogger(MyTestController.class.getName());

logger.info(“我是logger信息”);

Log4j2日誌級別

級別

在log4j2中, 共有8個級別,按照從低到高爲:
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF。

All: 最低等級的,用於打開所有日誌記錄.
Trace: 是追蹤,就是程序推進一下.
Debug: 指出細粒度信息事件對調試應用程序是非常有幫助的.
Info: 消息在粗粒度級別上突出強調應用程序的運行過程.
Warn: 輸出警告及warn以下級別的日誌.
Error: 輸出錯誤信息日誌.
Fatal: 輸出每個嚴重的錯誤事件將會導致應用程序的退出的日誌.
OFF: 最高等級的,用於關閉所有日誌記錄.
程序會打印高於或等於所設置級別的日誌,設置的日誌等級越高,打印出來的日誌就越少。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章