万事开头难,花了2天的时间一直在忙这个,总算有点头绪,废话不多说,直接开整!
一基础知识
ELK一般由三部分组成:logstash(日志格式化) + elasticsearch(检索) + Kibana(前台报表展示)
这里因为自己也是在摸索阶段,就直接在自己的windows系统上操作(流下了没有服务器的泪水)
下载logstash,elasticsearch,Kibana,filebeat安装包(为啥要装这个一会说)
下载完了自己解压到一个文件夹里
启动顺序ES-KIBANA-LOGSTASH-FILEBEAT(可以有可以没)
二window下的启动方法
记住默认端口9300,也可以直接访问localhost:9300得到json字符串证明启动成功!
2Kibana启动也一样,直接访问http://localhost:5601可以进入控制台
3启动LOGSTASH,注意,需要配置默认的conf(在bin的目录下建立conf文件,如下图)
在bin目录下进入cmd模式输入logstash -f logstash_default.conf,通过logstash.bat文件启动(也可配置全局环境变量方式启动,这里只在bin目录下),窗口如下(这里我是启动了另外一个conf)
三对接springboot,可以有2种方式(直接使用logstask作为日志收集加处理方式(可能内存原因直接崩了,所以没试成功)),还有另外一种,采用filebeat读取文件的方式,将它直接传给ES服务(这里处理不好只能做为初学者使用),实际项目还是推荐采用filebeat+logstask+es+k的模式(官网推荐,filebeat读取文件占用内存比直接logstask获取小,适合每个单个系统部署)
4实战操作
找一个maven项目,添加
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>版本号</version>
</dependency>
在resours里添加logback-spring.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 唯一要配置应用的名称 -->
<property name="APP_NAME" value="demo-service"/>
<property name="LOG_PATH" value="logs"/>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger [%file:%line] - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${APP_NAME}/out_${APP_NAME}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名 -->
<FileNamePattern>${LOG_PATH}/${APP_NAME}/%d{yyyy-MM-dd HH}.%i.log
</FileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>5MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留小时数720=30天*24 -->
<MaxHistory>720</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger [%file:%line] - %msg%n</pattern>
</encoder>
</appender>
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名 -->
<FileNamePattern>${LOG_PATH}/${APP_NAME}/error/%d{yyyy-MM-dd HH}.%i.log
</FileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>5MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留小时数720=30天*24 -->
<MaxHistory>720</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger [%file:%line] - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 -->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>localhost:9250</destination>
<queueSize>1048576</queueSize>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
</appender>
<logger name="com" level="ERROR" additivity="false">
<appender-ref ref="ERROR_FILE"/>
</logger>
<logger name="comn" level="INFO" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</logger>
<logger name="com" level="INFO" additivity="false">
<appender-ref ref="LOGSTASH"/>
</logger>
<!-- 日志输出级别 会打印根路径下所有的日志 -->
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>
<!-- 开启JMXConfigurator(Spring Boot Admin 在线修改各包的日志级别) -->
<jmxConfigurator/>
</configuration>
标黑就是配置,然后修改logstask的conf文件
input {
beats {
port => 9250
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
#user => "elastic"
#password => "changeme"
}
}
启动logstask
一会后,出现错误IO的socket通讯流错误(中文乱码不好分析啊)
幸亏还有logstask自带的日志,打开
会不会端口号配置错误呢,改成8020试试,结果还是读不出来(后来才知道:logback支持将日志数据通过提供IP地址、端口号,以Socket的方式远程发送),然后继续查看
官网发现filebeat(专门读取file文件的服务)
filebeat需要修改filebeat.yml文件,怕改错了另外修改文件试试,添加如下配置(其实自带的里面有,只需要改下file的目录)
可以添加多个,这里我只做一个测试用,其他不变
bin目录下启动fileBeat,然后观察Kibana(这里对logstask未对日志做任何处理,可关闭)
日志监控成功!
继续修改,将logstask加入其中
将filebeat输出端口(yml文件)改下
output.logstash:
# The Logstash hosts
hosts: ["localhost:5044"]
将logstask的input监听端口改成5044(conf文件中的input)
也是能找到日志文件更新的内容的
跌跌撞撞的终于弄了个雏形,后续继续完善!