springboot-日誌管理&任務調度

一、任務調度

  1. 定時任務的配置
    –schedule基本使用步驟:

    1)啓動類裏面 @EnableScheduling開啓定時任務,自動掃描

    @SpringBootApplication
    @EnableScheduling   //開啓 定時任務 自動掃描
    public class Springboot05Application {
        public static void main(String[] args) {
            SpringApplication.run(Springboot05Application.class, args);
        }
    }
    

    2)定時任務業務類 加註解 @Component被容器掃描
    3)定時執行的方法加上註解 @Scheduled(fixedRate=2000) 定期執行一次

    @Component
    public class TaskTest {
    
        @Scheduled(fixedRate = 2000)   //定時2秒執行一次
        public void test1(){
            System.out.println("任務調度1------" + new Date());
        }
    }
    
  2. 其他配置
    a、cron配置定時任務表達式https://tool.lu/crontab/
    b、fixedRate: 定時多久執行一次(上一次開始執行時間點後xx秒再次執行;)
    c、fixedDelay: 上一次執行結束時間點後xx秒再次執行
    d、fixedDelayString: 字符串形式,可以通過配置文件指定

    @Component
    public class TaskTest {
        @Scheduled(cron = "*/2 * * * * *")   //定時2秒執行一次
        public void test2(){
            System.out.println("任務調度2------" + new Date());
        }
    
        @Scheduled(fixedDelay = 3000)   //上一次執行結束時間點後3秒再次執行
        public void test3(){
            System.out.println("任務調度3------" + new Date());
        }
    
        @Scheduled(fixedDelayString = "3000")   //字符串形式,上一次執行結束時間點後3秒再次執行
        public void test4(){
            System.out.println("任務調度4------" + new Date());
        }
    
    }
    
  3. 配置異步定時任務

    a.啓動類需加註解:@EnableAsync

    @SpringBootApplication
    //@EnableAsync   //異步定時任務
    public class Springboot05Application {
        public static void main(String[] args) {
            SpringApplication.run(Springboot05Application.class, args);
        }
    }
    

    b.增加Future 返回結果 AsyncResult(“task執行完成”);
    c.如果需要拿到結果 需要判斷全部的 task.isDone()

    @RestController
    @RequestMapping("/api")
    public class AsyncController {
    
        @Autowired
        public AsyncTask asyncTask;
    
        @GetMapping("/async")
        public Object async() throws InterruptedException {
            long begin = System.currentTimeMillis();
            Future<String> future1 = asyncTask.test1();
            Future<String> future2 = asyncTask.test2();
            Future<String> future3 = asyncTask.test3();
    
            Thread.sleep(2000);
    
            while (true){
                if (future1.isDone() & future2.isDone() & future3.isDone()) {
                    break;         //異步接口內部都執行完畢,終止循環
                }
            }
            long end = System.currentTimeMillis();
    
            long time = end - begin;
            System.out.println("異步的總執行時間是:" + time);
            return JsonData.buildSuccess(time); //這調用了Json工具類
        }
    }
    

二、日誌管理

  1. 日誌介紹
    1.1、常用處理java的日誌組件 slf4j,log4j,logback,common-logging 等
    1.2、logBack是在log4j基礎的改良,但不能單獨使用,可配合slf4j使用
    1.3、logBack核心對象
    Logger: 日誌記錄器
    Appender:指定日誌輸出目的地,可以是控制檯或文件
    Layout: 日誌佈局,用於格式化日誌信息的輸出
    1.4、日誌級別:debug<info<warn<error
    1.5、 實例,見備註
    1.6、Log4j日誌轉換爲logBack在線工具(可以將log4j.properties文件內容轉成logback.xml) 網址:https://logback.qos.ch/translator/

    log4j實例:

    		===========log4j示例===========
            ### 設置###
            log4j.rootLogger = debug,stdout,D,E
    
            ### 輸出信息到控制擡 ###
            log4j.appender.stdout = org.apache.log4j.ConsoleAppender
            log4j.appender.stdout.Target = System.out
            log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
            log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
    
            ### 輸出DEBUG 級別以上的日誌到=D://logs/error.log ###
            log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
            log4j.appender.D.File = D://logs/log.log
            log4j.appender.D.Append = true
            log4j.appender.D.Threshold = DEBUG
            log4j.appender.D.layout = org.apache.log4j.PatternLayout
            log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
    
            ### 輸出ERROR 級別以上的日誌到=D://logs/error.log ###
            log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
            log4j.appender.E.File =C://logs/error.log 
            log4j.appender.E.Append = true
            log4j.appender.E.Threshold = ERROR
            log4j.appender.E.layout = org.apache.log4j.PatternLayout
            log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
    
            ===========logback============
    
  2. 整合自定義logback
    springboot整合logback參考文檔:
    https://docs.spring.io/spring-boot/docs/2.2.5.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-logging

    LogBack官網:https://logback.qos.ch/manual/index.html
    
    1、默認情況下,Spring Boot將日誌輸出到控制檯,日誌信息屬於logBack
    2、整合logBack
    在工程的Resources中創建日誌文件logback-spring.xml,官方推薦 -spring.xml結尾
    

    logback-spring.xml文件:

    <?xml version="1.0" encoding="UTF-8" ?>
    <configuration>
    
    	 <appender name="consoleApp" class="ch.qos.logback.core.ConsoleAppender">
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>
                    %date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
                </pattern>
            </layout>
        </appender>
    
        <appender name="fileInfoApp" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                 <level>ERROR</level>
                <onMatch>DENY</onMatch>
                <onMismatch>ACCEPT</onMismatch>
            </filter>
            <encoder>
                <pattern>
                    %date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
                </pattern>
            </encoder>
            <!-- 滾動策略 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 路徑 -->
                <fileNamePattern>app_log/log/app.info.%d.log</fileNamePattern>
            </rollingPolicy>
        </appender>
    
        <appender name="fileErrorApp" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>ERROR</level>
            </filter>
            <encoder>
                <pattern>
                    %date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
                </pattern>
            </encoder>
            
            <!-- 設置滾動策略 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 路徑 -->
                <fileNamePattern>app_log/log/app.err.%d.log</fileNamePattern>
                
                <!-- 控制保留的歸檔文件的最大數量,超出數量就刪除舊文件,假設設置每個月滾動,
                且<maxHistory> 是1,則只保存最近1個月的文件,刪除之前的舊文件 -->
                 <MaxHistory>1</MaxHistory>
                
            </rollingPolicy>
        </appender>
       <root level="INFO">  
            <appender-ref ref="consoleApp"/>
            <appender-ref ref="fileInfoApp"/>
            <appender-ref ref="fileErrorApp"/>
        </root>
    </configuration>
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章