1. 程式人生 > >springBoot logback日誌配置管理 aop切面日誌模組管理,單獨輸出日誌檔案

springBoot logback日誌配置管理 aop切面日誌模組管理,單獨輸出日誌檔案

1.springBoot 日誌配置(將controller包下的日誌單獨輸出到一個檔案下)

 1  

我們遵守約定>配置>編碼的原則,如果使用logback進行日誌管理,先新增pom 檔案但是spring-boot-starter其中包含了 spring-boot-starter-logging依賴 所以不需要新增,

2

修改application.yml檔案

logging:
  level:
    com:
      wintac:
        dao:
          plat: debug
        controller:
          api:
            plat:
  config: classpath:logback-dev.xml

level 設定輸出的日誌級別,預設是dubug ;com.wintac.dao.plat是控制檯輸出dao層的所有的檔案日誌 入參 sql  

  config: classpath:logback-dev.xml  設定詳細的log back配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="true">
    <!-- 控制檯設定 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoder 預設配置為PatternLayoutEncoder -->
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--如果只是想要 Info 級別的日誌,只是過濾 info 還是會輸出 Error 日誌,因為 Error 的級別高,
        日誌名稱,如果沒有File 屬性,那麼只會使用FileNamePattern的檔案路徑規則
            如果同時有<File>和<FileNamePattern>,那麼當天日誌是<File>,明天會自動把今天
            的日誌改名為今天的日期。即,<File> 的日誌都是當天的。
        -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--檔案路徑,定義了日誌的切分方式——把每一天的日誌歸檔到一個檔案中,以防止日誌填滿整個磁碟空間-->
            <FileNamePattern>/opt/logs/api/%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="controllerLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
      <!--  <file>D:/ZM_Interface/CodeCloud_SX/test/log/controller/controller.log</file>-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>opt/logs/api/controller/logs-%d{yyyy-MM-dd}.log</fileNamePattern>
            <!--只保留最近90天的日誌-->
            <maxHistory>90</maxHistory>
            <!--用來指定日誌檔案的上限大小,那麼到了這個值,就會刪除舊的日誌-->
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <charset>UTF-8</charset>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n</pattern>
        </encoder>
    </appender>

    <springProfile name="dev">
        <root level="info">
            <appender-ref ref="STDOUT"/>
        </root>
    </springProfile>
    <springProfile name="prod">
        <root level="info">
            <appender-ref ref="STDOUT"/>
            <appender-ref ref="fileInfoLog"/>
        </root>
        //此處配置是將controllerLog於com.wintac.controller.api.plat包進行管理,只輸出此包的日誌
        <logger name="com.wintac.controller.api.plat" level="INFO" additivity="false">
            <appender-ref ref="controllerLog" />
        </logger>
    </springProfile>
</configuration>
ConsoleAppender控制檯輸出

<springProfile>配置不同環境的配置   可以包含上面的<appender> 這裡配置了兩個環境prod 和dev

<encoder>表示對日誌進行編碼:

  • %d{HH: mm:ss.SSS}——日誌輸出時間
  • %thread——輸出日誌的程序名字,這在Web應用以及非同步任務處理中很有用
  • %-5level——日誌級別,並且使用5個字元靠左對齊
  • %logger{36}——日誌輸出者的名字
  • %msg——日誌訊息
  • %n——平臺的換行符 
    ThresholdFilter為系統定義的攔截器,例如我們用ThresholdFilter來過濾掉ERROR級別以下的日誌不輸出到檔案中。如果不用記得註釋掉,不然你控制檯會發現沒日誌~

loger>來設定某一個包或者具體的某一個類的日誌列印級別、以及指定<appender><loger>僅有一個name屬性,一個可選的level和一個可選的addtivity屬性。

  • name:用來指定受此loger約束的某一個包或者具體的某一個類。
  • level:用來設定列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還有一個特俗值INHERITED或者同義詞NULL,代表強制執行上級的級別。如果未設定此屬性,那麼當前loger將會繼承上級的級別。
  • addtivity:是否向上級loger傳遞列印資訊。預設是true。

3:aop

在自定義logback檔案之前往往有時候需要對專案中的某些層進行檔案的aop 切面日誌編寫

package com.tianyalei.testelk.aop;
 
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.validation.ObjectError;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
 
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
 
/**
 * 日誌切面
 */
@Aspect
@Component
public class LogAspect {
    private Logger logger = LoggerFactory.getLogger(getClass().getName());
    private ObjectError error;
 
    @Pointcut("execution(* com.wintac.controller.api.plat..*.*(..))")
    public void webLog() {
    }
 
    @Before("webLog()")
    public void deBefore(JoinPoint joinPoint) throws Throwable {
        // 接收到請求,記錄請求內容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
      //  HttpServletRequest request = attributes.getRequest();
        logger.info("-------------------使用者發起請求-----------------");
        // 記錄下請求內容
     //   logger.info("URL : " + request.getRequestURL().toString());
     //   logger.info("HTTP_METHOD : " + request.getMethod());
        //如果是表單,引數值是普通鍵值對。如果是application/json,則request.getParameter是取不到的。
     //   logger.info("HTTP_HEAD Type : " + request.getHeader("Content-Type"));
        logger.info("IP : " + request.getRemoteAddr());
        logger.info("使用者名稱")
        logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
 
        if ("application/json".equals(request.getHeader("Content-Type"))) {
            //記錄application/json時的傳參,SpringMVC中使用@RequestBody接收的值
            logger.info(getRequestPayload(request));
        } else {
            //記錄請求的鍵值對
            for (String key : request.getParameterMap().keySet()) {
                logger.info(key + "----" + request.getParameter(key));
            }
        }
 
    }
 
    @AfterReturning(returning = "ret", pointcut = "webLog()")
    public void doAfterReturning(Object ret) throws Throwable {
        // 處理完請求,返回內容
        logger.info("方法的返回值 : " + ret);
        logger.info("------------------請求結束------------------");
    }
 
    //後置異常通知
 //   @AfterThrowing(throwing = "ex", pointcut = "webLog()")
 //   public void throwss(JoinPoint jp, Exception ex){
 //       logger.info("方法異常時執行.....");
  //  }
 
    //後置最終通知,final增強,不管是丟擲異常或者正常退出都會執行
  //  @After("webLog()")
 //   public void after(JoinPoint jp){
//        logger.info("方法最後執行.....");
  //  }
 
<!-- private String getRequestPayload(HttpServletRequest req) {
        StringBuilder sb = new StringBuilder();
        try(BufferedReader reader = req.getReader()) {
            char[]buff = new char[1024];
            int len;
            while((len = reader.read(buff)) != -1) {
                sb.append(buff,0, len);
            }
        }catch (IOException e) {
            e.printStackTrace();
        }
        return sb.toString();
    }  -->
 
   
}

此處是對所有controller類的切面程式設計

切點方程
在各個pattern中可以使用“*”來表示匹配所有。在(param-pattern)中,可以指定具體的引數型別,多個引數間用“,”隔開,各個也可以用“*”來表示匹配任意型別的引數,如(String)表示匹配一個String引數的方法;(*,String)表示匹配有兩個引數的方法,第一個引數可以是任意型別,而第二個引數是String型別;可以用(..)表示零個或多個任意引數。
現在來看看幾個例子:
1)execution(* *(..))
表示匹配所有方法
2)execution(public * com. savage.service.UserService.*(..))
表示匹配com.savage.server.UserService中所有的公有方法
3)execution(* com.savage.server..*.*(..))
表示匹配com.savage.server包及其子包下的所有方法 

@Pointcut("execution(* com.wintac.controller.api.plat..*.*(..))")
    public void webLog() {
    }

所有下面方法的@Before,使用    @Before("webLog()")

controller

@PostMapping(value = "PriceIntoPlan",name = "新增報價到行程")
    @ApiOperation(value = "新增報價到行程",notes = "趙滿")
    public Response priceIntoPlan(@RequestBody QutationDetailRequest qutationDetailRequest){
        org.slf4j.Logger logger = LoggerFactory.getLogger(getClass().getName());
        Response response = new Response();
        if(qutationDetailRequest.getPlandayId()!=null){
            try {
                boolean b = tQuotationDetailService.PriceStandIntoDetail(qutationDetailRequest);
                response.setData(b);
                response.setMsg("新增成功");
                logger.info("新增報價到行程");
            } catch (Exception e) {
                response.setData(false);
                response.setMsg("新增失敗"+e);
            }
        }else {
            response.setMsg("行程天為空");
        }
        return response;
    }

個人感覺因為在logback檔案裡使用了<logger name="com.wintac.controller.api.plat" level="INFO" additivity="false">
            <appender-ref ref="controllerLog" />
        </logger>

所以需要將aop 類放到此包下,要不然會輸出到檔案中

將controller包下的日誌單獨輸出到一個檔案下,且控制檯全部列印

java 程式碼

相關推薦

springBoot logback日誌配置管理 aop切面日誌模組管理單獨輸出日誌檔案

1.springBoot 日誌配置(將controller包下的日誌單獨輸出到一個檔案下)  1   我們遵守約定>配置>編碼的原則,如果使用logback進行日誌管理,先新增pom 檔案但是spring-boot-starter其中包含了 spring-bo

springboot logback-spring配置mybatis日誌輸出

<logger name="com.mycompany.myapp.mapper.MyMapper" level="DEBUG" additivity="false"/> log4j的ad

vsftpd日誌配置及查看——可以將vsftpd記錄在系統日誌

常見 word 數據 配置 解決 tle user xferlog anon vsftpd日誌配置及查看 vsftpd ftp服務器的日誌設置,可以通過修改主配置文件/etc/vsftpd.conf實現。主配置文件中與日誌設置有關的選項包括xferlog_enable 、

SpringBoot logback配置中心讀取屬性

官網描述 根據官網的描述可以得到這樣的資訊:logback.xml載入早於application.yml,如果直接通過${引數key}的形式獲取是無法獲取到對應引數值的。解決的方法是: <springProperty scope="context" name="mongo.host" so

Spring 4.0 學習日記(9) ---XML配置實現AOP切面

Spring建立代理的規則 1.預設使用Java動態代理來建立AOP代理 2.當需要代理的類不是代理介面的時候,Spring會切換為使用CGLIB代理,也可強制使用CGLIB 其實Xml配置更簡單 直接看程式碼就懂了 介面類 package co

log4j不列印sql輸出日誌檔案到指定目錄

#log4j.rootLogger=CONSOLE,info,error,DEBUG log4j.rootLogger=infoA,errorA,CONSOLE,DEBUGA //注意這裡不要用INFO,DEBUG等 改個名字 log4j.appender.CONSOLE=org.apach

linux java程序後臺啟動輸出日誌到指定檔案

linux 中讓java程序以後臺形式執行,並輸出日誌到指定檔案中。 舉例: 現在linux /home/pro/application/monitor下有一個jar包叫zop-monitor-web

springboot預設的日誌管理工具logback配置

1.首先建立xxx-spring.xml(必須是以spring結尾)2.logback-spring.xml的內容編輯<?xml version="1.0" encoding="UTF-8"?> <Configuration status="warn">

springBoot(4):日誌配置-logback

springboot 日誌配置-logback和log4j2 一、簡介支持日誌框架:Java Util Logging, Log4J2 and Logback,默認是使用logbacklogback配置方式spring boot默認會加載classpath:logback-spring.xml或者cl

springboot日誌配置Logback

mat classpath path 節點 %d .text fixed ger tps springboot可以通過application.yml或者application.properties中配置如下屬性指定日誌配置 #logback日誌配置xml存放路徑配置logg

SpringBoot 日誌配置LogBack(二)

接下來則進行自定義配置了,貼上一個配置示例(logback-spring.xml): <?xml version="1.0" encoding="UTF-8" ?> <!-- logback整合日誌 --> <configuration s

SpringBoot教程五】:SpringBoot+LogBack日誌配置

無論從設計上還是實現上,Logback相對log4j而言有了相對多的改進。不過儘管難以一一細數,這裡還是列舉部分理由為什麼選擇logback而不是log4j。牢記logback與log4j在概念上面是很相似的,它們都是有同一群開發者建立。所以如果你已經對log4j很熟悉,你也可以很快上手logback。如

SpringBoot整合+logback日誌配置

本次演示的程式碼結構如下,基於maven,整合SpringBoot、Spring、Mybaits的SSM框架。同時測試logback日誌框架的使用及配置。 1.建立maven工程,修改pom.xml檔案 <project xmlns="http://maven.ap

Springboot 自定義註解 AOP切面獲取操作日誌

編碼思想: 新增和修改資料,記錄使用者操作資訊(建立人,修改人) ,然後每個模組打算根據操作資料的主鍵id關聯日誌表查詢操作人資訊;需要宣告每個模組名稱及操作方法(constant包中便是宣告的模組和操作方法列舉) 檔案目錄: 1. build.gradle引入jar

SpringBoot專案的logback日誌配置(包括列印mybatis的sql語句)

我在這就開門見山直接介紹我們專案日誌的配置使用吧!~ 1、基本介紹 預設情況下,Spring Boot專案就會用Logback來記錄日誌,並用INFO級別輸出到控制檯。如下圖: 實際開發中我們不需要直接新增logback日誌依賴。 你會

35.再談SpringBoot自定義日誌配置--LogBack.xml

在實際專案開發中我們可能自定義日誌配置檔案。 以下為自定義LogBack配置。 application.properties logging.config=classpath:logback-spring.xml logback-spring.xml 以下配置日誌具有日

SpringBoot系列】五、SpringBoot 日誌配置(logback)

     SpringBoot支援Java Util Logging,Log4J,Log4J2和Logback日誌框架,預設採用logback日誌。在實際SpringBoot專案中使用SpringBoot預設日誌配置是不能夠滿足實際生產及開發需求的,需要選定適合的日誌輸出框架

最全面的 Spring事務管理AOP切面日誌的注入 —aop:pointcut expression解析

先來看看這個spring的配置檔案的配置:   <!-- 事務管理器 -->  <bean id="transactionManager"   class="org.springframework.orm.hibernate3.HibernateTran

SpringBoot+LogBack日誌配置

無論從設計上還是實現上,Logback相對log4j而言有了相對多的改進。不過儘管難以一一細數,這裡還是列舉部分理由為什麼選擇logback而不是log4j。牢記logback與log4j在概念上面是很相似的,它們都是有同一群開發者建立。所以如果你已經對log4j很熟悉,你也可以很快上手logback。如

SpringBoot Logback日誌配置

Logback的配置介紹: 1、Logger、appender及layout Logger作為日誌的記錄器,把它關聯到應用的對應的context上後,主要用於存放日誌物件,也可以定義日誌型別、級別。 Appender主要用於指定日誌輸出的目的地,目的地可以