log模块代码优化

pull/800/head
Zheng Jie 2023-06-12 13:35:39 +08:00
parent 6c5e7061fe
commit 4e10329c42
11 changed files with 86 additions and 86 deletions

View File

@ -16,8 +16,8 @@
package me.zhengjie.aspect; package me.zhengjie.aspect;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import me.zhengjie.domain.Log; import me.zhengjie.domain.SysLog;
import me.zhengjie.service.LogService; import me.zhengjie.service.SysLogService;
import me.zhengjie.utils.RequestHolder; import me.zhengjie.utils.RequestHolder;
import me.zhengjie.utils.SecurityUtils; import me.zhengjie.utils.SecurityUtils;
import me.zhengjie.utils.StringUtils; import me.zhengjie.utils.StringUtils;
@ -40,12 +40,12 @@ import javax.servlet.http.HttpServletRequest;
@Slf4j @Slf4j
public class LogAspect { public class LogAspect {
private final LogService logService; private final SysLogService sysLogService;
ThreadLocal<Long> currentTime = new ThreadLocal<>(); ThreadLocal<Long> currentTime = new ThreadLocal<>();
public LogAspect(LogService logService) { public LogAspect(SysLogService sysLogService) {
this.logService = logService; this.sysLogService = sysLogService;
} }
/** /**
@ -66,10 +66,10 @@ public class LogAspect {
Object result; Object result;
currentTime.set(System.currentTimeMillis()); currentTime.set(System.currentTimeMillis());
result = joinPoint.proceed(); result = joinPoint.proceed();
Log log = new Log("INFO",System.currentTimeMillis() - currentTime.get()); SysLog sysLog = new SysLog("INFO",System.currentTimeMillis() - currentTime.get());
currentTime.remove(); currentTime.remove();
HttpServletRequest request = RequestHolder.getHttpServletRequest(); HttpServletRequest request = RequestHolder.getHttpServletRequest();
logService.save(getUsername(), StringUtils.getBrowser(request), StringUtils.getIp(request),joinPoint, log); sysLogService.save(getUsername(), StringUtils.getBrowser(request), StringUtils.getIp(request),joinPoint, sysLog);
return result; return result;
} }
@ -81,11 +81,11 @@ public class LogAspect {
*/ */
@AfterThrowing(pointcut = "logPointcut()", throwing = "e") @AfterThrowing(pointcut = "logPointcut()", throwing = "e")
public void logAfterThrowing(JoinPoint joinPoint, Throwable e) { public void logAfterThrowing(JoinPoint joinPoint, Throwable e) {
Log log = new Log("ERROR",System.currentTimeMillis() - currentTime.get()); SysLog sysLog = new SysLog("ERROR",System.currentTimeMillis() - currentTime.get());
currentTime.remove(); currentTime.remove();
log.setExceptionDetail(ThrowableUtil.getStackTrace(e).getBytes()); sysLog.setExceptionDetail(ThrowableUtil.getStackTrace(e).getBytes());
HttpServletRequest request = RequestHolder.getHttpServletRequest(); HttpServletRequest request = RequestHolder.getHttpServletRequest();
logService.save(getUsername(), StringUtils.getBrowser(request), StringUtils.getIp(request), (ProceedingJoinPoint)joinPoint, log); sysLogService.save(getUsername(), StringUtils.getBrowser(request), StringUtils.getIp(request), (ProceedingJoinPoint)joinPoint, sysLog);
} }
public String getUsername() { public String getUsername() {

View File

@ -32,7 +32,7 @@ import java.sql.Timestamp;
@Setter @Setter
@Table(name = "sys_log") @Table(name = "sys_log")
@NoArgsConstructor @NoArgsConstructor
public class Log implements Serializable { public class SysLog implements Serializable {
@Id @Id
@Column(name = "log_id") @Column(name = "log_id")
@ -73,7 +73,7 @@ public class Log implements Serializable {
@CreationTimestamp @CreationTimestamp
private Timestamp createTime; private Timestamp createTime;
public Log(String logType, Long time) { public SysLog(String logType, Long time) {
this.logType = logType; this.logType = logType;
this.time = time; this.time = time;
} }

View File

@ -15,7 +15,7 @@
*/ */
package me.zhengjie.repository; package me.zhengjie.repository;
import me.zhengjie.domain.Log; import me.zhengjie.domain.SysLog;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Modifying;
@ -27,7 +27,7 @@ import org.springframework.stereotype.Repository;
* @date 2018-11-24 * @date 2018-11-24
*/ */
@Repository @Repository
public interface LogRepository extends JpaRepository<Log,Long>, JpaSpecificationExecutor<Log> { public interface LogRepository extends JpaRepository<SysLog,Long>, JpaSpecificationExecutor<SysLog> {
/** /**
* *

View File

@ -19,8 +19,8 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import me.zhengjie.annotation.Log; import me.zhengjie.annotation.Log;
import me.zhengjie.service.LogService; import me.zhengjie.service.SysLogService;
import me.zhengjie.service.dto.LogQueryCriteria; import me.zhengjie.service.dto.SysLogQueryCriteria;
import me.zhengjie.utils.SecurityUtils; import me.zhengjie.utils.SecurityUtils;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
@ -38,63 +38,63 @@ import java.io.IOException;
@RequiredArgsConstructor @RequiredArgsConstructor
@RequestMapping("/api/logs") @RequestMapping("/api/logs")
@Api(tags = "系统:日志管理") @Api(tags = "系统:日志管理")
public class LogController { public class SysLogController {
private final LogService logService; private final SysLogService sysLogService;
@Log("导出数据") @Log("导出数据")
@ApiOperation("导出数据") @ApiOperation("导出数据")
@GetMapping(value = "/download") @GetMapping(value = "/download")
@PreAuthorize("@el.check()") @PreAuthorize("@el.check()")
public void exportLog(HttpServletResponse response, LogQueryCriteria criteria) throws IOException { public void exportLog(HttpServletResponse response, SysLogQueryCriteria criteria) throws IOException {
criteria.setLogType("INFO"); criteria.setLogType("INFO");
logService.download(logService.queryAll(criteria), response); sysLogService.download(sysLogService.queryAll(criteria), response);
} }
@Log("导出错误数据") @Log("导出错误数据")
@ApiOperation("导出错误数据") @ApiOperation("导出错误数据")
@GetMapping(value = "/error/download") @GetMapping(value = "/error/download")
@PreAuthorize("@el.check()") @PreAuthorize("@el.check()")
public void exportErrorLog(HttpServletResponse response, LogQueryCriteria criteria) throws IOException { public void exportErrorLog(HttpServletResponse response, SysLogQueryCriteria criteria) throws IOException {
criteria.setLogType("ERROR"); criteria.setLogType("ERROR");
logService.download(logService.queryAll(criteria), response); sysLogService.download(sysLogService.queryAll(criteria), response);
} }
@GetMapping @GetMapping
@ApiOperation("日志查询") @ApiOperation("日志查询")
@PreAuthorize("@el.check()") @PreAuthorize("@el.check()")
public ResponseEntity<Object> queryLog(LogQueryCriteria criteria, Pageable pageable){ public ResponseEntity<Object> queryLog(SysLogQueryCriteria criteria, Pageable pageable){
criteria.setLogType("INFO"); criteria.setLogType("INFO");
return new ResponseEntity<>(logService.queryAll(criteria,pageable), HttpStatus.OK); return new ResponseEntity<>(sysLogService.queryAll(criteria,pageable), HttpStatus.OK);
} }
@GetMapping(value = "/user") @GetMapping(value = "/user")
@ApiOperation("用户日志查询") @ApiOperation("用户日志查询")
public ResponseEntity<Object> queryUserLog(LogQueryCriteria criteria, Pageable pageable){ public ResponseEntity<Object> queryUserLog(SysLogQueryCriteria criteria, Pageable pageable){
criteria.setLogType("INFO"); criteria.setLogType("INFO");
criteria.setUsername(SecurityUtils.getCurrentUsername()); criteria.setUsername(SecurityUtils.getCurrentUsername());
return new ResponseEntity<>(logService.queryAllByUser(criteria,pageable), HttpStatus.OK); return new ResponseEntity<>(sysLogService.queryAllByUser(criteria,pageable), HttpStatus.OK);
} }
@GetMapping(value = "/error") @GetMapping(value = "/error")
@ApiOperation("错误日志查询") @ApiOperation("错误日志查询")
@PreAuthorize("@el.check()") @PreAuthorize("@el.check()")
public ResponseEntity<Object> queryErrorLog(LogQueryCriteria criteria, Pageable pageable){ public ResponseEntity<Object> queryErrorLog(SysLogQueryCriteria criteria, Pageable pageable){
criteria.setLogType("ERROR"); criteria.setLogType("ERROR");
return new ResponseEntity<>(logService.queryAll(criteria,pageable), HttpStatus.OK); return new ResponseEntity<>(sysLogService.queryAll(criteria,pageable), HttpStatus.OK);
} }
@GetMapping(value = "/error/{id}") @GetMapping(value = "/error/{id}")
@ApiOperation("日志异常详情查询") @ApiOperation("日志异常详情查询")
@PreAuthorize("@el.check()") @PreAuthorize("@el.check()")
public ResponseEntity<Object> queryErrorLogDetail(@PathVariable Long id){ public ResponseEntity<Object> queryErrorLogDetail(@PathVariable Long id){
return new ResponseEntity<>(logService.findByErrDetail(id), HttpStatus.OK); return new ResponseEntity<>(sysLogService.findByErrDetail(id), HttpStatus.OK);
} }
@DeleteMapping(value = "/del/error") @DeleteMapping(value = "/del/error")
@Log("删除所有ERROR日志") @Log("删除所有ERROR日志")
@ApiOperation("删除所有ERROR日志") @ApiOperation("删除所有ERROR日志")
@PreAuthorize("@el.check()") @PreAuthorize("@el.check()")
public ResponseEntity<Object> delAllErrorLog(){ public ResponseEntity<Object> delAllErrorLog(){
logService.delAllByError(); sysLogService.delAllByError();
return new ResponseEntity<>(HttpStatus.OK); return new ResponseEntity<>(HttpStatus.OK);
} }
@ -103,7 +103,7 @@ public class LogController {
@ApiOperation("删除所有INFO日志") @ApiOperation("删除所有INFO日志")
@PreAuthorize("@el.check()") @PreAuthorize("@el.check()")
public ResponseEntity<Object> delAllInfoLog(){ public ResponseEntity<Object> delAllInfoLog(){
logService.delAllByInfo(); sysLogService.delAllByInfo();
return new ResponseEntity<>(HttpStatus.OK); return new ResponseEntity<>(HttpStatus.OK);
} }
} }

View File

@ -15,8 +15,8 @@
*/ */
package me.zhengjie.service; package me.zhengjie.service;
import me.zhengjie.domain.Log; import me.zhengjie.domain.SysLog;
import me.zhengjie.service.dto.LogQueryCriteria; import me.zhengjie.service.dto.SysLogQueryCriteria;
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
@ -29,7 +29,7 @@ import java.util.List;
* @author Zheng Jie * @author Zheng Jie
* @date 2018-11-24 * @date 2018-11-24
*/ */
public interface LogService { public interface SysLogService {
/** /**
* *
@ -37,14 +37,14 @@ public interface LogService {
* @param pageable * @param pageable
* @return / * @return /
*/ */
Object queryAll(LogQueryCriteria criteria, Pageable pageable); Object queryAll(SysLogQueryCriteria criteria, Pageable pageable);
/** /**
* *
* @param criteria * @param criteria
* @return / * @return /
*/ */
List<Log> queryAll(LogQueryCriteria criteria); List<SysLog> queryAll(SysLogQueryCriteria criteria);
/** /**
* *
@ -52,7 +52,7 @@ public interface LogService {
* @param pageable * @param pageable
* @return - * @return -
*/ */
Object queryAllByUser(LogQueryCriteria criteria, Pageable pageable); Object queryAllByUser(SysLogQueryCriteria criteria, Pageable pageable);
/** /**
* *
@ -60,10 +60,10 @@ public interface LogService {
* @param browser * @param browser
* @param ip IP * @param ip IP
* @param joinPoint / * @param joinPoint /
* @param log * @param sysLog
*/ */
@Async @Async
void save(String username, String browser, String ip, ProceedingJoinPoint joinPoint, Log log); void save(String username, String browser, String ip, ProceedingJoinPoint joinPoint, SysLog sysLog);
/** /**
* *
@ -74,11 +74,11 @@ public interface LogService {
/** /**
* *
* @param logs * @param sysLogs
* @param response / * @param response /
* @throws IOException / * @throws IOException /
*/ */
void download(List<Log> logs, HttpServletResponse response) throws IOException; void download(List<SysLog> sysLogs, HttpServletResponse response) throws IOException;
/** /**
* *

View File

@ -24,7 +24,7 @@ import java.sql.Timestamp;
* @date 2019-5-22 * @date 2019-5-22
*/ */
@Data @Data
public class LogErrorDTO implements Serializable { public class SysLogErrorDto implements Serializable {
private Long id; private Long id;

View File

@ -26,7 +26,7 @@ import java.util.List;
* @date 2019-6-4 09:23:07 * @date 2019-6-4 09:23:07
*/ */
@Data @Data
public class LogQueryCriteria { public class SysLogQueryCriteria {
@Query(blurry = "username,description,address,requestIp,method,params") @Query(blurry = "username,description,address,requestIp,method,params")
private String blurry; private String blurry;

View File

@ -24,7 +24,7 @@ import java.sql.Timestamp;
* @date 2019-5-22 * @date 2019-5-22
*/ */
@Data @Data
public class LogSmallDTO implements Serializable { public class SysLogSmallDto implements Serializable {
private String description; private String description;

View File

@ -20,10 +20,10 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import me.zhengjie.domain.Log; import me.zhengjie.domain.SysLog;
import me.zhengjie.repository.LogRepository; import me.zhengjie.repository.LogRepository;
import me.zhengjie.service.LogService; import me.zhengjie.service.SysLogService;
import me.zhengjie.service.dto.LogQueryCriteria; import me.zhengjie.service.dto.SysLogQueryCriteria;
import me.zhengjie.service.mapstruct.LogErrorMapper; import me.zhengjie.service.mapstruct.LogErrorMapper;
import me.zhengjie.service.mapstruct.LogSmallMapper; import me.zhengjie.service.mapstruct.LogSmallMapper;
import me.zhengjie.utils.*; import me.zhengjie.utils.*;
@ -48,14 +48,14 @@ import java.util.*;
*/ */
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
public class LogServiceImpl implements LogService { public class SysLogServiceImpl implements SysLogService {
private final LogRepository logRepository; private final LogRepository logRepository;
private final LogErrorMapper logErrorMapper; private final LogErrorMapper logErrorMapper;
private final LogSmallMapper logSmallMapper; private final LogSmallMapper logSmallMapper;
@Override @Override
public Object queryAll(LogQueryCriteria criteria, Pageable pageable) { public Object queryAll(SysLogQueryCriteria criteria, Pageable pageable) {
Page<Log> page = logRepository.findAll(((root, criteriaQuery, cb) -> QueryHelp.getPredicate(root, criteria, cb)), pageable); Page<SysLog> page = logRepository.findAll(((root, criteriaQuery, cb) -> QueryHelp.getPredicate(root, criteria, cb)), pageable);
String status = "ERROR"; String status = "ERROR";
if (status.equals(criteria.getLogType())) { if (status.equals(criteria.getLogType())) {
return PageUtil.toPage(page.map(logErrorMapper::toDto)); return PageUtil.toPage(page.map(logErrorMapper::toDto));
@ -64,20 +64,20 @@ public class LogServiceImpl implements LogService {
} }
@Override @Override
public List<Log> queryAll(LogQueryCriteria criteria) { public List<SysLog> queryAll(SysLogQueryCriteria criteria) {
return logRepository.findAll(((root, criteriaQuery, cb) -> QueryHelp.getPredicate(root, criteria, cb))); return logRepository.findAll(((root, criteriaQuery, cb) -> QueryHelp.getPredicate(root, criteria, cb)));
} }
@Override @Override
public Object queryAllByUser(LogQueryCriteria criteria, Pageable pageable) { public Object queryAllByUser(SysLogQueryCriteria criteria, Pageable pageable) {
Page<Log> page = logRepository.findAll(((root, criteriaQuery, cb) -> QueryHelp.getPredicate(root, criteria, cb)), pageable); Page<SysLog> page = logRepository.findAll(((root, criteriaQuery, cb) -> QueryHelp.getPredicate(root, criteria, cb)), pageable);
return PageUtil.toPage(page.map(logSmallMapper::toDto)); return PageUtil.toPage(page.map(logSmallMapper::toDto));
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void save(String username, String browser, String ip, ProceedingJoinPoint joinPoint, Log log) { public void save(String username, String browser, String ip, ProceedingJoinPoint joinPoint, SysLog sysLog) {
if (log == null) { if (sysLog == null) {
throw new IllegalArgumentException("Log 不能为 null!"); throw new IllegalArgumentException("Log 不能为 null!");
} }
MethodSignature signature = (MethodSignature) joinPoint.getSignature(); MethodSignature signature = (MethodSignature) joinPoint.getSignature();
@ -88,21 +88,21 @@ public class LogServiceImpl implements LogService {
String methodName = joinPoint.getTarget().getClass().getName() + "." + signature.getName() + "()"; String methodName = joinPoint.getTarget().getClass().getName() + "." + signature.getName() + "()";
// 描述 // 描述
log.setDescription(aopLog.value()); sysLog.setDescription(aopLog.value());
log.setRequestIp(ip); sysLog.setRequestIp(ip);
log.setAddress(StringUtils.getCityInfo(log.getRequestIp())); sysLog.setAddress(StringUtils.getCityInfo(sysLog.getRequestIp()));
log.setMethod(methodName); sysLog.setMethod(methodName);
log.setUsername(username); sysLog.setUsername(username);
log.setParams(getParameter(method, joinPoint.getArgs())); sysLog.setParams(getParameter(method, joinPoint.getArgs()));
// 记录登录用户,隐藏密码信息 // 记录登录用户,隐藏密码信息
if(signature.getName().equals("login") && StringUtils.isNotEmpty(log.getParams())){ if(signature.getName().equals("login") && StringUtils.isNotEmpty(sysLog.getParams())){
JSONObject obj = JSONUtil.parseObj(log.getParams()); JSONObject obj = JSONUtil.parseObj(sysLog.getParams());
log.setUsername(obj.getStr("username", "")); sysLog.setUsername(obj.getStr("username", ""));
log.setParams(JSONUtil.toJsonStr(Dict.create().set("username", log.getUsername()))); sysLog.setParams(JSONUtil.toJsonStr(Dict.create().set("username", sysLog.getUsername())));
} }
log.setBrowser(browser); sysLog.setBrowser(browser);
logRepository.save(log); logRepository.save(sysLog);
} }
/** /**
@ -137,25 +137,25 @@ public class LogServiceImpl implements LogService {
@Override @Override
public Object findByErrDetail(Long id) { public Object findByErrDetail(Long id) {
Log log = logRepository.findById(id).orElseGet(Log::new); SysLog sysLog = logRepository.findById(id).orElseGet(SysLog::new);
ValidationUtil.isNull(log.getId(), "Log", "id", id); ValidationUtil.isNull(sysLog.getId(), "Log", "id", id);
byte[] details = log.getExceptionDetail(); byte[] details = sysLog.getExceptionDetail();
return Dict.create().set("exception", new String(ObjectUtil.isNotNull(details) ? details : "".getBytes())); return Dict.create().set("exception", new String(ObjectUtil.isNotNull(details) ? details : "".getBytes()));
} }
@Override @Override
public void download(List<Log> logs, HttpServletResponse response) throws IOException { public void download(List<SysLog> sysLogs, HttpServletResponse response) throws IOException {
List<Map<String, Object>> list = new ArrayList<>(); List<Map<String, Object>> list = new ArrayList<>();
for (Log log : logs) { for (SysLog sysLog : sysLogs) {
Map<String, Object> map = new LinkedHashMap<>(); Map<String, Object> map = new LinkedHashMap<>();
map.put("用户名", log.getUsername()); map.put("用户名", sysLog.getUsername());
map.put("IP", log.getRequestIp()); map.put("IP", sysLog.getRequestIp());
map.put("IP来源", log.getAddress()); map.put("IP来源", sysLog.getAddress());
map.put("描述", log.getDescription()); map.put("描述", sysLog.getDescription());
map.put("浏览器", log.getBrowser()); map.put("浏览器", sysLog.getBrowser());
map.put("请求耗时/毫秒", log.getTime()); map.put("请求耗时/毫秒", sysLog.getTime());
map.put("异常详情", new String(ObjectUtil.isNotNull(log.getExceptionDetail()) ? log.getExceptionDetail() : "".getBytes())); map.put("异常详情", new String(ObjectUtil.isNotNull(sysLog.getExceptionDetail()) ? sysLog.getExceptionDetail() : "".getBytes()));
map.put("创建日期", log.getCreateTime()); map.put("创建日期", sysLog.getCreateTime());
list.add(map); list.add(map);
} }
FileUtil.downloadExcel(list, response); FileUtil.downloadExcel(list, response);

View File

@ -16,8 +16,8 @@
package me.zhengjie.service.mapstruct; package me.zhengjie.service.mapstruct;
import me.zhengjie.base.BaseMapper; import me.zhengjie.base.BaseMapper;
import me.zhengjie.domain.Log; import me.zhengjie.domain.SysLog;
import me.zhengjie.service.dto.LogErrorDTO; import me.zhengjie.service.dto.SysLogErrorDto;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy; import org.mapstruct.ReportingPolicy;
@ -26,6 +26,6 @@ import org.mapstruct.ReportingPolicy;
* @date 2019-5-22 * @date 2019-5-22
*/ */
@Mapper(componentModel = "spring",unmappedTargetPolicy = ReportingPolicy.IGNORE) @Mapper(componentModel = "spring",unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface LogErrorMapper extends BaseMapper<LogErrorDTO, Log> { public interface LogErrorMapper extends BaseMapper<SysLogErrorDto, SysLog> {
} }

View File

@ -16,8 +16,8 @@
package me.zhengjie.service.mapstruct; package me.zhengjie.service.mapstruct;
import me.zhengjie.base.BaseMapper; import me.zhengjie.base.BaseMapper;
import me.zhengjie.domain.Log; import me.zhengjie.domain.SysLog;
import me.zhengjie.service.dto.LogSmallDTO; import me.zhengjie.service.dto.SysLogSmallDto;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy; import org.mapstruct.ReportingPolicy;
@ -26,6 +26,6 @@ import org.mapstruct.ReportingPolicy;
* @date 2019-5-22 * @date 2019-5-22
*/ */
@Mapper(componentModel = "spring",unmappedTargetPolicy = ReportingPolicy.IGNORE) @Mapper(componentModel = "spring",unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface LogSmallMapper extends BaseMapper<LogSmallDTO, Log> { public interface LogSmallMapper extends BaseMapper<SysLogSmallDto, SysLog> {
} }