项目集成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.还可以根据通配符检索
相关推荐
0白露30 分钟前
Apifox Helper 与 Swagger3 区别
开发语言
Tanecious.1 小时前
机器视觉--python基础语法
开发语言·python
叠叠乐2 小时前
rust Send Sync 以及对象安全和对象不安全
开发语言·安全·rust
战族狼魂2 小时前
CSGO 皮肤交易平台后端 (Spring Boot) 代码结构与示例
java·spring boot·后端
Tttian6223 小时前
Python办公自动化(3)对Excel的操作
开发语言·python·excel
xyliiiiiL3 小时前
ZGC初步了解
java·jvm·算法
杉之3 小时前
常见前端GET请求以及对应的Spring后端接收接口写法
java·前端·后端·spring·vue
hycccccch4 小时前
Canal+RabbitMQ实现MySQL数据增量同步
java·数据库·后端·rabbitmq
独好紫罗兰4 小时前
洛谷题单2-P5713 【深基3.例5】洛谷团队系统-python-流程图重构
开发语言·python·算法
天天向上杰5 小时前
面基JavaEE银行金融业务逻辑层处理金融数据类型BigDecimal
java·bigdecimal