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();