1. 程式人生 > 實用技巧 >日誌,程式設計師的小本本

日誌,程式設計師的小本本

日誌的基本配置

匯入依賴

  移除starter包中的原本的日誌依賴,都是在父級pom.xml中配置。

     <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <!--排除springboot預設的日誌依賴  後期自己整合-->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

  增加新的依賴

        <!--日誌配置-->
        <!--引入日誌依賴 抽象層 與 實現層-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.21</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.21</version>
        </dependency>

日誌properties配置

  

#建立 log4j.properties 並且放到資原始檔目錄 src/main/resources
log4j.rootLogger=DEBUG,stdout,file
log4j.additivity.org.apache=true
#第一個地方stdout  輸出控制檯
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#標準的輸出資訊
log4j.appender.stdout.threshold=INFO   
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern
=%-5p %c{1}:%L - %m%n #以檔案形式滾動輸出 log4j.appender.file=org.apache.log4j.DailyRollingFileAppender log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.DatePattern='.'yyyy-MM-dd-HH-mm log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n log4j.appender.file.Threshold=INFO log4j.appender.file.append=true #日誌的輸出路徑 log4j.appender.file.File=d:/log/wxshare/mylog.log

  日誌的其他介紹

log4j日誌輸出格式一覽:
%c 輸出日誌資訊所屬的類的全名
%d 輸出日誌時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyy-MM-dd HH:mm:ss },輸出類似:2002-10-18- 22:10:28
%f 輸出日誌資訊所屬的類的類名
%l 輸出日誌事件的發生位置,即輸出日誌資訊的語句處於它所在的類的第幾行
%m 輸出程式碼中指定的資訊,如log(message)中的message
%n 輸出一個回車換行符,Windows平臺為“rn”,Unix平臺為“n”
%p 輸出優先順序,即DEBUG,INFO,WARN,ERROR,FATAL。如果是呼叫debug()輸出的,則為DEBUG,依此類推
%r 輸出自應用啟動到輸出該日誌資訊所耗費的毫秒數
%t 輸出產生該日誌事件的執行緒名

#設定日誌輸出的等級為debug,低於debug就不會輸出了
#設定日誌輸出到兩種地方,分別叫做stdout和file  控制檯輸出和檔案輸出
log4j.rootLogger=DEBUG,stdout,file
log4j.additivity.org.apache=true
#第一個地方stdout, 輸出到控制檯
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.threshold=INFO
#設定輸出格式%5p [%t] (%F:%L) - %m%n
#寬度是5的優先等級 執行緒名稱 (檔名:行號) - 資訊 回車換行
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-5p %c{1}:%L - %m%n
#以檔案形式滾動輸出
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.DatePattern='.'yyyy-MM-dd-HH-mm
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
log4j.appender.file.Threshold=INFO
log4j.appender.file.append=true
log4j.appender.file.File=d:/log/wxshare/mylog.log

測試介面

  這個是controller類

//這句話放在任何一個需要列印日誌的類中   controller 或者一些service的地方
final static Logger logger = LoggerFactory.getLogger(TestController.class); @GetMapping("logtest") public void logTest() { logger.debug("debug"); logger.info("info"); logger.warn("warn"); logger.error("error"); }

測試介面

這裡try it out一下,測試這個介面的目的還是為了在控制檯中能看到對應的日誌資訊

Service日誌管理-切面技術aspectJ

依賴匯入

  老樣子,還是在父級pom.xml中進行配置

        <!--配置springaop,日誌監控-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

配置

  properties裡面可以加入一個sql的監控,可以輸出sql查詢時候的語句

#配置sql列印
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

需要切面的包結構

建立一個測試service層的介面TestService

public interface TestService {
    public void logTest(int seconds);
}

建立實現類TestServiceImpl

package com.wt.service.impl;

import com.wt.service.TestService;
import org.springframework.stereotype.Service;

@Service
public class TestServiceImpl implements TestService {

    @Override
    public void logTest(int seconds) {
        try {
            Thread.sleep(1000*seconds);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

API模組

1、在api模組中進行aop切點的操作和測試介面的開發

2、配置類aspect的開發

package com.wt.aspect;

import com.wt.controller.TestController;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Aspect    //spring的aop實現底層是aspectj框架管理
@Component
public class ServiceLogAspect {
    final static Logger log = LoggerFactory.getLogger(TestController.class);

    @Around("execution(* com.wt.service.impl..*.*(..))")
    public Object recordTimeLog(ProceedingJoinPoint joinPoint)throws Throwable {
        //使用日誌輸出  列印格式:某一個類(目標service),某一個方法(service執行方法)
        log.info("===開始執行{}.{}====="  //
                ,joinPoint.getTarget().getClass(), joinPoint.getSignature().getName() );
        //記錄開始時間
        long begin = System.currentTimeMillis();
        //執行目標
        Object result = joinPoint.proceed();
        //記錄結束時間
        long end = System.currentTimeMillis();
        long takeTime = end - begin;
        if(takeTime>3000) {
            log.error("=====執行結束,耗時間{}毫秒======",takeTime);
        }else if(takeTime>2000) {
            log.warn("======執行結束,耗時{}毫秒====", takeTime);
        }else {
            log.info("====執行結束, 耗時{}毫秒======",takeTime);
        }
        return result;
    }
}

3、測試介面controller的開發

    final static Logger logger = LoggerFactory.getLogger(TestController.class);

    @Resource
    private TestService testService;

    /*這裡是service切面日誌測試*/
    @GetMapping("/logErrorTest")
    public void logErrorTest() {
        testService.logTest(3);
    }

測試

  這個訪問了,會休眠3秒以後才會響應頁面,我們這個測試主要是想檢視超過三秒以後,打印出來的錯誤資訊。

  這個就是控制檯列印的資訊,訪問到service的方法,同時執行了切面的方法

  這個日誌還有個超級舒服的方式可以去檢視,就在本地檔案。

  上面這個路徑是我在日誌檔案中配置的,這個是api模組下的