You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by li...@apache.org on 2022/06/10 06:27:04 UTC

[dubbo] branch 3.0 updated: [3.0] Cherry pick #9978 to 3.0 (#10040)

This is an automated email from the ASF dual-hosted git repository.

liujun pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.0 by this push:
     new 25d9daac52 [3.0] Cherry pick #9978 to 3.0 (#10040)
25d9daac52 is described below

commit 25d9daac52549070f6b027e7044f11927f1f5e49
Author: Wang Chengming <63...@qq.com>
AuthorDate: Fri Jun 10 14:26:54 2022 +0800

    [3.0] Cherry pick #9978 to 3.0 (#10040)
---
 .../apache/dubbo/rpc/filter/AccessLogFilter.java   | 50 +++++++++++-----------
 .../dubbo/rpc/filter/AccessLogFilterTest.java      |  4 +-
 2 files changed, 27 insertions(+), 27 deletions(-)

diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/AccessLogFilter.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/AccessLogFilter.java
index 7ab0188d66..8826c3708d 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/AccessLogFilter.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/AccessLogFilter.java
@@ -20,7 +20,6 @@ import org.apache.dubbo.common.extension.Activate;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.common.threadpool.manager.FrameworkExecutorRepository;
-import org.apache.dubbo.common.utils.ConcurrentHashSet;
 import org.apache.dubbo.common.utils.ConfigUtils;
 import org.apache.dubbo.rpc.Filter;
 import org.apache.dubbo.rpc.Invocation;
@@ -35,10 +34,10 @@ import java.io.IOException;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Date;
-import java.util.Iterator;
 import java.util.Map;
-import java.util.Set;
+import java.util.Queue;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 
@@ -75,10 +74,12 @@ public class AccessLogFilter implements Filter {
     // It's safe to declare it as singleton since it runs on single thread only
     private final DateFormat fileNameFormatter = new SimpleDateFormat(FILE_DATE_FORMAT);
 
-    private final Map<String, Set<AccessLogData>> logEntries = new ConcurrentHashMap<>();
+    private final Map<String, Queue<AccessLogData>> logEntries = new ConcurrentHashMap<>();
 
     private AtomicBoolean scheduled = new AtomicBoolean();
 
+    private static final String LINE_SEPARATOR = "line.separator";
+
     /**
      * Default constructor initialize demon thread for writing into access log file with names with access log key
      * defined in url <b>accesslog</b>
@@ -104,7 +105,7 @@ public class AccessLogFilter implements Filter {
         try {
             String accessLogKey = invoker.getUrl().getParameter(ACCESS_LOG_KEY);
             if (ConfigUtils.isNotEmpty(accessLogKey)) {
-                AccessLogData logData = AccessLogData.newLogData(); 
+                AccessLogData logData = AccessLogData.newLogData();
                 logData.buildAccessLogData(invoker, inv);
                 log(accessLogKey, logData);
             }
@@ -115,20 +116,20 @@ public class AccessLogFilter implements Filter {
     }
 
     private void log(String accessLog, AccessLogData accessLogData) {
-        Set<AccessLogData> logSet = logEntries.computeIfAbsent(accessLog, k -> new ConcurrentHashSet<>());
+        Queue<AccessLogData> logQueue = logEntries.computeIfAbsent(accessLog, k -> new ConcurrentLinkedQueue<>());
 
-        if (logSet.size() < LOG_MAX_BUFFER) {
-            logSet.add(accessLogData);
+        if (logQueue.size() < LOG_MAX_BUFFER) {
+            logQueue.add(accessLogData);
         } else {
             logger.warn("AccessLog buffer is full. Do a force writing to file to clear buffer.");
             //just write current logSet to file.
-            writeLogSetToFile(accessLog, logSet);
+            writeLogSetToFile(accessLog, logQueue);
             //after force writing, add accessLogData to current logSet
-            logSet.add(accessLogData);
+            logQueue.add(accessLogData);
         }
     }
 
-    private void writeLogSetToFile(String accessLog, Set<AccessLogData> logSet) {
+    private void writeLogSetToFile(String accessLog, Queue<AccessLogData> logSet) {
         try {
             if (ConfigUtils.isDefault(accessLog)) {
                 processWithServiceLogger(logSet);
@@ -148,23 +149,24 @@ public class AccessLogFilter implements Filter {
 
     private void writeLogToFile() {
         if (!logEntries.isEmpty()) {
-            for (Map.Entry<String, Set<AccessLogData>> entry : logEntries.entrySet()) {
+            for (Map.Entry<String, Queue<AccessLogData>> entry : logEntries.entrySet()) {
                 String accessLog = entry.getKey();
-                Set<AccessLogData> logSet = entry.getValue();
+                Queue<AccessLogData> logSet = entry.getValue();
                 writeLogSetToFile(accessLog, logSet);
             }
         }
     }
 
-    private void processWithAccessKeyLogger(Set<AccessLogData> logSet, File file) throws IOException {
-        try (FileWriter writer = new FileWriter(file, true)) {
-            for (Iterator<AccessLogData> iterator = logSet.iterator();
-                 iterator.hasNext();
-                 iterator.remove()) {
-                writer.write(iterator.next().getLogMessage());
-                writer.write(System.getProperty("line.separator"));
+    private void processWithAccessKeyLogger(Queue<AccessLogData> logQueue, File file) throws IOException {
+        FileWriter writer = new FileWriter(file, true);
+        try {
+            while (!logQueue.isEmpty()) {
+                writer.write(logQueue.poll().getLogMessage());
+                writer.write(System.getProperty(LINE_SEPARATOR));
             }
+        } finally {
             writer.flush();
+            writer.close();
         }
     }
 
@@ -180,11 +182,9 @@ public class AccessLogFilter implements Filter {
         return logData;
     }
 
-    private void processWithServiceLogger(Set<AccessLogData> logSet) {
-        for (Iterator<AccessLogData> iterator = logSet.iterator();
-             iterator.hasNext();
-             iterator.remove()) {
-            AccessLogData logData = iterator.next();
+    private void processWithServiceLogger(Queue<AccessLogData> logQueue) {
+        while (!logQueue.isEmpty()) {
+            AccessLogData logData = logQueue.poll();
             LoggerFactory.getLogger(LOG_KEY + "." + logData.getServiceName()).info(logData.getLogMessage());
         }
     }
diff --git a/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/filter/AccessLogFilterTest.java b/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/filter/AccessLogFilterTest.java
index 7cb7ccde25..fb58a69fdc 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/filter/AccessLogFilterTest.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/filter/AccessLogFilterTest.java
@@ -30,7 +30,7 @@ import org.junit.jupiter.api.Test;
 
 import java.lang.reflect.Field;
 import java.util.Map;
-import java.util.Set;
+import java.util.Queue;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -69,7 +69,7 @@ public class AccessLogFilterTest {
 
         accessLogFilter.invoke(invoker, invocation);
 
-        Map<String, Set<AccessLogData>> logs = (Map<String, Set<AccessLogData>>) field.get(accessLogFilter);
+        Map<String, Queue<AccessLogData>> logs = (Map<String, Queue<AccessLogData>>) field.get(accessLogFilter);
         assertFalse(logs.isEmpty());
         assertFalse(logs.get("true").isEmpty());
         AccessLogData log = logs.get("true").iterator().next();