ELK搭建日志联合分析系统
2016-06-21 22:03
459 查看
上一篇ELK安装简单说了下安装ELK,这一篇就来具体说下怎么让者三个联动起来。
其工作流程如下图所示,(从Kibana官网拿的流程图)
简单来讲,其具体流程是logstash agent 监控并过滤日志,将过滤后的日志内容发给redis(这里的redis只处理队列不做存储),logstash index将日志收集在一起交给elasticSearch,并通过Kibana进行展示。
在实际中,还可以加上logback实现自定义的日志。
其具体流程如下
(网上找的一个图,链接找不到了……sorry)
大概就是这个意思,不过是在最左边又加了一个logback。
在这里不需要其它更改。
logback是一个开源包,使用Maven可以自动部署。
不得不说Maven是个好东西,顺便贴一个地址,用来寻找包的Maven依赖http://mvnrepository.com/。
当前最新版是1.1.7,使用logback-classic会自动添加其它logback-core、slf4j等依赖。
(2)配置
在所在项目的resources文件夹下新建logback.xml,logback会自动寻找配置文件。
一个配置如下:
这里使用了一个开源项目logback-redis-appender,其用途是生成logback到redis的appender,首先需要加入Maven依赖:
其项目地址在这里,可以查找最新的版本号。
一个检验程序如下:
运行了之后,由于在com.task包里,会调用两个appender,一个送到redis服务器,一个输出到滚动文件。可以分别看看结果。
看下logstash安装在哪儿:
whereis logstash
默认是安装在
vi config-fire-name.conf
增加以下内容,需要注意的是,这里的配置需要和logback.xml里关于redis的配置相同,也就是说logback输出到redis后,logstash获取并作为输入。
这里的output还加了一个标准输出
进入logstash目录,启动服务
启动服务后,通过浏览器访问Kibana:http://server-address:5601/,默认端口为5601;
在Setting里设置index pattern,根据logstash的配置,传输过来的索引名为logstash-test,填在Index name or pattern里,creat就行。
然后在Discover里就可以看到已索引的数据。
Ok,现在可以再次运行一下上面的测试程序,生成log并传输到elasticsearch,可以在Kibana里看到了。
其工作流程如下图所示,(从Kibana官网拿的流程图)
简单来讲,其具体流程是logstash agent 监控并过滤日志,将过滤后的日志内容发给redis(这里的redis只处理队列不做存储),logstash index将日志收集在一起交给elasticSearch,并通过Kibana进行展示。
在实际中,还可以加上logback实现自定义的日志。
其具体流程如下
(网上找的一个图,链接找不到了……sorry)
大概就是这个意思,不过是在最左边又加了一个logback。
安装和部署
Redis
Redis的安装和配置之前写过,链接在:Centos 7服务器搭建(三)—安装Redis在这里不需要其它更改。
Logback
(1)安装logback是一个开源包,使用Maven可以自动部署。
不得不说Maven是个好东西,顺便贴一个地址,用来寻找包的Maven依赖http://mvnrepository.com/。
当前最新版是1.1.7,使用logback-classic会自动添加其它logback-core、slf4j等依赖。
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.1.7</version> </dependency>
(2)配置
在所在项目的resources文件夹下新建logback.xml,logback会自动寻找配置文件。
一个配置如下:
<?xml version="1.0" encoding="UTF-8"?> <!-- scan 是否定期扫描xml文件, scanPeriod是说扫描周期是30秒--> <configuration scan="true" scanPeriod="30 seconds" debug="false" packagingData="true"> <!-- 项目名称 --> <contextName>myApp1 contextName</contextName> <!-- 属性 --> <property name="USER_HOME" value="C://log-path"/> <!-- Insert the current time formatted as "yyyyMMdd'T'HHmmss" under the key "bySecond" into the logger context. This value will be available to all subsequent configuration elements. --> <timestamp key="bySecond" datePattern="yyyyMMdd" timeReference="contextBirth"/> <!-- appender很重要,一个配置文件会有多个appender --> <!-- ConsoleApperder意思是从console中打印出来 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!-- 过滤器,一个appender可以有多个 --> <!-- 阈值过滤,就是log行为级别过滤,debug及debug以上的信息会被打印出来 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>debug</level> </filter> <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default --> <!-- encoder编码规则 --> <encoder> <!--<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>--> <!--<pattern>%d %contextName %msg%n</pattern>--> <!-- pattern模式 %d时间 %thread 线程名 %level行为级别 %logger logger名称 %method 方法名称 %message 调用方法的入参消息 --> <pattern>%-4d [%thread] %highlight%-5level %cyan%logger.%-10method - %message%n</pattern> </encoder> </appender> <!-- FileAppender 输出到文件 --> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <!-- 文件存放位置 %{xxx} 就是之前定义的属性xxx --> <file>${USER_HOME}/myApp1log-${bySecond}.log</file> <encoder> <!-- %date和%d是一个意思 %file是所在文件 %line是所在行 --> <pattern>%date{yyyy-MM-dd HH:mm} %level [%thread] %logger{30} [%file:%line] %msg%n</pattern> </encoder> </appender> <!-- 滚动日志文件,这个比较常用 --> <appender name="ROLLINGFILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 当project等于true的时候file就不会起效果--> <prudent>true</prudent> <!--<file>${USER_HOME}/logFile.log</file>--> <!-- 按天新建log日志 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- daily rollover --> <fileNamePattern>${USER_HOME}/logFile.%d{yyyy-MM-dd}_%i.log</fileNamePattern> <!-- 保留30天的历史日志 --> <maxHistory>30</maxHistory> <!-- 基于大小和时间,这个可以有,可以没有 --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <!-- or whenever the file size reaches 100MB --> <!-- 当一个日志大小大于10KB,则换一个新的日志。日志名的%i从0开始,自动递增 --> <maxFileSize>10KB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <!-- %ex就是指抛出的异常,full是显示全部,如果在{}中写入数字,则表示展示多少行 --> <pattern>%-4date [%thread] %-5level %logger{35} - %msg%n%ex{full, DISPLAY_EX_EVAL}</pattern> </encoder> </appender> <appender name="redis" class="com.cwbase.logback.RedisAppender"> <source>redis</source> <host>redis服务器的ip地址(端口号一般默认,如果修改过则需要增加<port>属性)</host> <password>可选项,如果redis设置了密码访问的话</password> <key>redis的key</key> <!-- 这个Key是Redis List的Key,需要和Logstash读取Redis的Key匹配 --> <database>5</database> <!-- 具体选择哪个数据库,默认为0 --> <callerStackIndex>0</callerStackIndex> </appender> <!-- 重点来了,上边都是appender输出源。这里开始就是looger了 --> <!-- name意思是这个logger管的哪一片,像下面这个管的就是com.task包下的所有文件 level是只展示什么行为信息级别以上的,类似阈值过滤器 additivity表示是否再抛出事件,就是说如果有一个logger的name是log,如果这个属性是true,另一个logger就会在这个logger处理完后接着继续处理 --> <logger name="com.task" level="INFO" additivity="false"> <!-- 连接输出源,也就是上边那几个输出源 ,你可以随便选几个appender--> <appender-ref ref="redis"/> <appender-ref ref="ROLLINGFILE"/> </logger> <!-- 这个logger详细到了类 --> <logger name="log.test.Foo" level="debug" additivity="false"> <appender-ref ref="STDOUT"/> <appender-ref ref="ROLLINGFILE"/> </logger> <!-- Strictly speaking, the level attribute is not necessary since --> <!-- the level of the root level is set to DEBUG by default. --> <!-- 这就是上边logger没有管到的情况下 root默认接管所有logger --> <root level="debug"> <appender-ref ref="STDOUT"/> </root> </configuration>
这里使用了一个开源项目logback-redis-appender,其用途是生成logback到redis的appender,首先需要加入Maven依赖:
<dependency> <groupId>com.cwbase</groupId> <artifactId>logback-redis-appender</artifactId> <version>*.*.*(版本号)</version> </dependency>
其项目地址在这里,可以查找最新的版本号。
一个检验程序如下:
package com.task; public class MyLog { public static void main(String[] args) { Logger logger = (Logger) LoggerFactory.getLogger(MyLog.class.getName()); logger.info("Tome"); } }
运行了之后,由于在com.task包里,会调用两个appender,一个送到redis服务器,一个输出到滚动文件。可以分别看看结果。
<appender-ref ref="redis"/> <appender-ref ref="ROLLINGFILE"/>
Logstash
现在假设ELK都已经安装成功,具体在这里:看下logstash安装在哪儿:
whereis logstash
默认是安装在
/opt/logstash下,配置文件在
/etc/logstash/conf.d下。不过该目录是空的,需要自己新建配置文件
vi config-fire-name.conf
增加以下内容,需要注意的是,这里的配置需要和logback.xml里关于redis的配置相同,也就是说logback输出到redis后,logstash获取并作为输入。
input { redis{ host => "redis服务器的地址" key => "***" #与上面logback.xml里设置的redis的key相同 type => "redis-input" data_type => "list" db => 5 #具体的数据库编号,等同于logback里的database password => "redis的密码" } } output { stdout{codec=>rubydebug} elasticsearch{ hosts=>["*.*.*.*:9200"] index=>"logstash-test" codec => "json" } }
这里的output还加了一个标准输出
stdout{codec=>rubydebug},可以删除,不影响elasticsearch。
进入logstash目录,启动服务
./logstash -f /etc/logstash/conf.d/*****.conf
Elasticsearch和Kibana
这两个基本都不用再配置,按照上一篇就行。启动服务后,通过浏览器访问Kibana:http://server-address:5601/,默认端口为5601;
在Setting里设置index pattern,根据logstash的配置,传输过来的索引名为logstash-test,填在Index name or pattern里,creat就行。
然后在Discover里就可以看到已索引的数据。
Ok,现在可以再次运行一下上面的测试程序,生成log并传输到elasticsearch,可以在Kibana里看到了。
相关文章推荐
- redis安装问题小结
- 使用 Redis 和 Python 构建一个共享单车的应用程序
- Redis偶发连接失败案例实战记录
- Redis中实现查找某个值的范围
- win 7 安装redis服务【笔记】
- redis的hGetAll函数的性能问题(记Redis那坑人的HGETALL)
- Redis和Memcached的区别详解
- 分割超大Redis数据库例子
- Redis总结笔记(一):安装和常用命令
- Redis sort 排序命令详解
- 用Redis实现微博关注关系
- Redis实现信息已读未读状态提示
- redis中修改配置文件中的端口号 密码方法
- 在Ruby on Rails上使用Redis Store的方法
- Redis和Memcache的区别总结
- 在Node.js应用中使用Redis的方法简介
- Redis服务器的启动过程分析
- web 应用中常用的各种 cache详解
- 利用yum安装Redis的方法详解
- 从MySQL到Redis的简单数据库迁移方法