Browse Source

修改为log42j异步打印日志。

tianyunperfect 5 years ago
parent
commit
11d9eee5a4

+ 4 - 4
README.md

@@ -1,5 +1,5 @@
 # springboot-base
-可以直接使用的springboot-web架构
+可以直接使用的springboot-web架构,包含常用功能。
 
 ## 项目模块
 ```$xslt
@@ -10,9 +10,9 @@ common
 ### 包含功能
 
 - springboot-web示例
-- 日志打印
-- 异常捕获
-- controller Long类型数据自动转换
+- log4j2 日志异步打印
+- 自动捕获web异常
+- controller Long 类型数据自动转换
 
 
 ### 怎么修改jar包名称

+ 18 - 0
app/pom.xml

@@ -28,6 +28,13 @@
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
+            <exclusions>
+                <!--排除logback-->
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-logging</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -44,6 +51,17 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-aop</artifactId>
         </dependency>
+        <!--log4j2 依赖-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-log4j2</artifactId>
+        </dependency>
+        <!--异步日志依赖-->
+        <dependency>
+            <groupId>com.lmax</groupId>
+            <artifactId>disruptor</artifactId>
+            <version>3.3.7</version>
+        </dependency>
 
         <dependency>
             <groupId>com.alvin</groupId>

+ 2 - 0
app/src/main/java/com/alvin/Application.java

@@ -7,6 +7,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 @SpringBootApplication
 public class Application implements CommandLineRunner {
     public static void main(String[] args) {
+        //日志异步
+        System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
         SpringApplication.run(Application.class, args);
     }
 

+ 1 - 1
app/src/main/java/com/alvin/aspect/LogAspect.java

@@ -28,7 +28,7 @@ public class LogAspect {
     }
 
     @Around("webLog()")
-    public Object doBefore(ProceedingJoinPoint joinPoint) throws Throwable {
+    public Object webAop(ProceedingJoinPoint joinPoint) throws Throwable {
         /*
          * 执行方法之前
          */

+ 3 - 0
app/src/main/java/com/alvin/controller/AppController.java

@@ -3,12 +3,14 @@ package com.alvin.controller;
 import com.alvin.common.entity.PageResult;
 import com.alvin.common.entity.Result;
 import com.alvin.entity.User;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.Collections;
 
+@Slf4j
 @RestController
 @RequestMapping("/user")
 public class AppController {
@@ -22,6 +24,7 @@ public class AppController {
         User user = new User();
         user.setName("小米");
         user.setAge(18);
+        log.info(user.toString());
         return Result.success(user);
     }
 

+ 67 - 0
app/src/main/resources/log4j2.xml

@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
+<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
+<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
+<configuration status="WARN" monitorInterval="30">
+    <properties>
+        <property name="logDir" value="log"/>
+    </properties>
+    <!--先定义所有的appender-->
+    <appenders>
+        <!--这个输出控制台的配置-->
+        <console name="Console" target="SYSTEM_OUT">
+            <!--输出日志的格式-->
+            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
+        </console>
+        <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
+        <File name="log" fileName="${logDir}/test.log" append="false">
+            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
+        </File>
+        <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
+        <RollingRandomAccessFile name="RollingFileInfo" fileName="${logDir}/info.log"
+                     filePattern="${logDir}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log"
+                                 immediateFlush="false">
+            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
+            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
+            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
+            <Policies>
+                <TimeBasedTriggeringPolicy/>
+                <SizeBasedTriggeringPolicy size="500 MB"/>
+            </Policies>
+        </RollingRandomAccessFile>
+        <RollingRandomAccessFile name="RollingFileWarn" fileName="${logDir}/warn.log"
+                     filePattern="${logDir}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log"
+                                 immediateFlush="false">
+            <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
+            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
+            <Policies>
+                <TimeBasedTriggeringPolicy/>
+                <SizeBasedTriggeringPolicy size="500 MB"/>
+            </Policies>
+            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
+            <DefaultRolloverStrategy max="20"/>
+        </RollingRandomAccessFile>
+        <RollingRandomAccessFile name="RollingFileError" fileName="${logDir}/error.log"
+                     filePattern="${logDir}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log"
+                                 immediateFlush="false">
+            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
+            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
+            <Policies>
+                <TimeBasedTriggeringPolicy/>
+                <SizeBasedTriggeringPolicy size="500 MB"/>
+            </Policies>
+        </RollingRandomAccessFile>
+    </appenders>
+    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
+    <loggers>
+        <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
+        <logger name="org.springframework" level="INFO"/>
+        <logger name="org.mybatis" level="INFO"/>
+        <root level="all" includeLocation="true">
+            <appender-ref ref="Console"/>
+            <appender-ref ref="RollingFileInfo"/>
+            <appender-ref ref="RollingFileWarn"/>
+            <appender-ref ref="RollingFileError"/>
+        </root>
+    </loggers>
+</configuration>

+ 0 - 82
app/src/main/resources/logback-spring.xml

@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<configuration scan="true" scanPeriod="60 seconds" debug="false">
-
-    <contextName>logback</contextName>
-    <property name="logback.logdir" value="./log/"/>
-    <property name="logback.appname" value="java"/>
-
-    <!--输出到控制台 ConsoleAppender-->
-    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
-        <!--展示格式 layout-->
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%d [%thread] %-5level %logger{36} %line : %msg%n</pattern>
-        </layout>
-    </appender>
-
-    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!--如果只是想要 Info 级别的日志,只是过滤 info 还是会输出 Error 日志,因为 Error 的级别高,
-        所以我们使用下面的策略,可以避免输出 Error 的日志-->
-        <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <!--过滤 Error-->
-            <level>ERROR</level>
-            <!--匹配到就禁止-->
-            <onMatch>DENY</onMatch>
-            <!--没有匹配到就允许-->
-            <onMismatch>ACCEPT</onMismatch>
-        </filter>
-        <!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
-            如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
-            的日志改名为今天的日期。即,<File> 的日志都是当天的。
-        -->
-        <File>${logback.logdir}/info.${logback.appname}.log</File>
-        <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
-        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
-            <FileNamePattern>${logback.logdir}/info.${logback.appname}.%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="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!--如果只是想要 Error 级别的日志,那么需要过滤一下,默认是 info 级别的,ThresholdFilter-->
-        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
-            <level>Error</level>
-        </filter>
-        <!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
-            如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
-            的日志改名为今天的日期。即,<File> 的日志都是当天的。
-        -->
-        <File>${logback.logdir}/error.${logback.appname}.log</File>
-        <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
-        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
-            <FileNamePattern>${logback.logdir}/error.${logback.appname}.%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>
-
-    <!--指定最基础的日志输出级别-->
-    <root level="INFO">
-        <!--appender将会添加到这个loger-->
-        <appender-ref ref="console"/>
-        <appender-ref ref="fileInfoLog"/>
-        <appender-ref ref="fileErrorLog"/>
-    </root>
-
-</configuration>

+ 9 - 0
app/src/test/java/com/alvin/controller/AppControllerTest.java

@@ -1,10 +1,14 @@
 package com.alvin.controller;
 
+import lombok.extern.slf4j.Slf4j;
 import org.junit.Test;
 import org.springframework.http.MediaType;
 import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
 import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
 
+import java.util.Date;
+
+@Slf4j
 public class AppControllerTest extends TestBase {
 
     @Test
@@ -17,4 +21,9 @@ public class AppControllerTest extends TestBase {
                 .andReturn();
         //System.out.println(mvcResult.getResponse().getContentAsString());
     }
+
+    @Test
+    public void testLog() {
+        log.info(new Date().toString());
+    }
 }

+ 20 - 1
common/pom.xml

@@ -11,5 +11,24 @@
 
     <artifactId>common</artifactId>
 
-
+    <dependencies>
+        <!-- lombok -->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.4</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.56</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>2.8.5</version>
+        </dependency>
+    </dependencies>
 </project>

+ 0 - 23
pom.xml

@@ -25,29 +25,6 @@
         <java.version>1.8</java.version>
     </properties>
 
-    <dependencies>
-
-
-        <!-- lombok -->
-        <dependency>
-            <groupId>org.projectlombok</groupId>
-            <artifactId>lombok</artifactId>
-            <version>1.18.4</version>
-        </dependency>
-        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
-        <dependency>
-            <groupId>com.alibaba</groupId>
-            <artifactId>fastjson</artifactId>
-            <version>1.2.56</version>
-        </dependency>
-        <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
-        <dependency>
-            <groupId>com.google.code.gson</groupId>
-            <artifactId>gson</artifactId>
-            <version>2.8.5</version>
-        </dependency>
-    </dependencies>
-
     <!--锁定springCloud版本-->
     <dependencyManagement>
         <dependencies>