This is an automated email from the ASF dual-hosted git repository.
chufenggao pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git
The following commit(s) were added to refs/heads/dev by this push:
new aa79c01ce9 [Feature-13419][Remote Logging] Add support for writing
task logs to S3 (#13649)
aa79c01ce9 is described below
commit aa79c01ce9a2b81f74e2e3b8ebffa9f69ddc392e
Author: Rick Cheng <[email protected]>
AuthorDate: Mon Mar 13 19:36:12 2023 +0800
[Feature-13419][Remote Logging] Add support for writing task logs to S3
(#13649)
* [Feature-13419][Remote Logging] Add support for writing task logs to S3
* Update
dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/log/remote/S3RemoteLogHandler.java
Co-authored-by: caishunfeng <[email protected]>
* use try with resource
* remove unnecessary log
---------
Co-authored-by: caishunfeng <[email protected]>
---
docs/docs/en/guide/remote-logging.md | 17 ++
docs/docs/zh/guide/remote-logging.md | 19 ++-
dolphinscheduler-common/pom.xml | 5 +
.../common/constants/Constants.java | 14 ++
.../common/log/remote/OssRemoteLogHandler.java | 38 ++---
.../common/log/remote/RemoteLogHandlerFactory.java | 16 +-
.../common/log/remote/RemoteLogService.java | 3 +-
.../common/log/remote/RemoteLogUtils.java | 17 +-
.../common/log/remote/S3RemoteLogHandler.java | 178 +++++++++++++++++++++
.../src/main/resources/common.properties | 10 ++
...gHandlerTest.java => RemoteLogHandlerTest.java} | 12 +-
11 files changed, 288 insertions(+), 41 deletions(-)
diff --git a/docs/docs/en/guide/remote-logging.md
b/docs/docs/en/guide/remote-logging.md
index add7a58485..205c80405f 100644
--- a/docs/docs/en/guide/remote-logging.md
+++ b/docs/docs/en/guide/remote-logging.md
@@ -33,3 +33,20 @@ remote.logging.oss.bucket.name=<bucket.name>
remote.logging.oss.endpoint=<endpoint>
```
+## Writing task logs to [Amazon S3](https://aws.amazon.com/cn/s3/)
+
+Configure `common.properties` as follows:
+
+```properties
+# s3 access key id, required if you set remote.logging.target=S3
+remote.logging.s3.access.key.id=<access.key.id>
+# s3 access key secret, required if you set remote.logging.target=S3
+remote.logging.s3.access.key.secret=<access.key.secret>
+# s3 bucket name, required if you set remote.logging.target=S3
+remote.logging.s3.bucket.name=<bucket.name>
+# s3 endpoint, required if you set remote.logging.target=S3
+remote.logging.s3.endpoint=<endpoint>
+# s3 region, required if you set remote.logging.target=S3
+remote.logging.s3.region=<region>
+```
+
diff --git a/docs/docs/zh/guide/remote-logging.md
b/docs/docs/zh/guide/remote-logging.md
index 0adde98e7a..9accca4bac 100644
--- a/docs/docs/zh/guide/remote-logging.md
+++ b/docs/docs/zh/guide/remote-logging.md
@@ -10,7 +10,7 @@ Apache DolphinScheduler支持将任务日志传输到远端存储上。当配置
```properties
# 是否开启远程日志存储
remote.logging.enable=true
-# 任务日志写入的远端存储,目前仅支持OSS
+# 任务日志写入的远端存储,目前支持OSS, S3
remote.logging.target=OSS
# 任务日志在远端存储上的目录
remote.logging.base.dir=logs
@@ -33,3 +33,20 @@ remote.logging.oss.bucket.name=<bucket.name>
remote.logging.oss.endpoint=<endpoint>
```
+## 将任务日志写入[Amazon S3](https://aws.amazon.com/cn/s3/)
+
+配置`common.propertis`如下:
+
+```properties
+# s3 access key id, required if you set remote.logging.target=S3
+remote.logging.s3.access.key.id=<access.key.id>
+# s3 access key secret, required if you set remote.logging.target=S3
+remote.logging.s3.access.key.secret=<access.key.secret>
+# s3 bucket name, required if you set remote.logging.target=S3
+remote.logging.s3.bucket.name=<bucket.name>
+# s3 endpoint, required if you set remote.logging.target=S3
+remote.logging.s3.endpoint=<endpoint>
+# s3 region, required if you set remote.logging.target=S3
+remote.logging.s3.region=<region>
+```
+
diff --git a/dolphinscheduler-common/pom.xml b/dolphinscheduler-common/pom.xml
index 652e15dc19..a67425b51c 100644
--- a/dolphinscheduler-common/pom.xml
+++ b/dolphinscheduler-common/pom.xml
@@ -88,6 +88,11 @@
<artifactId>aliyun-sdk-oss</artifactId>
</dependency>
+ <dependency>
+ <groupId>com.amazonaws</groupId>
+ <artifactId>aws-java-sdk-s3</artifactId>
+ </dependency>
+
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId>
diff --git
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/Constants.java
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/Constants.java
index 792746bddb..8b517a5ce8 100644
---
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/Constants.java
+++
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/Constants.java
@@ -829,4 +829,18 @@ public final class Constants {
public static final String REMOTE_LOGGING_OSS_BUCKET_NAME =
"remote.logging.oss.bucket.name";
public static final String REMOTE_LOGGING_OSS_ENDPOINT =
"remote.logging.oss.endpoint";
+
+ /**
+ * remote logging for S3
+ */
+
+ public static final String REMOTE_LOGGING_S3_ACCESS_KEY_ID =
"remote.logging.s3.access.key.id";
+
+ public static final String REMOTE_LOGGING_S3_ACCESS_KEY_SECRET =
"remote.logging.s3.access.key.secret";
+
+ public static final String REMOTE_LOGGING_S3_BUCKET_NAME =
"remote.logging.s3.bucket.name";
+
+ public static final String REMOTE_LOGGING_S3_ENDPOINT =
"remote.logging.s3.endpoint";
+
+ public static final String REMOTE_LOGGING_S3_REGION =
"remote.logging.s3.region";
}
diff --git
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/log/remote/OssRemoteLogHandler.java
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/log/remote/OssRemoteLogHandler.java
index a8d19af98c..b7cd131e04 100644
---
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/log/remote/OssRemoteLogHandler.java
+++
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/log/remote/OssRemoteLogHandler.java
@@ -27,8 +27,6 @@ import org.apache.commons.lang3.StringUtils;
import java.io.Closeable;
import java.io.File;
import java.io.IOException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
import lombok.extern.slf4j.Slf4j;
@@ -40,13 +38,23 @@ import com.aliyun.oss.model.PutObjectRequest;
@Slf4j
public class OssRemoteLogHandler implements RemoteLogHandler, Closeable {
- private static final int OBJECT_NAME_COUNT = 2;
-
private OSS ossClient;
private String bucketName;
- public OssRemoteLogHandler() {
+ private static OssRemoteLogHandler instance;
+
+ private OssRemoteLogHandler() {
+
+ }
+
+ public static synchronized OssRemoteLogHandler getInstance() {
+ if (instance == null) {
+ instance = new OssRemoteLogHandler();
+ instance.init();
+ }
+
+ return instance;
}
public void init() {
@@ -61,7 +69,7 @@ public class OssRemoteLogHandler implements RemoteLogHandler,
Closeable {
@Override
public void sendRemoteLog(String logPath) {
- String objectName = getObjectNameFromLogPath(logPath);
+ String objectName = RemoteLogUtils.getObjectNameFromLogPath(logPath);
try {
log.info("send remote log {} to OSS {}", logPath, objectName);
@@ -74,7 +82,7 @@ public class OssRemoteLogHandler implements RemoteLogHandler,
Closeable {
@Override
public void getRemoteLog(String logPath) {
- String objectName = getObjectNameFromLogPath(logPath);
+ String objectName = RemoteLogUtils.getObjectNameFromLogPath(logPath);
try {
log.info("get remote log on OSS {} to {}", objectName, logPath);
@@ -91,18 +99,6 @@ public class OssRemoteLogHandler implements
RemoteLogHandler, Closeable {
}
}
- private String getObjectNameFromLogPath(String logPath) {
- Path path = Paths.get(logPath);
- int nameCount = path.getNameCount();
-
- if (nameCount < OBJECT_NAME_COUNT) {
- return Paths.get(readOssBaseDir(), logPath).toString();
- } else {
- return Paths.get(readOssBaseDir(), path.subpath(nameCount -
OBJECT_NAME_COUNT, nameCount).toString())
- .toString();
- }
- }
-
private void checkBucketNameExists(String bucketName) {
if (StringUtils.isBlank(bucketName)) {
throw new
IllegalArgumentException(Constants.REMOTE_LOGGING_OSS_BUCKET_NAME + " is
empty");
@@ -136,8 +132,4 @@ public class OssRemoteLogHandler implements
RemoteLogHandler, Closeable {
private String readOssBucketName() {
return
PropertyUtils.getString(Constants.REMOTE_LOGGING_OSS_BUCKET_NAME);
}
-
- private String readOssBaseDir() {
- return PropertyUtils.getString(Constants.REMOTE_LOGGING_BASE_DIR);
- }
}
diff --git
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/log/remote/RemoteLogHandlerFactory.java
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/log/remote/RemoteLogHandlerFactory.java
index a132db8d14..328f7768d8 100644
---
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/log/remote/RemoteLogHandlerFactory.java
+++
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/log/remote/RemoteLogHandlerFactory.java
@@ -21,19 +21,25 @@ import
org.apache.dolphinscheduler.common.constants.Constants;
import org.apache.dolphinscheduler.common.utils.PropertyUtils;
import lombok.experimental.UtilityClass;
+import lombok.extern.slf4j.Slf4j;
@UtilityClass
+@Slf4j
public class RemoteLogHandlerFactory {
public RemoteLogHandler getRemoteLogHandler() {
if (!RemoteLogUtils.isRemoteLoggingEnable()) {
return null;
}
- if
(!"OSS".equals(PropertyUtils.getUpperCaseString(Constants.REMOTE_LOGGING_TARGET)))
{
- return null;
+
+ String target =
PropertyUtils.getUpperCaseString(Constants.REMOTE_LOGGING_TARGET);
+ if ("OSS".equals(target)) {
+ return OssRemoteLogHandler.getInstance();
+ } else if ("S3".equals(target)) {
+ return S3RemoteLogHandler.getInstance();
}
- OssRemoteLogHandler ossRemoteLogHandler = new OssRemoteLogHandler();
- ossRemoteLogHandler.init();
- return ossRemoteLogHandler;
+
+ log.error("No suitable remote logging target for {}", target);
+ return null;
}
}
diff --git
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/log/remote/RemoteLogService.java
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/log/remote/RemoteLogService.java
index 4097675eb1..1e7447e878 100644
---
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/log/remote/RemoteLogService.java
+++
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/log/remote/RemoteLogService.java
@@ -37,11 +37,10 @@ public class RemoteLogService {
RemoteLogHandler remoteLogHandler =
RemoteLogHandlerFactory.getRemoteLogHandler();
if (remoteLogHandler == null) {
- log.error("remote log handler is null");
return;
}
remoteLogHandler.sendRemoteLog(logPath);
- log.info("Succeed to send log {} to remote target {}", logPath,
+ log.info("End send log {} to remote target {}", logPath,
PropertyUtils.getString(Constants.REMOTE_LOGGING_TARGET));
}
}
diff --git
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/log/remote/RemoteLogUtils.java
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/log/remote/RemoteLogUtils.java
index 9d81a1bfd1..7df90a9dec 100644
---
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/log/remote/RemoteLogUtils.java
+++
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/log/remote/RemoteLogUtils.java
@@ -36,6 +36,8 @@ public class RemoteLogUtils {
private static RemoteLogService remoteLogService;
+ private static final int OBJECT_NAME_COUNT = 2;
+
@Autowired
private RemoteLogService autowiredRemoteLogService;
@@ -59,7 +61,6 @@ public class RemoteLogUtils {
mkdirOfLog(logPath);
RemoteLogHandler remoteLogHandler =
RemoteLogHandlerFactory.getRemoteLogHandler();
if (remoteLogHandler == null) {
- log.error("remote log handler is null");
return;
}
remoteLogHandler.getRemoteLog(logPath);
@@ -76,4 +77,18 @@ public class RemoteLogUtils {
public static boolean isRemoteLoggingEnable() {
return PropertyUtils.getBoolean(Constants.REMOTE_LOGGING_ENABLE,
Boolean.FALSE);
}
+
+ public static String getObjectNameFromLogPath(String logPath) {
+ Path path = Paths.get(logPath);
+ int nameCount = path.getNameCount();
+
+ String logBaseDir =
PropertyUtils.getString(Constants.REMOTE_LOGGING_BASE_DIR);
+
+ if (nameCount < OBJECT_NAME_COUNT) {
+ return Paths.get(logBaseDir, logPath).toString();
+ } else {
+ return Paths.get(logBaseDir, path.subpath(nameCount -
OBJECT_NAME_COUNT, nameCount).toString())
+ .toString();
+ }
+ }
}
diff --git
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/log/remote/S3RemoteLogHandler.java
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/log/remote/S3RemoteLogHandler.java
new file mode 100644
index 0000000000..00c632ecda
--- /dev/null
+++
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/log/remote/S3RemoteLogHandler.java
@@ -0,0 +1,178 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.common.log.remote;
+
+import org.apache.dolphinscheduler.common.constants.Constants;
+import org.apache.dolphinscheduler.common.utils.PropertyUtils;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Closeable;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.amazonaws.auth.AWSStaticCredentialsProvider;
+import com.amazonaws.auth.BasicAWSCredentials;
+import com.amazonaws.client.builder.AwsClientBuilder;
+import com.amazonaws.regions.Regions;
+import com.amazonaws.services.s3.AmazonS3;
+import com.amazonaws.services.s3.AmazonS3ClientBuilder;
+import com.amazonaws.services.s3.model.Bucket;
+import com.amazonaws.services.s3.model.S3Object;
+import com.amazonaws.services.s3.model.S3ObjectInputStream;
+
+@Slf4j
+public class S3RemoteLogHandler implements RemoteLogHandler, Closeable {
+
+ private String accessKeyId;
+
+ private String accessKeySecret;
+
+ private String region;
+
+ private String bucketName;
+
+ private String endPoint;
+
+ private AmazonS3 s3Client;
+
+ private static S3RemoteLogHandler instance;
+
+ private S3RemoteLogHandler() {
+
+ }
+
+ public static synchronized S3RemoteLogHandler getInstance() {
+ if (instance == null) {
+ instance = new S3RemoteLogHandler();
+ instance.init();
+ }
+
+ return instance;
+ }
+
+ public void init() {
+ accessKeyId = readAccessKeyID();
+ accessKeySecret = readAccessKeySecret();
+ region = readRegion();
+ bucketName = readBucketName();
+ endPoint = readEndPoint();
+ s3Client = buildS3Client();
+ checkBucketNameExists(bucketName);
+ }
+
+ protected AmazonS3 buildS3Client() {
+ if (StringUtils.isNotEmpty(endPoint)) {
+ return AmazonS3ClientBuilder
+ .standard()
+ .withPathStyleAccessEnabled(true)
+ .withEndpointConfiguration(new
AwsClientBuilder.EndpointConfiguration(
+ endPoint, Regions.fromName(region).getName()))
+ .withCredentials(
+ new AWSStaticCredentialsProvider(new
BasicAWSCredentials(accessKeyId, accessKeySecret)))
+ .build();
+ } else {
+ return AmazonS3ClientBuilder
+ .standard()
+ .withCredentials(
+ new AWSStaticCredentialsProvider(new
BasicAWSCredentials(accessKeyId, accessKeySecret)))
+ .withRegion(Regions.fromName(region))
+ .build();
+ }
+ }
+
+ @Override
+ public void close() throws IOException {
+ s3Client.shutdown();
+ }
+
+ @Override
+ public void sendRemoteLog(String logPath) {
+ String objectName = RemoteLogUtils.getObjectNameFromLogPath(logPath);
+
+ try {
+ log.info("send remote log {} to S3 {}", logPath, objectName);
+ s3Client.putObject(bucketName, objectName, new File(logPath));
+ } catch (Exception e) {
+ log.error("error while sending remote log {} to S3 {}", logPath,
objectName, e);
+ }
+ }
+
+ @Override
+ public void getRemoteLog(String logPath) {
+ String objectName = RemoteLogUtils.getObjectNameFromLogPath(logPath);
+
+ try {
+ log.info("get remote log on S3 {} to {}", objectName, logPath);
+ S3Object o = s3Client.getObject(bucketName, objectName);
+ try (
+ S3ObjectInputStream s3is = o.getObjectContent();
+ FileOutputStream fos = new FileOutputStream(logPath)) {
+ byte[] readBuf = new byte[1024];
+ int readLen = 0;
+ while ((readLen = s3is.read(readBuf)) > 0) {
+ fos.write(readBuf, 0, readLen);
+ }
+ }
+ } catch (Exception e) {
+ log.error("error while getting remote log on S3 {} to {}",
objectName, logPath, e);
+ }
+ }
+
+ protected String readAccessKeyID() {
+ return
PropertyUtils.getString(Constants.REMOTE_LOGGING_S3_ACCESS_KEY_ID);
+ }
+
+ protected String readAccessKeySecret() {
+ return
PropertyUtils.getString(Constants.REMOTE_LOGGING_S3_ACCESS_KEY_SECRET);
+ }
+
+ protected String readRegion() {
+ return PropertyUtils.getString(Constants.REMOTE_LOGGING_S3_REGION);
+ }
+
+ protected String readBucketName() {
+ return
PropertyUtils.getString(Constants.REMOTE_LOGGING_S3_BUCKET_NAME);
+ }
+
+ protected String readEndPoint() {
+ return PropertyUtils.getString(Constants.REMOTE_LOGGING_S3_ENDPOINT);
+ }
+
+ public void checkBucketNameExists(String bucketName) {
+ if (StringUtils.isBlank(bucketName)) {
+ throw new IllegalArgumentException("remote.logging.s3.bucket.name
is blank");
+ }
+
+ Bucket existsBucket = s3Client.listBuckets()
+ .stream()
+ .filter(
+ bucket -> bucket.getName().equals(bucketName))
+ .findFirst()
+ .orElseThrow(() -> {
+ return new IllegalArgumentException(
+ "bucketName: " + bucketName + " is not exists, you
need to create them by yourself");
+ });
+
+ log.info("bucketName: {} has been found, the current regionName is
{}", existsBucket.getName(),
+ s3Client.getRegionName());
+ }
+}
diff --git a/dolphinscheduler-common/src/main/resources/common.properties
b/dolphinscheduler-common/src/main/resources/common.properties
index 513fe53559..23ce6b94df 100644
--- a/dolphinscheduler-common/src/main/resources/common.properties
+++ b/dolphinscheduler-common/src/main/resources/common.properties
@@ -158,4 +158,14 @@ remote.logging.oss.access.key.secret=<access.key.secret>
remote.logging.oss.bucket.name=<bucket.name>
# oss endpoint, required if you set remote.logging.target=OSS
remote.logging.oss.endpoint=<endpoint>
+# s3 access key id, required if you set remote.logging.target=S3
+remote.logging.s3.access.key.id=<access.key.id>
+# s3 access key secret, required if you set remote.logging.target=S3
+remote.logging.s3.access.key.secret=<access.key.secret>
+# s3 bucket name, required if you set remote.logging.target=S3
+remote.logging.s3.bucket.name=<bucket.name>
+# s3 endpoint, required if you set remote.logging.target=S3
+remote.logging.s3.endpoint=<endpoint>
+# s3 region, required if you set remote.logging.target=S3
+remote.logging.s3.region=<region>
diff --git
a/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/log/remote/OssRemoteLogHandlerTest.java
b/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/log/remote/RemoteLogHandlerTest.java
similarity index 79%
rename from
dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/log/remote/OssRemoteLogHandlerTest.java
rename to
dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/log/remote/RemoteLogHandlerTest.java
index 726a262938..6513f0c190 100644
---
a/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/log/remote/OssRemoteLogHandlerTest.java
+++
b/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/log/remote/RemoteLogHandlerTest.java
@@ -20,8 +20,6 @@ package org.apache.dolphinscheduler.common.log.remote;
import org.apache.dolphinscheduler.common.constants.Constants;
import org.apache.dolphinscheduler.common.utils.PropertyUtils;
-import java.lang.reflect.Method;
-
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -30,22 +28,18 @@ import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
-public class OssRemoteLogHandlerTest {
+public class RemoteLogHandlerTest {
@Test
- public void testGetObjectNameFromLogPath() throws Exception {
+ public void testGetObjectNameFromLogPath() {
final String logPath =
"/path/to/dolphinscheduler/logs/20230116/8245922982496_1-1-3.log";
final String expectedObjectName =
"logs/20230116/8245922982496_1-1-3.log";
- OssRemoteLogHandler ossRemoteLogHandler = new OssRemoteLogHandler();
-
try (MockedStatic<PropertyUtils> propertyUtilsMockedStatic =
Mockito.mockStatic(PropertyUtils.class)) {
propertyUtilsMockedStatic.when(() ->
PropertyUtils.getString(Constants.REMOTE_LOGGING_BASE_DIR))
.thenReturn("logs");
- Method method =
OssRemoteLogHandler.class.getDeclaredMethod("getObjectNameFromLogPath",
String.class);
- method.setAccessible(true);
- String objectName = (String) method.invoke(ossRemoteLogHandler,
logPath);
+ String objectName =
RemoteLogUtils.getObjectNameFromLogPath(logPath);
Assertions.assertEquals(expectedObjectName, objectName);
}