You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dolphinscheduler.apache.org by wa...@apache.org on 2024/02/02 02:52:41 UTC
(dolphinscheduler) 05/05: update
This is an automated email from the ASF dual-hosted git repository.
wangyang pushed a commit to branch augit-log
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git
commit e79ff870e17099ef918e9481a372c5356dc29e45
Author: Draven <qi...@cisco.com>
AuthorDate: Fri Feb 2 10:52:28 2024 +0800
update
---
.../dolphinscheduler/api/audit/OperatorLog.java | 7 ----
.../api/audit/OperatorLogAspect.java | 46 ----------------------
.../api/controller/AuditLogController.java | 11 ++++--
.../api/dto/auditLog/AuditObjectTypeDto.java | 42 ++++++++++++++++++++
.../api/dto/auditLog/AuditOperationTypeDto.java | 27 +++++++++++++
.../dolphinscheduler/api/service/AuditService.java | 20 +++++++++-
.../src/main/resources/sql/dolphinscheduler_h2.sql | 10 +++--
.../main/resources/sql/dolphinscheduler_mysql.sql | 12 ++++--
.../resources/sql/dolphinscheduler_postgresql.sql | 14 ++++---
.../3.3.0_schema/mysql/dolphinscheduler_ddl.sql | 29 +++++++++++++-
.../postgresql/dolphinscheduler_ddl.sql | 28 ++++++++++++-
.../dao/mapper/AuditLogMapperTest.java | 14 +++++--
12 files changed, 183 insertions(+), 77 deletions(-)
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/OperatorLog.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/OperatorLog.java
index 440dd0f997..cd113a826b 100644
--- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/OperatorLog.java
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/OperatorLog.java
@@ -54,13 +54,6 @@ public @interface OperatorLog {
*/
String[] requestParamName() default {};
- /**
- * The name of the object to be returned after the operation.
- * For operations like create and import, specify the object name to retrieve details from the response.
- * For update and delete, the necessary information is usually provided in the request parameters.
- */
- String returnObjectName() default "";
-
/**
* The names of the fields in the returned object to be recorded.
* Represents an array of field names, e.g., ["id", "code"].
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/OperatorLogAspect.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/OperatorLogAspect.java
index ec3211641d..141b979435 100644
--- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/OperatorLogAspect.java
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/OperatorLogAspect.java
@@ -30,7 +30,6 @@ import org.apache.dolphinscheduler.common.enums.AuditObjectType;
import org.apache.dolphinscheduler.common.enums.AuditOperationType;
import org.apache.dolphinscheduler.common.enums.ReleaseState;
import org.apache.dolphinscheduler.dao.entity.*;
-import org.apache.dolphinscheduler.dao.entity.Queue;
import org.apache.dolphinscheduler.dao.mapper.*;
import org.apache.dolphinscheduler.spi.enums.ResourceType;
import org.aspectj.lang.ProceedingJoinPoint;
@@ -49,57 +48,12 @@ public class OperatorLogAspect {
@Autowired
private AuditService auditService;
- @Autowired
- private ProjectMapper projectMapper;
-
- @Autowired
- private ProcessDefinitionMapper processDefinitionMapper;
-
- @Autowired
- private ProcessInstanceMapper processInstanceMapper;
-
- @Autowired
- private TaskDefinitionMapper taskDefinitionMapper;
-
@Autowired
private ScheduleMapper scheduleMapper;
- @Autowired
- private UdfFuncMapper udfFuncMapper;
-
@Autowired
private UserMapper userMapper;
- @Autowired
- private DataSourceMapper dataSourceMapper;
-
- @Autowired
- private TenantMapper tenantMapper;
-
- @Autowired
- private AlertGroupMapper alertGroupMapper;
-
- @Autowired
- private AlertPluginInstanceMapper alertPluginInstanceMapper;
-
- @Autowired
- private WorkerGroupMapper workerGroupMapper;
-
- @Autowired
- private QueueMapper queueMapper;
-
- @Autowired
- private EnvironmentMapper environmentMapper;
-
- @Autowired
- private ClusterMapper clusterMapper;
-
- @Autowired
- private K8sNamespaceMapper k8sNamespaceMapper;
-
- @Autowired
- private AccessTokenMapper accessTokenMapper;
-
@Pointcut("@annotation(OperatorLog)")
public void logPointCut() {
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/AuditLogController.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/AuditLogController.java
index afae94cff1..b198669a82 100644
--- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/AuditLogController.java
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/AuditLogController.java
@@ -20,6 +20,8 @@ package org.apache.dolphinscheduler.api.controller;
import static org.apache.dolphinscheduler.api.enums.Status.QUERY_AUDIT_LOG_LIST_PAGING;
import org.apache.dolphinscheduler.api.dto.AuditDto;
+import org.apache.dolphinscheduler.api.dto.auditLog.AuditObjectTypeDto;
+import org.apache.dolphinscheduler.api.dto.auditLog.AuditOperationTypeDto;
import org.apache.dolphinscheduler.api.exceptions.ApiException;
import org.apache.dolphinscheduler.api.service.AuditService;
import org.apache.dolphinscheduler.api.utils.PageInfo;
@@ -44,6 +46,7 @@ import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
+import java.util.ArrayList;
import java.util.List;
@Tag(name = "AUDIT_LOG_TAG")
@@ -110,8 +113,8 @@ public class AuditLogController extends BaseController {
@GetMapping(value = "/audit-log-operation-type")
@ResponseStatus(HttpStatus.OK)
@ApiException(QUERY_AUDIT_LOG_LIST_PAGING)
- public Result<List<AuditOperationType>> queryAuditOperationTypeList() {
- return Result.success(AuditOperationType.getOperationList());
+ public Result<List<AuditOperationTypeDto>> queryAuditOperationTypeList() {
+ return Result.success(AuditOperationTypeDto.getlist());
}
/**
@@ -123,7 +126,7 @@ public class AuditLogController extends BaseController {
@GetMapping(value = "/audit-log-object-type")
@ResponseStatus(HttpStatus.OK)
@ApiException(QUERY_AUDIT_LOG_LIST_PAGING)
- public Result<List<AuditObjectType>> queryAuditObjectTypeList() {
- return Result.success(AuditObjectType.getAuditObjectTreeList());
+ public Result<List<AuditObjectTypeDto>> queryAuditObjectTypeList() {
+ return Result.success(AuditObjectTypeDto.getlist());
}
}
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/auditLog/AuditObjectTypeDto.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/auditLog/AuditObjectTypeDto.java
new file mode 100644
index 0000000000..401fcf21b1
--- /dev/null
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/auditLog/AuditObjectTypeDto.java
@@ -0,0 +1,42 @@
+package org.apache.dolphinscheduler.api.dto.auditLog;
+
+import lombok.Data;
+import org.apache.dolphinscheduler.common.enums.AuditObjectType;
+import org.apache.dolphinscheduler.common.enums.AuditOperationType;
+import org.apache.dolphinscheduler.dao.model.WorkflowDefinitionCountDto;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class AuditObjectTypeDto {
+ private int code;
+
+ private String name;
+
+ private List<AuditObjectTypeDto> child = new ArrayList<>();
+
+ public static List<AuditObjectTypeDto> getlist() {
+ List<AuditObjectTypeDto> dtoList = new ArrayList<>();
+ trans(dtoList, AuditObjectType.getAuditObjectTreeList());
+ return dtoList;
+ }
+
+ public static List<AuditObjectTypeDto> trans(List<AuditObjectTypeDto> dtoList, List<AuditObjectType> objectTypeList) {
+ for (AuditObjectType operationType: objectTypeList) {
+ dtoList.add(transToDto(operationType));
+ }
+
+ return dtoList;
+ }
+
+ public static AuditObjectTypeDto transToDto(AuditObjectType operationType) {
+ AuditObjectTypeDto dto = new AuditObjectTypeDto();
+ dto.setName(operationType.getName());
+ dto.setCode(operationType.getCode());
+ if(!operationType.getChild().isEmpty()) {
+ dto.setChild(trans(new ArrayList<>(), operationType.getChild()));
+ }
+ return dto;
+ }
+}
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/auditLog/AuditOperationTypeDto.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/auditLog/AuditOperationTypeDto.java
new file mode 100644
index 0000000000..a678868057
--- /dev/null
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/auditLog/AuditOperationTypeDto.java
@@ -0,0 +1,27 @@
+package org.apache.dolphinscheduler.api.dto.auditLog;
+
+import lombok.Data;
+import org.apache.dolphinscheduler.common.enums.AuditObjectType;
+import org.apache.dolphinscheduler.common.enums.AuditOperationType;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class AuditOperationTypeDto {
+ private int code;
+
+ private String name;
+
+ public static List<AuditOperationTypeDto> getlist() {
+ List<AuditOperationTypeDto> dtoList = new ArrayList<>();
+ for (AuditOperationType operationType: AuditOperationType.getOperationList()) {
+ AuditOperationTypeDto dto = new AuditOperationTypeDto();
+ dto.setCode(operationType.getCode());
+ dto.setName(operationType.getName());
+ dtoList.add(dto);
+ }
+
+ return dtoList;
+ }
+}
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/AuditService.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/AuditService.java
index dc1eba3190..c26a6d48c5 100644
--- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/AuditService.java
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/AuditService.java
@@ -30,10 +30,19 @@ import java.util.List;
* audit information service
*/
public interface AuditService {
-
-
+ /**
+ * add audit object
+ *
+ * @param auditLog auditLog
+ */
void addAudit(AuditLog auditLog);
+ /**
+ * add audit by list
+ *
+ * @param auditLogList auditLog list
+ * @param duration api cost seconds
+ */
void addAudit(List<AuditLog> auditLogList, long duration);
void addQuartzLog(int processId);
@@ -56,5 +65,12 @@ public interface AuditService {
String endTime, String userName,
Integer pageNo, Integer pageSize);
+ /**
+ * query real object name by object id or code
+ *
+ * @param objectId objectId
+ * @param objectType objectType
+ * @return object name
+ */
String getObjectNameByObjectId(Long objectId, AuditObjectType objectType);
}
diff --git a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_h2.sql b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_h2.sql
index c22f12c09a..f61d7a82de 100644
--- a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_h2.sql
+++ b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_h2.sql
@@ -2003,10 +2003,14 @@ CREATE TABLE t_ds_audit_log
(
id int(11) NOT NULL AUTO_INCREMENT,
user_id int(11) NOT NULL,
- resource_type int(11) NOT NULL,
- operation int(11) NOT NULL,
+ object_id bigint(20) NOT NULL,
+ object_name varchar(255) NOT NULL,
+ object_type int(11) NOT NULL,
+ operation_type int(11) NOT NULL,
+ description varchar(255) NOT NULL,
+ duration int(11) NOT NULL,
+ detail varchar(255) NOT NULL,
time timestamp NULL DEFAULT CURRENT_TIMESTAMP,
- resource_id int(11) NOT NULL,
PRIMARY KEY (id)
);
diff --git a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_mysql.sql b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_mysql.sql
index 347acb0a64..05ccc2533d 100644
--- a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_mysql.sql
+++ b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_mysql.sql
@@ -1992,10 +1992,14 @@ DROP TABLE IF EXISTS `t_ds_audit_log`;
CREATE TABLE `t_ds_audit_log` (
`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT'key',
`user_id` int(11) NOT NULL COMMENT 'user id',
- `resource_type` int(11) NOT NULL COMMENT 'resource type',
- `operation` int(11) NOT NULL COMMENT 'operation',
- `time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT 'create time',
- `resource_id` int(11) NULL DEFAULT NULL COMMENT 'resource id',
+ `object_id` bigint(20) DEFAULT NULL COMMENT 'object id',
+ `object_name` varchar(100) DEFAULT NULL COMMENT 'object id',
+ `object_type` int(11) NOT NULL COMMENT 'object type',
+ `operation_type` int(11) NOT NULL COMMENT 'operation type',
+ `description` varchar(100) DEFAULT NULL COMMENT 'api description',
+ `duration` int(11) DEFAULT NULL COMMENT 'api cost seconds',
+ `detail` varchar(100) DEFAULT NULL COMMENT 'object change detail',
+ `time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT 'operation time',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT= 1 DEFAULT CHARSET=utf8 COLLATE = utf8_bin;
diff --git a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_postgresql.sql b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_postgresql.sql
index 66bcb17f38..f4dc6d976f 100644
--- a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_postgresql.sql
+++ b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_postgresql.sql
@@ -1971,11 +1971,15 @@ CREATE TABLE t_ds_task_group (
DROP TABLE IF EXISTS t_ds_audit_log;
CREATE TABLE t_ds_audit_log (
id serial NOT NULL,
- user_id int NOT NULL,
- resource_type int NOT NULL,
- operation int NOT NULL,
- time timestamp DEFAULT NULL ,
- resource_id int NOT NULL,
+ user_id int NOT NULL,
+ object_id bigint NOT NULL,
+ object_name VARCHAR(255) NOT NULL,
+ object_type int NOT NULL,
+ operation_type int NOT NULL,
+ description VARCHAR(255) NOT NULL,
+ duration int NOT NULL,
+ detail VARCHAR(255) NOT NULL,
+ time timestamp DEFAULT NULL ,
PRIMARY KEY (id)
);
diff --git a/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.3.0_schema/mysql/dolphinscheduler_ddl.sql b/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.3.0_schema/mysql/dolphinscheduler_ddl.sql
index 6c73e112da..0270aa051d 100644
--- a/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.3.0_schema/mysql/dolphinscheduler_ddl.sql
+++ b/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.3.0_schema/mysql/dolphinscheduler_ddl.sql
@@ -80,4 +80,31 @@ ALTER TABLE `t_ds_process_definition_log` MODIFY COLUMN `version` int NOT NULL D
ALTER TABLE `t_ds_process_instance` MODIFY COLUMN `process_definition_version` int NOT NULL DEFAULT 1 COMMENT "process definition version";
ALTER TABLE `t_ds_task_definition` MODIFY COLUMN `version` int NOT NULL DEFAULT 1 COMMENT "task definition version";
ALTER TABLE `t_ds_task_definition_log` MODIFY COLUMN `version` int NOT NULL DEFAULT 1 COMMENT "task definition version";
-ALTER TABLE `t_ds_task_instance` MODIFY COLUMN `task_definition_version` int NOT NULL DEFAULT 1 COMMENT "task definition version";
\ No newline at end of file
+ALTER TABLE `t_ds_task_instance` MODIFY COLUMN `task_definition_version` int NOT NULL DEFAULT 1 COMMENT "task definition version";
+
+-- modify_data_t_ds_audit_log_input_entry behavior change
+--DROP PROCEDURE if EXISTS modify_data_t_ds_audit_log_input_entry;
+DROP PROCEDURE if EXISTS modify_data_t_ds_audit_log_input_entry;
+delimiter d//
+CREATE PROCEDURE modify_data_t_ds_audit_log_input_entry()
+BEGIN
+ IF EXISTS (SELECT 1 FROM information_schema.COLUMNS
+ WHERE TABLE_NAME='t_ds_audit_log'
+ AND TABLE_SCHEMA=(SELECT DATABASE())
+ AND COLUMN_NAME ='resource_type')
+ THEN
+ ALTER TABLE `t_ds_audit_log`
+ drop resource_type, drop operation, drop resource_id,
+ add `object_id` bigint(20) DEFAULT NULL COMMENT 'object id',
+ add `object_name` varchar(100) DEFAULT NULL COMMENT 'object id',
+ add `object_type` int(11) NOT NULL COMMENT 'object type',
+ add `operation_type` int(11) NOT NULL COMMENT 'operation type',
+ add `description` varchar(100) DEFAULT NULL COMMENT 'api description',
+ add `duration` int(11) DEFAULT NULL COMMENT 'api cost seconds',
+ add `detail` varchar(100) DEFAULT NULL COMMENT 'object change detail';
+END IF;
+END;
+d//
+delimiter ;
+CALL modify_data_t_ds_audit_log_input_entry;
+DROP PROCEDURE modify_data_t_ds_audit_log_input_entry;
\ No newline at end of file
diff --git a/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.3.0_schema/postgresql/dolphinscheduler_ddl.sql b/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.3.0_schema/postgresql/dolphinscheduler_ddl.sql
index fd13ed3594..7c86e315cf 100644
--- a/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.3.0_schema/postgresql/dolphinscheduler_ddl.sql
+++ b/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.3.0_schema/postgresql/dolphinscheduler_ddl.sql
@@ -68,4 +68,30 @@ ALTER TABLE "t_ds_process_definition_log" ALTER COLUMN "version" SET DEFAULT 1;
ALTER TABLE "t_ds_task_definition" ALTER COLUMN "version" SET DEFAULT 1;
ALTER TABLE "t_ds_task_definition_log" ALTER COLUMN "version" SET DEFAULT 1;
ALTER TABLE "t_ds_process_instance" ALTER COLUMN "process_definition_version" SET NOT NULL, ALTER COLUMN "process_definition_version" SET DEFAULT 1;
-ALTER TABLE "t_ds_task_instance" ALTER COLUMN "task_definition_version" SET NOT NULL, ALTER COLUMN "task_definition_version" SET DEFAULT 1;
\ No newline at end of file
+ALTER TABLE "t_ds_task_instance" ALTER COLUMN "task_definition_version" SET NOT NULL, ALTER COLUMN "task_definition_version" SET DEFAULT 1;
+
+-- modify_data_t_ds_audit_log_input_entry
+delimiter d//
+CREATE OR REPLACE FUNCTION modify_data_t_ds_audit_log_input_entry() RETURNS void AS $$
+BEGIN
+ IF EXISTS (SELECT 1
+ FROM information_schema.columns
+ WHERE table_name = 't_ds_audit_log'
+ AND column_name = 'resource_type')
+ THEN
+ALTER TABLE t_ds_audit_log
+ drop resource_type, drop operation, drop resource_id,
+ add object_id bigint NOT NULL,
+ add object_name VARCHAR(255) NOT NULL,
+ add object_type int NOT NULL,
+ add operation_type int NOT NULL,
+ add description VARCHAR(255) NOT NULL,
+ add duration int NOT NULL,
+ add detail VARCHAR(255) NOT NULL;
+END IF;
+END;
+$$ LANGUAGE plpgsql;
+d//
+
+select modify_data_t_ds_audit_log_input_entry();
+DROP FUNCTION IF EXISTS modify_data_t_ds_audit_log_input_entry();
\ No newline at end of file
diff --git a/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/AuditLogMapperTest.java b/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/AuditLogMapperTest.java
index dd12e2dd25..65c5a604e0 100644
--- a/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/AuditLogMapperTest.java
+++ b/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/AuditLogMapperTest.java
@@ -17,12 +17,15 @@
package org.apache.dolphinscheduler.dao.mapper;
+import com.google.common.collect.Lists;
import org.apache.dolphinscheduler.common.enums.AuditObjectType;
import org.apache.dolphinscheduler.dao.BaseDaoTest;
import org.apache.dolphinscheduler.dao.entity.AuditLog;
import org.apache.dolphinscheduler.dao.entity.Project;
+import java.util.ArrayList;
import java.util.Date;
+import java.util.List;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
@@ -42,6 +45,9 @@ public class AuditLogMapperTest extends BaseDaoTest {
private void insertOne(AuditObjectType objectType) {
AuditLog auditLog = new AuditLog();
auditLog.setUserId(1);
+ auditLog.setObjectName("name");
+ auditLog.setDetail("detail");
+ auditLog.setDuration(1L);
auditLog.setTime(new Date());
auditLog.setObjectType(objectType.getCode());
auditLog.setOperationType(0);
@@ -68,10 +74,10 @@ public class AuditLogMapperTest extends BaseDaoTest {
insertOne(AuditObjectType.USER);
insertOne(AuditObjectType.PROJECT);
Page<AuditLog> page = new Page<>(1, 3);
- int[] resourceType = new int[0];
- int[] operationType = new int[0];
+ List<Integer> objectTypeCodeList = Lists.newArrayList(1);
+ List<Integer> operationTypeCodeList = Lists.newArrayList(1);
-// IPage<AuditLog> logIPage = logMapper.queryAuditLog(page, resourceType, operationType, -1, null, null);
-// Assertions.assertNotEquals(0, logIPage.getTotal());
+ IPage<AuditLog> logIPage = logMapper.queryAuditLog(page, objectTypeCodeList, operationTypeCodeList, "", null, null);
+ Assertions.assertNotEquals(0, logIPage.getTotal());
}
}