【日志系列】什么是分布式日志系统?

✔️什么是分布式日志系统?

现在,很多应用都是集群部署的,一次请求会因为负载均衡而被路由到不同的服务器上面,这就导致一个应用的日志会分散在不同的服务器上面。

当我们要向通过日志做数据分析,问题排查的时候,就需要分别到每台机器上去查看日志,这样就太麻烦了。

于是就有了分布式日志系统,他可以做分布式系统中的日志的统一收集、存储及管理。并且提供好的可用性、扩展性。

一个好的分布式日志系统,应该具备数据采集、数据加工、查询分析、监控报警、日志审计等功能。有了分布式日志系统,我们就可以做集中化的日志管理, (准)实时性的做日志查询及分析,快速的做问题排查,更好的做数据分析及挖掘。

比较主流的这类日志管理系统有ELK、Graylog、Apache Flume,还有很多类似的云产品,如阿里云的SLS。

一般来说,如果资金够就上SLS,不够就自建ELK。

实现分布式日志系统需要使用分布式系统的一些基本概念和技术,例如消息传递、数据复制和分布式一致性协议。在Java中实现分布式日志系统可以使用一些现有的框架和库,例如Apache Kafka或Logstash。

看一个Demo:

java 复制代码
import java.util.Properties;  
import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
import java.util.concurrent.TimeUnit;  
import org.apache.kafka.clients.producer.*;  

/**
*    一个分布式日志系统的Demo、包括日志的收集、处理、存储和检索功能
*    
*/  
public class DistributedLogSystem {  
    public static void main(String[] args) {  
        // 创建日志收集器线程池  
        ExecutorService collectorPool = Executors.newFixedThreadPool(10);  
  
        // 创建Kafka生产者配置  
        Properties props = new Properties();  
        props.put("bootstrap.servers", "localhost:9092");  
        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");  
        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");  
  
        // 创建Kafka生产者  
        Producer<String, String> producer = new KafkaProducer<>(props);  
  
        // 启动日志收集器线程  
        for (int i = 0; i < 10; i++) {  
            final int threadId = i;  
            collectorPool.submit(() -> {  
                try {  
                    // 模拟日志收集逻辑  
                    for (int j = 0; j < 1000; j++) {  
                        String topic = "logs";  
                        String message = "Log message " + threadId + "_" + j;  
                        ProducerRecord<String, String> record = new ProducerRecord<>(topic, message);  
                        producer.send(record);  
                    }  
                } catch (Exception e) {  
                    e.printStackTrace();  
                }  
            });  
        }  
  
        // 关闭日志收集器线程池和Kafka生产者  
        collectorPool.shutdown();  
        try {  
            if (!collectorPool.awaitTermination(60, TimeUnit.SECONDS)) {  
                collectorPool.shutdownNow();  
            }  
            producer.close();  
        } catch (InterruptedException e) {  
            collectorPool.shutdownNow();  
            producer.close();  
            Thread.currentThread().interrupt();  
        }  
    }  
}

上面这个Demo中,首先创建了一个线程池用于日志收集器线程,然后创建了一个Kafka生产者对象。接着,使用线程池启动了10个日志收集器线程,每个线程模拟日志收集逻辑,并将收集到的日志消息发送到Kafka中。最后,关闭了日志收集器线程池和Kafka生产者对象。

✔️扩展知识仓

ELK

ELK是三个开源软件的缩写,分别表示: Elasticsearch,Logstash,Kibana。

Elasticsearch是个开源分布式搜索引擎,提供分析、存储数据等功能

Logstash主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式

Kibana也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。

所以,通常是使用Logstash做日志的采集与过滤,ES做分析和查询,Kibana做图形化界面

相关推荐
憨子周1 小时前
2M的带宽怎么怎么设置tcp滑动窗口以及连接池
java·网络·网络协议·tcp/ip
霖雨2 小时前
使用Visual Studio Code 快速新建Net项目
java·ide·windows·vscode·编辑器
SRY122404192 小时前
javaSE面试题
java·开发语言·面试
Fiercezm3 小时前
JUC学习
java
无尽的大道3 小时前
Java 泛型详解:参数化类型的强大之处
java·开发语言
ZIM学编程3 小时前
Java基础Day-Sixteen
java·开发语言·windows
我不是星海3 小时前
1.集合体系补充(1)
java·数据结构
斑驳竹影3 小时前
【RabbitMQ】之高可用集群搭建
分布式·rabbitmq
P.H. Infinity3 小时前
【RabbitMQ】07-业务幂等处理
java·rabbitmq·java-rabbitmq
爱吃土豆的程序员3 小时前
java XMLStreamConstants.CDATA 无法识别 <![CDATA[]]>
xml·java·cdata