面试官:你公司是怎么做日志收集处理的?

news2024/11/28 19:50:11

引言:在现代的软件开发和运维中,日志管理是至关重要的一环。面试官可能会问到如何处理日志收集与分析,特别是在微服务架构中如何有效地管理日志数据。本文将介绍一种常见且广泛应用的解决方案:ELK Stack。

题目

面试官:你公司是怎么做日志收集处理的?

推荐解析

日志采集有很多种方案,我们服务采用的方案是 ELK 那套:

  • ElasticSearch: ElasticSearch 是一个分布式搜索和分析引擎,可以存储和索引大量的日志数据,他提供了快速的搜索和聚合功能,可以实现大规模日志数据的高效处理。
  • Logstash: Logstash 是一个用于采集、过滤和转发日志数据的工具。它可以从文件、消息队列、网络等多种渠道实现日志数据的采集,并对数据进行处理以及转换,最后发到 ElasticSearch 进行存储和索引。
  • Kibana:Kibana 是一个日志数据可视化以及分析的工具,它提供了丰富的图表以及仪表盘工具,可以帮助用户实现日志数据的实时监控和分析。

确定好技术栈之后,我们来分析一下每个技术的功能,ElasticSearch 主要负责数据的存储和检索,Logstash 主要负责从微服务集群采集日志,然后将日志数据发送到 ES,最后 Kibana 就负责日志数据的可视化分析,其流程如下图所示:

1)在微服务中配置日志输出,然后将服务日志输出到日志文件中。

2)使用 Logstash 收集日志:配置 Logstash 日志收集器,通过配置收集插件(文件输入收集、网络输入收集等),监听服务的日志输出,然后针对日志信息实现过滤以及处理。

3)LogStash 将日志数据发送到 ElasticSearch:配置 LogStash 的输出插件,将经过处理的日志数据发送到 ElasticSearch 进行存储和索引。

4)使用 Kibana 进行可视化以及分析:通过将 Kibana 连接到 ElasticSearch,创建仪表盘、图表以及搜索查询,从而实时监控和分析微服务的日志数据。

除此之外,监控的方案还有很多,如 Graylog,Lokii 等,这里就不一一列举了,感兴趣的同学可以去了解一下。

日志服务作用

1)故障排查与问题定位:日志是排查故障和定位问题的关键工具。收集并分析日志可以帮助发现系统中的错误、异常或警告,从而快速定位问题并进行修复。

2)性能监控与优化:通过收集和分析日志,可以监控系统的性能指标,如响应时间、吞吐量等,进而进行系统优化和性能调优。

3)安全审计与监控:日志记录了系统的各种操作和事件,包括用户登录、权限变更、访问控制等,有助于进行安全审计和监控,及时发现异常行为。

简单的数据大屏日志监控

Java应用程序生成日志数据

这里我们使用Java程序生成一些模拟的日志数据,并通过HTTP POST请求将数据发送到Elasticsearch中。

import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;

import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Random;

public class LogGenerator {

    private static final String ELASTICSEARCH_HOST = "localhost";
    private static final int ELASTICSEARCH_PORT = 9200;
    private static final String INDEX_NAME = "logs";

    private static final String[] LOG_LEVELS = {"INFO", "WARN", "ERROR"};
    private static final String[] LOG_MESSAGES = {
        "Application started successfully",
        "Warning: Resource usage high",
        "Error: Database connection failed"
    };

    public static void main(String[] args) {
        Random random = new Random();

        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            HttpHost target = new HttpHost(ELASTICSEARCH_HOST, ELASTICSEARCH_PORT, "http");
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");

            for (int i = 0; i < 50; i++) {
                LocalDateTime timestamp = LocalDateTime.now();
                String logLevel = LOG_LEVELS[random.nextInt(LOG_LEVELS.length)];
                String message = LOG_MESSAGES[random.nextInt(LOG_MESSAGES.length)];

                JSONObject json = new JSONObject();
                json.put("@timestamp", timestamp.format(formatter));
                json.put("level", logLevel);
                json.put("message", message);

                StringEntity entity = new StringEntity(json.toString());
                HttpPost request = new HttpPost("/" + INDEX_NAME + "/_doc");
                request.setEntity(entity);

                CloseableHttpResponse response = httpClient.execute(target, request);
                try {
                    HttpEntity responseEntity = response.getEntity();
                    EntityUtils.consume(responseEntity);
                } finally {
                    response.close();
                }

                Thread.sleep(500); // Simulate log generation interval
            }
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}
HTML/JavaScript 大屏界面

下面是一个简单的HTML页面和JavaScript代码,用来从Elasticsearch中检索日志数据并展示在页面上。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Log Dashboard</title>
    <style>
        body {
            font-family: Arial, sans-serif;
        }
        .log-entry {
            margin-bottom: 10px;
            padding: 10px;
            border: 1px solid #ccc;
            border-radius: 5px;
        }
        .log-entry.warning {
            background-color: #ffeeba;
        }
        .log-entry.error {
            background-color: #f8d7da;
        }
    </style>
</head>
<body>
    <h1>Log Dashboard</h1>
    <div id="logEntries"></div>

    <script>
        const fetchLogs = async () => {
            try {
                const response = await fetch('http://localhost:9200/logs/_search');
                const data = await response.json();
                const logs = data.hits.hits.map(hit => hit._source);

                const logEntries = document.getElementById('logEntries');
                logEntries.innerHTML = '';
                logs.forEach(log => {
                    const logEntry = document.createElement('div');
                    logEntry.classList.add('log-entry', log.level.toLowerCase());
                    logEntry.innerHTML = `<strong>${log.level}</strong>: ${log.message} - ${log['@timestamp']}`;
                    logEntries.appendChild(logEntry);
                });
            } catch (error) {
                console.error('Error fetching logs:', error);
            }
        };

        fetchLogs();
        setInterval(fetchLogs, 5000); // Refresh logs every 5 seconds
    </script>
</body>
</html>

其他补充

鱼聪明 AI 的回答:

鱼聪明 AI 地址:https://www.yucongming.com/

在Java应用程序中,使用日志服务是非常常见和重要的实践,可以通过Java内置的日志框架或者第三方日志库来实现。下面是简单介绍如何在Java中使用日志服务的一般步骤:

  1. 选择日志框架
    • Java.util.logging:这是Java平台自带的日志框架,不需要额外的依赖,直接可以在标准库中使用。
    • Log4jLog4j2:Apache Log4j是Java中广泛使用的日志框架,提供了丰富的配置选项和灵活性。
    • Logback:由Log4j的原作者开发,被认为是Log4j的升级版本,提供了更高的性能和灵活的配置。
  2. 配置日志框架
    • 针对每种日志框架,都需要相应的配置文件或者代码来指定日志输出的格式、级别和目的地(如控制台、文件、远程服务器等)。
  3. 添加日志语句
    • 在代码中添加日志语句,用于记录程序执行过程中的关键事件、状态信息或者错误信息。
    • 典型的日志级别包括:DEBUG(调试信息)、INFO(一般信息)、WARN(警告信息)、ERROR(错误信息)等,根据需要选择合适的级别。

下面是一个使用Java.util.logging的简单示例:

import java.util.logging.*;

public class MyLogger {
    private static final Logger logger = Logger.getLogger(MyLogger.class.getName());

    public static void main(String[] args) {
        logger.info("这是一个信息日志");
        logger.warning("这是一个警告日志");
        logger.severe("这是一个严重错误日志");
    }
}

在上面的示例中:

  • 使用Logger.getLogger()方法获取Logger对象。
  • 通过logger.info()logger.warning()logger.severe()方法分别记录信息、警告和严重错误的日志。

对于Log4j或Logback等其他日志框架,使用方法类似,主要区别在于配置文件和日志对象的获取方式略有不同。使用这些日志框架能够帮助开发者规范和管理应用程序的日志,从而更方便地进行监控、故障排查和性能优化。

欢迎交流

本文主要介绍了日志收集处理的一般方法,简单举例了日志监控大屏的例子,日志监控可以加入到自己的任何项目中作为简历的一个亮点处理,在文末还有三个问题,来检验本次学习的成果,欢迎小伙伴在评论区进行留言!近期面试鸭小程序已全面上线,想要刷题的小伙伴可以积极参与!

1)如何有效地收集和存储大量的日志数据?

2)如何对海量的日志数据进行分析,从中提取出有用的信息和洞见?

3)如何实现基于角色的访问控制,确保只有授权用户能够查看和操作日志数据?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1825259.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

10W大奖等你瓜分,OpenTiny CCF开源创新大赛报名火热启动!

OpenTiny CCF开源创新大赛正式启幕&#xff01; &#x1f31f;10万奖金&#xff0c;等你来战&#xff01; &#x1f31f; &#x1f465;无论你是独行侠还是团队英雄&#x1f465; 只要你对前端技术充满热情&#xff0c; 渴望在实战中磨砺技能&#xff0c; 那么&#xff0c…

eclipse中报出Invaild project path

一、问题&#xff1a; 二、提示分析&#xff1a; 资源路径位置类型无效的项目路径&#xff1a;找到重复的路径条目 项目路径中有一个名为"/eclipse_rtt_demo"的条目被多次定义&#xff0c;这在Eclipse的构建路径设置中是不允许的。这个重复的条目既被标记为系统包含…

Postman接口测试/接口自动化实战教程

一、API 自动化测试 Postman 最基本的功能用来重放请求&#xff0c;并且配合良好的 response 格式化工具。 高级点的用法可以使用 Postman 生成各个语言的脚本&#xff0c;还可以抓包&#xff0c;认证&#xff0c;传输文件。 仅仅做到这些还不能够满足一个系统的开发&#x…

增值税发票OCR识别API在Java、Python、PHP中的使用教程

​增值税发票OCR识别是一种利用光学字符识别&#xff08;OCR&#xff09;技术&#xff0c;自动提取和识别增值税发票上的文字信息的过程。增值税发票是企业在销售商品或提供服务过程中产生的一种税务凭证&#xff0c;包含了关键的财务信息&#xff0c;如商品明细、金额、税率等…

pdf structuredClone is not defined 解决

问题 部分手机系统的浏览器 pdf v2版本会出现 structuredclone is not defined 的报错&#xff0c;这是因为浏览器过低 解决 查看structuredClone的浏览器兼容性 structuredClone api 文档 polyfill 网站下方有个 polyfill的网址入口 可以解决低版本的兼容问题 相应网址…

QT day02

思维导图 UI界面设计 设置登录界面&#xff0c;输入账号、密码&#xff0c;登录/取消 按钮 使用手动连接&#xff0c;将登录框中的取消按钮使用第二中连接方式&#xff0c;右击转到槽&#xff0c;在该槽函数中&#xff0c;调用关闭函数 将登录按钮使用qt4版本的连接到自定义…

计算机组成原理学习 Part 1

计算机系统 组成 计算机系统 { 硬件 计算机的实体&#xff0c;如主机、外设等 软件 由具有各类特殊功能的信息&#xff08;程序&#xff09;组成 计算机系统 \begin{cases} 硬件 &\text 计算机的实体&#xff0c;如主机、外设等\\ 软件 &\text 由具有各类特殊功能的信…

牛客链表刷题(二)

目录 题目一&#xff1a;合并两个有序链表 代码&#xff1a; 题目二&#xff1a;合并k个有序链表 代码&#xff1a; 题目三&#xff1a;判断链表中是否有环 代码&#xff1a; 题目四&#xff1a;链表中环的入口结点 代码&#xff1a; 题目一&#xff1a;合并两个有序链表 代…

B端系统:面向用户or面向客户?有啥区别?当二者起冲突呢?

在B端系统中用户和客户大部分情况下是分离的&#xff0c;不像C端&#xff0c;用户即客户。那么用户和客户到底怎么区分&#xff0c;做B端设计到底听谁的呢&#xff1f;大美B端工场为大家详细解读下。 一、B端产品的用户和客户 在B端产品中&#xff0c;用户和客户是两个不同的…

推荐一款mac截图利器

一、介绍 Longshot 是 macOS 上一款功能丰富的截图工具&#xff0c;它提供了多种截图方式和便捷的标注功能。主要包含以下功能特点&#xff1a; 多种截图方式&#xff1a;Longshot 支持区域截图、全屏截图、窗口截图以及滚动截图。 标注工具&#xff1a;提供了丰富的标注工具…

FlinkCDC 3.1.0 支持 Flink 1.18.0 版本选择

问题&#xff1a;FlinkCDC 3.1.0 pipeline 与 Flink 1.17.0 可能是因为出现版本不支持的问题&#xff08;已实测&#xff09; 持续报错&#xff1a; -- client log Exception in thread "main" java.lang.BootstrapMethodError: java.lang.NoSuchMethodError: org.a…

开源医疗大模型Llama3-Aloe-8B-Alpha,性能超越 MedAlpaca 和 PMC-LLaMA

前言 近年来&#xff0c;大型语言模型 (LLM) 在医疗领域展现出巨大潜力&#xff0c;能够帮助医生和研究人员更快地获取信息、分析数据&#xff0c;并提高医疗服务效率。然而&#xff0c;目前市场上大多数医疗 LLM 都是闭源模型&#xff0c;限制了其在学术研究和应用领域的推广…

二层弹出框,点掉小弹出框后,遮罩层没有消失

解决办法把 父元素的vue实例对象的&#xff0c;最后一个元素删除。删除的就是遮罩层元素 thus.$ refs.dialig.$ parent.$ el.lastChild. remove()

Bigtable: A Distributed Storage System for Structured Data

2003年USENIX&#xff0c;出自谷歌&#xff0c;开启分布式大数据时代的三篇论文之一&#xff0c;底层依赖 GFS 存储&#xff0c;上层供 MapReduce 查询使用 Abstract 是一种分布式结构化数据存储管理系统&#xff0c;存储量级是PB级别。存储的数据类型和延时要求差异都很大。…

Pytest 记录日志输出到控制台和写入文件

目录 自定义日志记录器和内置的日志记录器 项目代码 项目目录树 自定义日志记录器 函数源代码 pytest中定义和覆盖日志记录信息 使用cli定义Logging 使用pytest.ini定义Logging 修改单个测试级别的日志 日志输出的重要性不言而喻&#xff0c;不仅可以观测执行过程&…

重学Spring总结

1、Spring框架的诞生 文章目录 1、Spring框架的诞生1、BeanFactory 快速入门1.1、BeanFactory完成了loC思想的实现&#xff1a;1)导入Spring相关的依赖&#xff1a;2)定义Uservice接口及其UserviceImpl实现类&#xff1b;3)创建Bean的配置资源文件&#xff0c;文件名最好为&…

Windows 服务器Nginx 下载、部署、配置流程(图文教程)

不定期更新 目录 一、下载Nginx安装包 二、上传安装包 三、启动Nginx 四、Nginx常用命令 五、Nginx&#xff08;最小&#xff09;配置详解 六、Nginx&#xff08;基础&#xff09;配置详解 七、反向代理 八、负载均衡 九、动静分离 十、报错 一、下载Nginx安装包 四…

论文阅读笔记:Cross-Image Relational Knowledge Distillation for Semantic Segmentation

论文阅读笔记&#xff1a;Cross-Image Relational Knowledge Distillation for Semantic Segmentation 1 背景2 创新点3 方法4 模块4.1 预备知识4.2 跨图像关系知识蒸馏4.3 Memory-based像素到像素蒸馏4.4 Memory-based像素到区域蒸馏4.5 整体框架 5 效果 论文&#xff1a;http…

chatgpt的命令词

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

Pycharm社区版搭建Django环境及Django简单项目、操控mysql数据库

Web应用开发&#xff08;Django&#xff09; 一、配置Django环境 1、先通过Pycharm社区版创建一个普通的项目 2、依次点击”file"-->"Settings" 3、点击"Project:项目名"-"Python Interpreter"-"号" 4、在搜索框输入要安装的…