项目集成ELK

文章目录

1.配置log4j2将日志实时写入logstash

1.创建combinations-elk-starter
1.目录结构
2.ELKAutoConfiguration.java 自动配置类
java 复制代码
package com.sunxiansheng.elk.config;

import org.springframework.context.annotation.Configuration;

/**
 * Description: ELK自动配置类
 *
 * @Author sun
 * @Create 2024/12/31 13:14
 * @Version 1.0
 */
@Configuration
public class ELKAutoConfiguration {
}
3.spring.factories
factories 复制代码
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.sunxiansheng.elk.config.ELKAutoConfiguration
4.pom.xml 引入common-log4j2-starter
xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.sunxiansheng</groupId>
        <artifactId>sunrays-combinations</artifactId>
        <version>1.0.5</version>
    </parent>

    <artifactId>combinations-elk-starter</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.sunxiansheng</groupId>
            <artifactId>common-log4j2-starter</artifactId>
            <version>1.0.5</version>
        </dependency>
    </dependencies>
</project>
5.查看是否被父模块所管理
6.log4j2-spring.xml使用SocketAppender实时写入logstash
1.文件
xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!-- Log4j2 配置的根元素 -->
<Configuration status="INFO" monitorInterval="30">
<!--
    status="INFO":设置 Log4j2 内部日志的输出级别为 INFO,用于调试配置问题。
    monitorInterval="30":Log4j2 将每 30 秒检查一次配置文件的变化,实现热加载配置。
-->

<!-- TRACE < DEBUG < INFO < WARN < ERROR < FATAL -->

<!-- 定义全局属性,可在整个配置文件中使用 -->
<Properties>
    <!-- logstash 的 SocketAppender 配置 -->
    <Property name="socket.host">guest</Property>
    <Property name="socket.port">guest</Property>

    <!-- logstash 日志输出格式使用 |#| 作为分割符号 -->
    <Property name="LOGSTASH_PATTERN">
        %d{yyyy-MM-dd HH:mm:ss.SSS}|#|%t|#|%p|#|%X{PFTID}|#|${sys:log.module}|#|%logger{36}|#|%msg|#|%throwable%n
    </Property>

    <!-- 日志存储的根目录 -->
    <Property name="LOG_HOME">${sys:log.home}</Property>

    <!-- 日志文件的名称前缀 -->
    <Property name="LOG_NAME">sunrays-framework</Property>

    <!-- 控制台日志输出格式,带颜色 -->
    <Property name="CONSOLE_LOG_PATTERN">
        %style{%d{yyyy-MM-dd HH:mm:ss.SSS}}{green} %style{[%t]}{blue} %highlight{%p}{FATAL=red blink, ERROR=red, WARN=yellow, INFO=green, DEBUG=cyan, TRACE=magenta} %style{[PFTID:%X{PFTID}]}{magenta} %style{[Module:${sys:log.module}]}{yellow} %style{%logger{36}}{cyan} - %msg%n%throwable
    </Property>

    <!-- 文件日志输出格式,不带颜色 -->
    <Property name="FILE_LOG_PATTERN">
        %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p [PFTID:%X{PFTID}] [Module:${sys:log.module}] %logger{36} - %msg%n%throwable
    </Property>
</Properties>

<!-- 定义日志输出目的地(Appender) -->
<Appenders>
    <!-- 定义 SocketAppender -->
    <Socket name="RealTimeSocketAppender" host="${socket.host}" port="${socket.port}">
        <!-- 使用不带颜色的布局模式 -->
        <PatternLayout pattern="${LOGSTASH_PATTERN}"/>
        <!-- 添加日志级别过滤器只要info以及以上的日志 -->
        <Filters>
            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY" />
        </Filters>
    </Socket>

    <!-- 控制台输出 -->
    <Console name="Console" target="SYSTEM_OUT">
        <!-- 使用带颜色的布局模式 -->
        <PatternLayout pattern="${CONSOLE_LOG_PATTERN}"/>
        <!-- 设置日志级别过滤器,只允许 INFO 及以上级别 -->
        <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
    </Console>

    <!-- INFO 级别日志文件输出 -->
    <RollingFile name="InfoFile"
                 fileName="${LOG_HOME}/unarchived/info/${date:yyyy-MM-dd}/current.log"
                 filePattern="${LOG_HOME}/archived/info/${date:yyyy-MM-dd}/${LOG_NAME}-info-%d{yyyy-MM-dd-HH-mm-ss}-%i.log.gz">
        <!-- 使用不带颜色的布局模式 -->
        <PatternLayout pattern="${FILE_LOG_PATTERN}"/>
        <Policies>
            <!-- 使用 Cron 表达式,每2小时归档一次 -->
            <CronTriggeringPolicy schedule="0 0 0/2 * * ?"/>
            <!-- 文件大小超过 50MB 时归档 -->
            <SizeBasedTriggeringPolicy size="50MB"/>
        </Policies>
        <DefaultRolloverStrategy>
            <!-- 删除超过7天的归档日志(Log4j2 2.7 及以上版本的特性)-->
            <Delete basePath="${LOG_HOME}/archived/info" maxDepth="2">
                <IfFileName glob="*.log.gz"/>                        <!-- 匹配 .log.gz 的文件 -->
                <IfLastModified age="7d"/>                           <!-- 文件修改时间超过7天 -->
            </Delete>
        </DefaultRolloverStrategy>
        <Filters>
            <!-- 只接受 INFO 及以上级别的日志 -->
            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
        </Filters>
    </RollingFile>

    <!-- WARN 级别日志文件输出 -->
    <RollingFile name="WarnFile"
                 fileName="${LOG_HOME}/unarchived/warn/${date:yyyy-MM-dd}/current.log"
                 filePattern="${LOG_HOME}/archived/warn/${date:yyyy-MM-dd}/${LOG_NAME}-warn-%d{yyyy-MM-dd-HH-mm-ss}-%i.log.gz">
        <PatternLayout pattern="${FILE_LOG_PATTERN}"/>
        <Policies>
            <CronTriggeringPolicy schedule="0 0 0/2 * * ?"/>
            <SizeBasedTriggeringPolicy size="50MB"/>
        </Policies>
        <DefaultRolloverStrategy>
            <Delete basePath="${LOG_HOME}/archived/warn" maxDepth="2">
                <IfFileName glob="*.log.gz"/>
                <IfLastModified age="7d"/>
            </Delete>
        </DefaultRolloverStrategy>
        <Filters>
            <!-- 只接受 WARN 及以上级别的日志 -->
            <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
        </Filters>
    </RollingFile>

    <!-- ERROR 级别日志文件输出 -->
    <RollingFile name="ErrorFile"
                 fileName="${LOG_HOME}/unarchived/error/${date:yyyy-MM-dd}/current.log"
                 filePattern="${LOG_HOME}/archived/error/${date:yyyy-MM-dd}/${LOG_NAME}-error-%d{yyyy-MM-dd-HH-mm-ss}-%i.log.gz">
        <PatternLayout pattern="${FILE_LOG_PATTERN}"/>
        <Policies>
            <CronTriggeringPolicy schedule="0 0 0/2 * * ?"/>
            <SizeBasedTriggeringPolicy size="50MB"/>
        </Policies>
        <DefaultRolloverStrategy>
            <Delete basePath="${LOG_HOME}/archived/error" maxDepth="2">
                <IfFileName glob="*.log.gz"/>
                <IfLastModified age="7d"/>
            </Delete>
        </DefaultRolloverStrategy>
        <Filters>
            <!-- 只接受 ERROR 及以上级别的日志 -->
            <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
        </Filters>
    </RollingFile>

    <!-- 全部级别日志文件输出(包含 DEBUG 及以上) -->
    <RollingFile name="AllFile"
                 fileName="${LOG_HOME}/unarchived/all/${date:yyyy-MM-dd}/current.log"
                 filePattern="${LOG_HOME}/archived/all/${date:yyyy-MM-dd}/${LOG_NAME}-all-%d{yyyy-MM-dd-HH-mm-ss}-%i.log.gz">
        <PatternLayout pattern="${FILE_LOG_PATTERN}"/>
        <Policies>
            <CronTriggeringPolicy schedule="0 0 0/2 * * ?"/>
            <SizeBasedTriggeringPolicy size="50MB"/>
        </Policies>
        <DefaultRolloverStrategy>
            <Delete basePath="${LOG_HOME}/archived/all" maxDepth="2">
                <IfFileName glob="*.log.gz"/>
                <IfLastModified age="7d"/>
            </Delete>
        </DefaultRolloverStrategy>
        <!-- 不添加 ThresholdFilter,接受所有级别的日志 -->
    </RollingFile>
</Appenders>

<!-- 配置日志记录器(Logger),定义日志的输出规则和级别 -->
<Loggers>
    <!--
        以下是针对特定模块的日志配置,目前被注释掉了。
        可以根据需要取消注释,定制化模块的日志级别和输出。
    -->

    <!-- 配置指定模块的异步日志 -->
    <!--
    <AsyncLogger name="com.sunxiansheng" level="DEBUG" additivity="false" includeLocation="false">
        <AppenderRef ref="Console"/>
    </AsyncLogger>
    -->
    <!--
        name="com.sunxiansheng":指定包名或类名,针对该模块进行配置。
        level="DEBUG":设置日志级别为 DEBUG,记录 DEBUG 及以上级别的日志。
        additivity="false":不向父 Logger 传递,防止日志重复输出。
        includeLocation="false":不包含代码位置信息,提高性能。
        <AppenderRef ref="Console"/>:将日志输出到 Console Appender。
    -->

    <!-- 配置其他特定模块的日志 -->
    <!--
    <Logger name="com.moduleA" level="INFO" additivity="false">
        <AppenderRef ref="Console"/>
    </Logger>
    -->
    <!--
        针对 com.moduleA 包,设置日志级别为 INFO,日志只输出到 Console,不向上级传播。
    -->

    <!-- 根日志记录器,处理未被其他 Logger 捕获的日志 -->
    <Root level="DEBUG">
        <!-- 引用之前定义的所有 Appender -->
        <AppenderRef ref="Console"/>
        <AppenderRef ref="InfoFile"/>
        <AppenderRef ref="WarnFile"/>
        <AppenderRef ref="ErrorFile"/>
        <AppenderRef ref="AllFile"/>
        <!-- 实时写入logstash -->
        <AppenderRef ref="RealTimeSocketAppender"/>
    </Root>
    <!--
        level="DEBUG":设置根日志级别为 DEBUG,记录 DEBUG 及以上级别的日志。
        所有未被特定 Logger 处理的日志,都会按照根日志器的配置输出。
    -->
</Loggers>
</Configuration>
2.核心
2.创建common-elk-starter-demo
1.目录结构
2.pom.xml
xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.sunxiansheng</groupId>
        <artifactId>sunrays-demo</artifactId>
        <version>1.0.5</version>
    </parent>

    <artifactId>common-elk-starter-demo</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.sunxiansheng</groupId>
            <artifactId>combinations-elk-starter</artifactId>
            <version>1.0.5</version>
        </dependency>
        <!-- spring-boot-starter-web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- 排除掉logging -->
            <exclusions>
                <exclusion>
                    <artifactId>spring-boot-starter-logging</artifactId>
                    <groupId>org.springframework.boot</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

</project>
3.ElkApplication.java
java 复制代码
package com.sunxiansheng.elk;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * Description: ELK日志收集系统
 *
 * @Author sun
 * @Create 2024/12/28 13:59
 * @Version 1.0
 */
@SpringBootApplication
public class ElkApplication {

    public static void main(String[] args) {
        SpringApplication.run(ElkApplication.class, args);
    }
}
4.查看是否由父模块管理
3.配置logstash接收日志输入
1.开放9601端口
1.服务器开放
sh 复制代码
systemctl start firewalld && firewall-cmd --permanent --add-port=9601/tcp && firewall-cmd --reload && firewall-cmd --query-port=9601/tcp
2.安全组开放
2.编辑配置文件
1.编辑
sh 复制代码
vim /usr/local/logstash/logstash-7.9.3/config/logstash.conf
2.配置
conf 复制代码
input {
  tcp {
    port => 9601
  }
}

filter {
  dissect {
    mapping => {
      "message" => "%{timestamp}|#|%{thread}|#|%{level}|#|%{pftid}|#|%{module}|#|%{logger}|#|%{log_message}|#|%{throwable}"
    }
  }
  # 使用 date 过滤器解析 timestamp 字段,并指定时区
  date {
    match => ["timestamp", "yyyy-MM-dd HH:mm:ss.SSS"]
    timezone => "Asia/Shanghai"  # 填写日志的时区,一般就是东八区,将其转化为零时区放到@timestamp中
    target => "@timestamp"
  }
  mutate {
    remove_field => ["timestamp", "port", "message", "@version"]  # 移除不需要的字段
  }
}

output {
  stdout {
    codec => rubydebug
  }
}
3.指定配置文件启动测试
1.启动
sh 复制代码
cd /usr/local/logstash/logstash-7.9.3/bin && ./logstash -f /usr/local/logstash/logstash-7.9.3/config/logstash.conf
2.启动 common-elk-starter-demo
3.查看logstash,实时更新日志

2.日志输出到es并实现可视化操作

1.配置logstash将日志输出到es
1.编辑配置文件
sh 复制代码
vim /usr/local/logstash/logstash-7.9.3/config/logstash.conf
2.修改output
sh 复制代码
output {
  # 输出到 Elasticsearch
  elasticsearch {
    hosts => ["http://guest:9200"]  # 替换为 Elasticsearch 地址
    index => "java-logs-%{+YYYY.MM.dd}"  # 按日期创建索引
    # user => "your_username"  # 如果启用了身份验证,填写用户名
    # password => "your_password"  # 填写密码
  }

  # 方便调试,控制台输出
  stdout {
    codec => rubydebug
  }
}
3.启动测试
sh 复制代码
cd /usr/local/logstash/logstash-7.9.3/bin && ./logstash -f /usr/local/logstash/logstash-7.9.3/config/logstash.conf
4.控制台输出正常
5.后台启动并指定日志输出目录
1.启动
sh 复制代码
nohup /usr/local/logstash/logstash-7.9.3/bin/logstash -f /usr/local/logstash/logstash-7.9.3/config/logstash.conf > /usr/local/logstash/logstash-7.9.3/logs/logstash.log 2>&1 &
2.查看日志
sh 复制代码
tail -f /usr/local/logstash/logstash-7.9.3/logs/logstash.log
2.使用Kibana进行查看
1.访问

http://guest:5601

2.点击Discover
3.创建索引模式
4.模式为java-logs*
5.配置时间戳
6.再次点击 Discover即可查看日志
7.还可以根据通配符检索
相关推荐
黑客-雨9 分钟前
从零开始:如何用Python训练一个AI模型(超详细教程)非常详细收藏我这一篇就够了!
开发语言·人工智能·python·大模型·ai产品经理·大模型学习·大模型入门
Pandaconda14 分钟前
【Golang 面试题】每日 3 题(三十九)
开发语言·经验分享·笔记·后端·面试·golang·go
是梦终空16 分钟前
JAVA毕业设计210—基于Java+Springboot+vue3的中国历史文化街区管理系统(源代码+数据库)
java·spring boot·vue·毕业设计·课程设计·历史文化街区管理·景区管理
加油,旭杏18 分钟前
【go语言】变量和常量
服务器·开发语言·golang
行路见知18 分钟前
3.3 Go 返回值详解
开发语言·golang
xcLeigh22 分钟前
WPF实战案例 | C# WPF实现大学选课系统
开发语言·c#·wpf
NoneCoder32 分钟前
JavaScript系列(38)-- WebRTC技术详解
开发语言·javascript·webrtc
基哥的奋斗历程41 分钟前
学到一些小知识关于Maven 与 logback 与 jpa 日志
java·数据库·maven
m0_5127446441 分钟前
springboot使用logback自定义日志
java·spring boot·logback
关关钧43 分钟前
【R语言】数学运算
开发语言·r语言