生产环境是Linux,日志不好查?自己开发一个下载日志功能页面

有时候甲方爸爸的项目要部署内网,日志不能直接copy,还是linux系统。排查日志很不方便。

自己搞一个日志下载功能,如果是分布式的项目,还能把其他项目的日志也一起copy下来,来看。

public BiStateDTO<Object>  logList(@RequestBody LogParams params) {
    IPage<LogVO> page = new Page<LogVO>(params.getPageNum(), params.getPageSize());
    String resourcePath = UploadUtil.getClassResources()+ File.separator+"log";
    if(StringUtils.isNotEmpty(params.getServer())){
        // 获取上一级目录的Path对象
        Path parentDir = Paths.get(UploadUtil.getClassResources()).getParent();
        resourcePath = parentDir.toAbsolutePath()+ File.separator+params.getServer()+ File.separator+"log";
    }
    if(StringUtils.isNotEmpty(params.getSubject()) && params.getServer().equals(LogParams.Server.NETHOSPITAL.getValue())){
        //互联网项目的admin目录
        resourcePath = resourcePath  +"/" +params.getSubject();
        if(StringUtils.isEmpty(params.getLogType())){
            resourcePath = resourcePath  +"/info";
        }
    }
    if(StringUtils.isNotEmpty(params.getLogType())){
        resourcePath = resourcePath  +"/" +params.getLogType();
    }
    log.info("resourcePath:"+resourcePath);

    List<LogVO> list = retrieveLogFileNames(resourcePath);

    if(StringUtils.isNotEmpty(params.getSubject())  && !params.getServer().equals(LogParams.Server.NETHOSPITAL.getValue())){
        //其他项目日志遍历出带有admin名称的日志
        list = list.stream()
                .filter(logVO -> logVO.getPath().contains(params.getSubject()))
                .collect(Collectors.toList());
    }
    List<LogVO> sortedList = StreamUtils.sortedList(list,LogVO::getLastModify,false);
    return HandlerUtil.getBiStateDTO(sortedList,sortedList.size());
}

定义一个方法,加载日志列表

下载的时候直接地址请求日志文件路径即可

如果是下载其他同磁盘的目录日志,做个复制文件功能在下载

private Path PathcopyFile(Path resourcePath){
    Path currentWorkDir = Paths.get(System.getProperty("user.dir"));
    // 定义目标目录路径
    Path targetDir = currentWorkDir.resolve("log/temp/");

    // 如果目标目录不存在,则创建它
    try {
        Files.createDirectories(targetDir);
    } catch (IOException e) {
        log.error(e.getMessage(),e);
        return null;
    }
    // 定义目标文件路径
    Path targetPath = targetDir.resolve(resourcePath.getFileName());

    // 复制文件
    try {
        Files.copy(resourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
        System.out.println("文件复制成功!");
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("文件复制失败:" + e.getMessage());
    }
    log.info("复制生成:"+targetPath);
    return targetPath;
}

当然 如果你要过滤日志文件的内容,比如通过MDC值或者日志某个用户的信息来过滤

public String   getTheadLog(@RequestBody LogParams params) {
    String sourceFilePath = params.getDownLoadFilePath();
    String mdcKey=params.getMdcKey();
    String resourcePath = UploadUtil.getClassResources()+ File.separator+"log";
    String targetFilePath = resourcePath+"/thread.log"; // 目标文件路径
    String mdcPrefix = "MDC["+mdcKey+"]"; // MDC前缀

    Path filePath = Paths.get(targetFilePath);

    try {
        // 确保文件的父目录存在
        //Files.createDirectories(filePath.getParent());
        // 检查文件是否存在
        if (!Files.exists(filePath)) {
            // 文件不存在,则创建它
            Files.createFile(filePath);
        } else {
            Files.deleteIfExists(filePath);
            Files.createFile(filePath);
        }
    } catch (IOException e) {
        // 处理可能发生的IO异常
        e.printStackTrace();
    }

    if(StringUtils.isNotEmpty(params.getUserName())){
        //先过滤出用户所有请求的mdc值
        try {
            Files.lines(Paths.get(sourceFilePath.toString()), StandardCharsets.UTF_8)
                    .filter(line->line.endsWith(FIND_STR+params.getUserName()))
                    .forEach(line -> {
                        Matcher mdcMatcher = MDC_PATTERN.matcher(line);
                        if (mdcMatcher.find()) {
                            mdcSet.add(mdcMatcher.group(1));// 提取MDC值
                        }
                    });
        } catch (IOException e) {
            log.error(e.getMessage(),e);
        }

        try {
            Files.lines(Paths.get(sourceFilePath.toString()), StandardCharsets.UTF_8)
                    .filter(line ->mdcSet.stream().anyMatch(mdc -> line.startsWith(MDC_PREFIX + mdc)))
                    .forEach(line -> {
                        try {
                            Files.write(Paths.get(targetFilePath), (line + System.lineSeparator()).getBytes(StandardCharsets.UTF_8),
                                    StandardOpenOption.APPEND, StandardOpenOption.CREATE);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    });
        } catch (IOException e) {
            e.printStackTrace();
        }

    }else{
        //根据用户所有的mdc值过滤内容
        try {
            Files.lines(Paths.get(sourceFilePath.toString()), StandardCharsets.UTF_8)
                    .filter(line -> line.startsWith(mdcPrefix))
                    .forEach(line -> {
                        try {
                            Files.write(Paths.get(targetFilePath), (line + System.lineSeparator()).getBytes(StandardCharsets.UTF_8),
                                    StandardOpenOption.APPEND, StandardOpenOption.CREATE);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    log.info("targetFilePath:"+targetFilePath);
    return "log/thread.log";
}

效果录下

 需要寄快递的朋友,这个小程序发快递只要五块钱哦~

 

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 我可以为您建议一些步骤来开发一个叫监控Linux页面:1)收集信息:了解Linux操作系统的功能及其应用;2)设计页面:确定您希望在您的页面上显示哪些内容;3)编程:使用Linux的编程语言(如Bash)编写代码;4)测试:运行页面,确保它能够正常工作;5)部署:将页面发布到互联网上进行共享。 ### 回答2: 监控Linux系统是一项重要的任务,因此开发一个专门用于监控Linux系统的页面可以提升我们对系统的管理和维护能力。 首先,这个页面应该提供关键性能指标的实时监控。包括CPU使用率、内存和磁盘使用率、网络流量等。通过直观的图表和数据展示,我们可以迅速了解系统的健康状况,并及时发现并解决潜在的问题。 其次,我们还可以在页面上配置阈值和警报规则。一旦某项指标超出设定的阈值,系统会自动触发警报机制,以便我们在出现问题时能够及时采取行动。这可以帮助我们避免潜在的故障和系统崩溃。 除了性能监控,这个页面还应该提供系统日志功能。可以根据时间、关键词等条件进行搜索和过滤,以便我们找到特定事件或错误信息。这对于故障排和系统优化非常有帮助。 此外,页面还可以显示正在运行的进程和服务的状态。我们可以实时看每个进程和服务的资源占用情况,以便针对性地进行优化和调整。 最后,为了方便远程管理,我们可以在页面上添加远程终端的功能。这样,我们可以直接在页面上执行命令和操作,而无需登录到服务器。这将极大地提高我们的工作效率,并减少操作的复杂性和出错的可能性。 总之,开发一个监控Linux系统的页面可以让我们更方便、高效地管理和维护系统。通过实时监控关键指标、配置警报规则、看系统日志、管理进程和服务,以及远程终端操作,我们能够及时发现并解决问题,确保系统始终处于良好的状态。 ### 回答3: 开发一个叫监控Linux页面将是一个非常有用的工具,可以帮助系统管理员实时监控和管理Linux服务器的状态。以下是我对这个页面的构想和功能描述。 该页面的主要功能是监控Linux服务器的性能和运行状况。它将提供以下几个关键的功能: 1. 系统概览:页面会展示Linux服务器的概要信息,包括主机名、操作系统版本、CPU和内存使用情况等。这将帮助管理员快速了解服务器的整体状态。 2. 实时性能监控:页面将实时显示服务器的CPU、内存和磁盘使用情况等性能指标。管理员可以通过图表直观地观察这些指标的变化,并在需要时采取相应的措施。 3. 进程监控:页面将列出当前在服务器上运行的进程,并显示它们的CPU和内存占用情况。管理员可以通过检这些进程来发现可能存在的问题,并对占用资源过多的进程进行优化或终止。 4. 网络状态监控:页面将显示服务器的网络连接信息,包括当前的连接数、传输速率等。管理员可以通过这些信息来监视服务器与外部网络的通信情况,并及时发现并解决网络问题。 5. 日志看:页面将提供对系统日志的访问和搜索功能,管理员可以直接在页面看和搜索服务器日志文件,以便更方便地进行故障排日志分析。 6. 告警功能:该页面还将提供告警功能,当服务器的某些指标超过设定的阈值时,会发送警报通知管理员。管理员可以根据警报信息及时采取措施,确保服务器的正常运行。 在开发这个页面时,需考虑安全性和可扩展性。为确保数据的安全,页面应采用合适的认证和权限控制机制,只允许授权的用户访问和管理服务器。同时,还需要考虑支持多台服务器的监控,管理员可以通过页面管理多台Linux服务器的状态。 总而言之,这个页面将成为系统管理员的得力工具,帮助他们实时监控和管理Linux服务器,提高工作效率,并及时发现和解决潜在的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小池先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值