Przeglądaj źródła

添加日志的收集

niantuo 6 lat temu
rodzic
commit
77d61af6d8

+ 2 - 2
build.gradle

@@ -17,8 +17,8 @@ buildscript {
         shiro_version = '1.4.0'
         pinyin4j_version = '2.5.1'
         rxJavaVersion='2.2.3'
-        jwtVersion = '1.3.9'
-        authVersion='1.1.7'
+        jwtVersion = '1.4.0'
+        authVersion='1.1.8'
     }
     repositories {
         mavenCentral()

+ 17 - 0
cloud-bus/src/main/java/cn/gygxzc/envir/bus/RabbitConfiguration.java

@@ -1,6 +1,10 @@
 package cn.gygxzc.envir.bus;
 
 import cn.gygxzc.tina.cloud.bus.constant.QueueName;
+import cn.gygxzc.tina.cloud.bus.framweork.receiver.LoggerReceiver;
+import cn.gygxzc.tina.cloud.bus.messager.sender.IMessagerSender;
+import cn.gygxzc.tina.cloud.bus.messager.sender.impl.MessagerSender;
+import org.springframework.amqp.core.AmqpTemplate;
 import org.springframework.amqp.core.Queue;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ComponentScan;
@@ -28,9 +32,22 @@ public class RabbitConfiguration {
         return new Queue(QueueName.Framework);
     }
 
+
+    @Bean
+    public IMessagerSender messagerSender(AmqpTemplate template){
+        return new MessagerSender(template);
+    }
+
+
 //    @Bean
 //    public Queue logQueue(){
 //        return  new Queue(QueueName.LOG);
 //    }
+//
+
+//    @Bean
+//    public LoggerReceiver loggerReceiver(){
+//        return new LoggerReceiver();
+//    }
 
 }

+ 12 - 6
cloud-bus/src/main/java/cn/gygxzc/tina/cloud/bus/framweork/receiver/LoggerReceiver.java

@@ -1,16 +1,22 @@
 package cn.gygxzc.tina.cloud.bus.framweork.receiver;
 
+import cn.gygxzc.envir.core.logger.LogMessage;
+import cn.gygxzc.tina.cloud.bus.constant.QueueName;
+import org.springframework.amqp.rabbit.annotation.RabbitHandler;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.stereotype.Component;
+
 /**
  * Created by niantuo on 2018/11/5.
  * 日志收集器.
  */
-//@Component
-//@RabbitListener(queues = QueueName.LOG)
+@Component
+@RabbitListener(queues = QueueName.LOG)
 public class LoggerReceiver {
 
-//    @RabbitHandler
-//    public void mqLog(String message) {
-//        LogMessage logMessage = GsonUtils.fromJson(LogMessage.class,message);
-//    }
+    @RabbitHandler
+    public void mqLog(LogMessage message) {
+        System.out.printf("message:%s",message);
+    }
 
 }

+ 3 - 2
cloud-bus/src/main/java/cn/gygxzc/tina/cloud/bus/messager/sender/impl/MessagerSender.java

@@ -4,7 +4,6 @@ import cn.gygxzc.envir.core.logger.LogMessage;
 import cn.gygxzc.tina.cloud.bus.constant.QueueName;
 import cn.gygxzc.tina.cloud.bus.messager.bean.MessageBean;
 import cn.gygxzc.tina.cloud.bus.messager.sender.IMessagerSender;
-import cn.gygxzc.tina.cloud.bus.utils.GsonUtils;
 import org.springframework.amqp.core.AmqpTemplate;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -36,6 +35,8 @@ public class MessagerSender implements IMessagerSender {
 
     @Override
     public void send(LogMessage message) {
-        amqpTemplate.convertAndSend(QueueName.LOG, GsonUtils.toJson(message));
+        amqpTemplate.convertAndSend(QueueName.LOG, message);
     }
+
+
 }

+ 108 - 0
zen-core/src/main/java/cn/gygxzc/envir/core/logger/CoreLoggerEvent.java

@@ -0,0 +1,108 @@
+package cn.gygxzc.envir.core.logger;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.classic.spi.IThrowableProxy;
+import ch.qos.logback.classic.spi.LoggerContextVO;
+import cn.gygxzc.tina.cloud.jwt.session.bean.User;
+import org.slf4j.Marker;
+
+import java.util.Map;
+
+/**
+ * @author tuonina
+ * @createTime 2019/3/25
+ */
+public class CoreLoggerEvent implements ILoggingEvent {
+
+
+    private ILoggingEvent realEvent;
+    private User user;
+
+    public CoreLoggerEvent(ILoggingEvent event){
+        this.realEvent = event;
+    }
+
+    public void setUser(User user) {
+        this.user = user;
+    }
+
+    public User getUser() {
+        return user;
+    }
+
+    @Override
+    public String getThreadName() {
+        return realEvent.getThreadName();
+    }
+
+    @Override
+    public Level getLevel() {
+        return realEvent.getLevel();
+    }
+
+    @Override
+    public String getMessage() {
+        return realEvent.getMessage();
+    }
+
+    @Override
+    public Object[] getArgumentArray() {
+        return realEvent.getArgumentArray();
+    }
+
+    @Override
+    public String getFormattedMessage() {
+        return realEvent.getFormattedMessage();
+    }
+
+    @Override
+    public String getLoggerName() {
+        return realEvent.getLoggerName();
+    }
+
+    @Override
+    public LoggerContextVO getLoggerContextVO() {
+        return realEvent.getLoggerContextVO();
+    }
+
+    @Override
+    public IThrowableProxy getThrowableProxy() {
+        return realEvent.getThrowableProxy();
+    }
+
+    @Override
+    public StackTraceElement[] getCallerData() {
+        return realEvent.getCallerData();
+    }
+
+    @Override
+    public boolean hasCallerData() {
+        return realEvent.hasCallerData();
+    }
+
+    @Override
+    public Marker getMarker() {
+        return realEvent.getMarker();
+    }
+
+    @Override
+    public Map<String, String> getMDCPropertyMap() {
+        return realEvent.getMDCPropertyMap();
+    }
+
+    @Override
+    public Map<String, String> getMdc() {
+        return realEvent.getMdc();
+    }
+
+    @Override
+    public long getTimeStamp() {
+        return realEvent.getTimeStamp();
+    }
+
+    @Override
+    public void prepareForDeferredProcessing() {
+        realEvent.prepareForDeferredProcessing();
+    }
+}

+ 13 - 0
zen-core/src/main/java/cn/gygxzc/envir/core/logger/IMarkerName.java

@@ -0,0 +1,13 @@
+package cn.gygxzc.envir.core.logger;
+
+/**
+ * @author tuonina
+ * @createTime 2019/3/25
+ */
+public interface IMarkerName {
+
+    String REQ="REQ";
+    String OP="OP";
+    String ERR="ERR";
+    String BIZ_ERR="BIZ_ERR";
+}

+ 41 - 3
zen-core/src/main/java/cn/gygxzc/envir/core/logger/LogMessage.java

@@ -2,13 +2,20 @@ package cn.gygxzc.envir.core.logger;
 
 import ch.qos.logback.classic.spi.ILoggingEvent;
 import cn.gygxzc.envir.core.utils.GsonUtils;
+import cn.gygxzc.tina.cloud.jwt.session.bean.User;
+import org.slf4j.Marker;
+
+import java.io.Serializable;
 
 /**
  * Created by niantuo on 2018/11/5.
  * 分布式日志记录
  */
 
-public class LogMessage {
+public class LogMessage implements Serializable {
+
+
+    public static final long serialVersionUID = 1L;
 
     private String sysName;
     private String threadName;
@@ -21,8 +28,14 @@ public class LogMessage {
     private String marker;
     private String propertyMap;
     private Long timeStamp;
+    private Long userId;
+    private String account;
+
+    public LogMessage() {
 
-    public LogMessage(ILoggingEvent event,String name) {
+    }
+
+    public LogMessage(ILoggingEvent event, String name) {
         this.sysName = name;
         this.threadName = event.getThreadName();
         level = event.getLevel().levelStr;
@@ -31,9 +44,34 @@ public class LogMessage {
         formattedMessage = event.getFormattedMessage();
         loggerName = event.getLoggerName();
         callerData = GsonUtils.toJson(event.getCallerData());
-        marker = GsonUtils.toJson(event.getMarker());
         propertyMap = GsonUtils.toJson(event.getMDCPropertyMap());
         timeStamp = event.getTimeStamp();
+        Marker eventMarker = event.getMarker();
+        if (eventMarker != null) {
+            marker = eventMarker.toString();
+        }
+    }
+
+    public void setUser(User user){
+        if (user==null)return;
+        setUserId(user.getId());
+        setAccount(user.getAccount());
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setAccount(String account) {
+        this.account = account;
+    }
+
+    public String getAccount() {
+        return account;
     }
 
     public void setSysName(String sysName) {

+ 1 - 11
zen-core/src/main/java/cn/gygxzc/envir/core/logger/MQAppender.java

@@ -16,8 +16,6 @@ public class MQAppender extends AppenderBase<ILoggingEvent> {
 
     private ILoggerSender mMessageSender;
     private String sysName;
-    private int maxRetryCount = 5;
-    private int currentCount = 0;
 
     public MQAppender() {
         logger.debug("construct");
@@ -32,9 +30,8 @@ public class MQAppender extends AppenderBase<ILoggingEvent> {
     }
 
     private void ensureSender() {
-        if (mMessageSender == null && currentCount < maxRetryCount) {
+        if (mMessageSender == null) {
             mMessageSender = ApplicationUtils.getBean(ILoggerSender.class);
-            currentCount++;
         }
     }
 
@@ -48,11 +45,4 @@ public class MQAppender extends AppenderBase<ILoggingEvent> {
         }
     }
 
-    public void setMaxRetryCount(int maxRetryCount) {
-        this.maxRetryCount = maxRetryCount;
-    }
-
-    public int getMaxRetryCount() {
-        return maxRetryCount;
-    }
 }

+ 87 - 0
zen-core/src/main/java/cn/gygxzc/envir/core/logger/MQAsyncAppender.java

@@ -0,0 +1,87 @@
+package cn.gygxzc.envir.core.logger;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.AsyncAppenderBase;
+import ch.qos.logback.core.spi.FilterReply;
+import ch.qos.logback.core.status.WarnStatus;
+import cn.gygxzc.tina.cloud.jwt.session.utils.SessionUtils;
+
+/**
+ * @author tuonina
+ * @createTime 2019/3/25
+ */
+public class MQAsyncAppender extends AsyncAppenderBase<ILoggingEvent> {
+
+
+    private boolean includeCallerData = false;
+    /**
+     * The guard prevents an appender from repeatedly calling its own doAppend
+     * method.
+     */
+    private ThreadLocal<Boolean> guard = new ThreadLocal<Boolean>();
+    private int statusRepeatCount = 0;
+    private int exceptionCount = 0;
+    private static final int ALLOWED_REPEATS = 3;
+
+
+    @Override
+    public void doAppend(ILoggingEvent eventObject) {
+        // WARNING: The guard check MUST be the first statement in the
+        // doAppend() method.
+        // prevent re-entry.
+        if (Boolean.TRUE.equals(guard.get())) {
+            return;
+        }
+        try {
+            guard.set(Boolean.TRUE);
+            if (!this.started) {
+                if (statusRepeatCount++ < ALLOWED_REPEATS) {
+                    addStatus(new WarnStatus("Attempted to append to non started appender [" + name + "].", this));
+                }
+                return;
+            }
+
+            if (getFilterChainDecision(eventObject) == FilterReply.DENY) {
+                return;
+            }
+
+            CoreLoggerEvent loggerEvent = new CoreLoggerEvent(eventObject);
+            loggerEvent.setUser(SessionUtils.getUser());
+            // ok, we now invoke derived class' implementation of append
+            this.append(loggerEvent);
+
+        } catch (Exception e) {
+            if (exceptionCount++ < ALLOWED_REPEATS) {
+                addError("Appender [" + name + "] failed to append.", e);
+            }
+        } finally {
+            guard.set(Boolean.FALSE);
+        }
+    }
+
+    /**
+     * Events of level TRACE, DEBUG and INFO are deemed to be discardable.
+     *
+     * @param event
+     * @return true if the event is of level TRACE, DEBUG or INFO false otherwise.
+     */
+    protected boolean isDiscardable(ILoggingEvent event) {
+        Level level = event.getLevel();
+        return level.toInt() <= Level.INFO_INT;
+    }
+
+    protected void preprocess(ILoggingEvent eventObject) {
+        eventObject.prepareForDeferredProcessing();
+        if (includeCallerData)
+            eventObject.getCallerData();
+    }
+
+    public boolean isIncludeCallerData() {
+        return includeCallerData;
+    }
+
+    public void setIncludeCallerData(boolean includeCallerData) {
+        this.includeCallerData = includeCallerData;
+    }
+}

+ 16 - 1
zen-core/src/main/kotlin/cn/gygxzc/envir/core/CoreConfiguration.kt

@@ -1,8 +1,23 @@
 package cn.gygxzc.envir.core
 
+import cn.gygxzc.cloud.tina.auth.AUTH_REDIS_TEMPLATE
+import cn.gygxzc.cloud.tina.auth.shiro.cache.ShiroCacheManager
+import org.apache.shiro.cache.CacheManager
+import org.springframework.beans.factory.annotation.Qualifier
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
+import org.springframework.context.annotation.Bean
+import org.springframework.context.annotation.Configuration
+import org.springframework.data.redis.core.RedisTemplate
+
 /**
  * Created by niantuo on 2018/11/1.
  */
-
+@Configuration
 class CoreConfiguration {
+
+    @Bean
+    @ConditionalOnMissingBean(CacheManager::class)
+    fun shiroRedisCacheManager(@Qualifier(AUTH_REDIS_TEMPLATE) redisTemplate: RedisTemplate<String, Any>):CacheManager{
+        return ShiroCacheManager(redisTemplate)
+    }
 }

+ 5 - 2
zen-core/src/main/kotlin/com/gxzc/zen/common/exception/aop/BaseControllerExceptionHandler.kt

@@ -1,9 +1,12 @@
 package com.gxzc.zen.common.exception.aop
 
+import cn.gygxzc.envir.core.logger.IMarkerName
 import com.gxzc.zen.common.base.tips.ErrorTip
 import com.gxzc.zen.common.exception.ZenException
 import com.gxzc.zen.common.exception.ZenExceptionEnum
+import org.slf4j.IMarkerFactory
 import org.slf4j.LoggerFactory
+import org.slf4j.MarkerFactory
 import org.springframework.http.HttpStatus
 import org.springframework.web.bind.annotation.ControllerAdvice
 import org.springframework.web.bind.annotation.ExceptionHandler
@@ -30,7 +33,7 @@ class BaseControllerExceptionHandler {
     @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
     @ResponseBody // Convert to Json
     fun zenException(e: ZenException): ErrorTip {
-        logger.error("系统异常:", e)
+        logger.error(MarkerFactory.getMarker(IMarkerName.BIZ_ERR),"业务异常",e)
         return ErrorTip(e.code, e.message)
     }
 
@@ -41,7 +44,7 @@ class BaseControllerExceptionHandler {
     @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
     @ResponseBody
     fun runtimeException(e: RuntimeException): ErrorTip {
-        logger.error("运行时异常:", e)
+        logger.error(MarkerFactory.getMarker(IMarkerName.BIZ_ERR),"业务异常",e)
         return ErrorTip(ZenExceptionEnum.SERVER_ERROR.code, e.message ?: "")
     }
 }

+ 1 - 1
zen-web/build.gradle

@@ -12,7 +12,7 @@ buildscript {
 
 dependencies {
     compile project(":zen-api")
-//    compile project(':cloud-bus')
+    compile project(':cloud-bus')
     compile project(':fastdfs-client')
 }
 

+ 3 - 0
zen-web/src/main/kotlin/cn/gygxzc/envir/api/test/controller/TestLogController.kt

@@ -1,8 +1,10 @@
 package cn.gygxzc.envir.api.test.controller
 
+import cn.gygxzc.envir.core.logger.IMarkerName
 import cn.gygxzc.envir.test.model.TestLog
 import cn.gygxzc.envir.test.service.ITestLogService
 import org.slf4j.LoggerFactory
+import org.slf4j.MarkerFactory
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.web.bind.annotation.*
 
@@ -28,6 +30,7 @@ class TestLogController {
     fun add(@RequestBody log: TestLog) {
         val result = testLogService.addLog(log)
         logger.info("add result:{}", result)
+        logger.info(MarkerFactory.getMarker(IMarkerName.OP),"add result:{}",result)
     }
 
     /**

+ 1 - 1
zen-web/src/main/resources/logback-spring.xml

@@ -148,7 +148,7 @@
         <sysName>${appName}</sysName>
     </appender>
     <!--实现分布式收集日志的appender-->
-    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
+    <appender name="ASYNC" class="cn.gygxzc.envir.core.logger.MQAsyncAppender">
         <appender-ref ref="MQ"/>
     </appender>