elk日志系统搭建

下载elasticsearch,logstash,kibana三个软件,我用的windows版本演示
下载地址,推荐使用华为镜像库,下载速度快:
华为开源软件下载

注意点: 最好这三者的版本一致,防止版本不同的差异

1.下载完成后
启动elasticsearch,可以不用配置ik分词
elk日志系统搭建_第1张图片
启动完成后,访问http://localhost:9200,启动成功
elk日志系统搭建_第2张图片

2.配置/启动kibana

elk日志系统搭建_第3张图片

进入kibana的config目录,修改kibana.yml配置文件,
设置如下配置:
elk日志系统搭建_第4张图片


server.port: 5601
elasticsearch.hosts: ["http://localhost:9200"]    #修改成自己集群的端口号
kibana.index: ".kibana"
i18n.locale: "en" #设置为英文

启动kibana,
elk日志系统搭建_第5张图片

启动后,访问:http://localhost:5601
elk日志系统搭建_第6张图片
3.先分析下需要监听的日志文件

我需要监听的日志,是spring boot项目中使用logback配置的日志模板:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 -->
    <property name="LOG_HOME" value="./logs"/>
    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
         <layout class="ch.qos.logback.classic.PatternLayout">
	    <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}|%-5level|%thread|%logger:%line|%mdc{client} %.-2048msg%n</pattern>
	 </layout>
    </appender>
    <appender name="infoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
	 <encoder>
            <!--日志内容格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <!--<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%-5level] %logger{50} - %msg%n</pattern>-->
            <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}|%-5level|%thread|%logger:%line|%mdc{client} %.-2048msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>${LOG_HOME}/%d-%i.log</fileNamePattern>
	    <!-- 配置日志文件不能超过2M,若超过2M,日志文件会以索引0开始,命名日志文件,例如info.2018-12-21-0.log -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>500MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <root level="info">
        <appender-ref ref="consoleLog" />
        <appender-ref ref="infoLog" />
    </root>
</configuration>

生成的日志格式如下:

2020-06-04 17:11:04.774|INFO |main|org.springframework.data.repository.config.RepositoryConfigurationDelegate:126| Bootstrapping Spring Data repositories in DEFAULT mode.

日志是以|为分割下的,分为5个部分,

下面配置logstash的grok正则解析日志: 推荐在线调试正则的网站: grok debugger

网站地址: grok debugger

elk日志系统搭建_第7张图片

这里的正则全部是使用自定义的正则,没有使用官方的模板,符合标准正则:

文档信息: 文档连接

注意在正则中单纯匹配|需要转义: |

关于grok解析日志的正则写法(规范):

 (?<field_name>the pattern here)

调试好的正则如下:

(?<request_time>[0-9\-]+\s[0-9\:]+(.)[0-9]{3})\|(?<info_level>[A-Z|]{4}.)\|(?<thread_id>(.)+?)\|(?<log_line>(.)+?)\|(?<message>(.)+)

匹配实例数据:

2020-06-04 17:11:05.046|INFO |main|org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:330| Bean 'threadConfig' of type [com.hfepay.ai.store.changan.config.ThreadConfig$$EnhancerBySpringCGLIB$$1041ddd7] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)|

调试结果:
elk日志系统搭建_第8张图片
好了,正则已经处理Ok,下面配置logstash:

进入logstahs的bin目录,新建logstash.config文件:

elk日志系统搭建_第9张图片
编写配置文件:

input {
    file {
        path => 'E:/worksoft/2020-06-04-0.log'
        type => "blog_log"
        start_position => "beginning"
    }
}

filter {
       grok {
			match => {
				"message" => "(?[0-9\-]+\s[0-9\:]+(.)[0-9]{3})\|(?[A-Z|]{4}.)\|(?(.)+?)\|(?(.)+?)\|(?(.)+)"
			}
       }
     }
output{
   stdout {
            codec => rubydebug
          }
   elasticsearch{
       hosts => ["127.0.0.1:9200"]
       index => "logstash-test1-%{+YYYY.MM.dd}"
     }
}

指定了es路径,需要监听的日志文件,以及解析的正则表达式:

下面启动logstash: 使用cmd命令,指定config方式启动:

>logstash -f logstash.conf

elk日志系统搭建_第10张图片
启动将文件的日志写入了es

访问kibana:

elk日志系统搭建_第11张图片
可以看到索引以及创建:
下面创建index pattern
elk日志系统搭建_第12张图片

elk日志系统搭建_第13张图片
搜索出创建的索引点击下一步,就能创建了,创建完成之后,查看:

elk日志系统搭建_第14张图片
可以看到数据都在es中,并且按照我们的正则进行了切分,通过修改监听的日志,数据es数据也得到了了更新

如果要监听一个目录下的日志文件: 如 \logs目录下的所有日志文件,可以使用通配符:
\logs*.log来实现监听

你可能感兴趣的:(Java,java)