ELK 日志归集

ELK 配置及设计


软件及版本

CentOS 7 ​
Oracle JDK 8 
Kibana 4.5.2 
Elaticsearch 2.3.4 
logstash 2.3.4 
filebeat 1.2.3 

查看version command: filebeat --version

logstash + ES + Kibana 安装至同一台虚拟机。 IP 地址:192.168.1.50

​需要解决问题

​汇集所有的微服务产生的日志,并根据不同的环境将日志添加进不同的索引。

遗留需要解决的问题:

​micro-service - > logstash 的安全控制(可以尝试采用SSL); logstash -> ES 的安全控制 (安装在同一台机器上,安全问题好解决); kibana 访问权限的控制(尚待研究​)

目前需要为ofbiz的每一个环境单独安装filebeat,未来是否可以统一使用类似spring boot 服务的做法?

​现有微服务日志分析

现有的微服务分两种, 一种是ofbiz框架的webapp, 一种是spring boot的web app。 spring boot 默认采用logback 打印日志。 ofbiz可配置采用log4j 输出日志

系统架构图


架构说明:

针对spring boot的webapp,采用logstash-logback-encoder (参考:https://github.com/logstash/logstash-logback-encoder)直接将日志通过LogstashTcpSocketAppender​ 发送至logstash。无需任何java代码的修改。 

针对ofbiz的webapp:

  1. 修改log4j2.xml 配置使用 JSONLayout 将日志转换成json的格式进行输出。 (单行输出,即异常也输出到一行)
  2. 安装filebeat监听log文件,将文件通过日志通过tcp输出至logstash

logstash 在汇集log后, 通过logenv 字段来区分不同的环境将json格式的日志push到ES中不同的index中

INT系统部署图



软件的安装

软件统一采用yum的安装方式,各个repo文件请查考

logstash.repo

 
 
name=Logstash repository for 2.3.x packages
baseurl=https://packages.elastic.co/logstash/2.3/centos
gpgcheck=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1

elasticsearch.repo

 
 
[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=https://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1

kibana.repo

 
 
[kibana-4.5]
name=Kibana repository for 4.5.x packages
baseurl=http://packages.elastic.co/kibana/4.5/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1

filebeat.repo

 
 
[beats]
name=Elastic Beats Repository
baseurl=https://packages.elastic.co/beats/yum/el/$basearch
enabled=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
gpgcheck=1

安装命令: ​

sudo yum install logstash​

随系统自动启动:

sudo chkconfig --add logstash​

启动关闭命令: ​

sudo service logstash start/stop/restart

Spring Boot 架构的微服务的日志配置及说明

spring boot的日志需要引入logstash的支持

maven中引入第三方依赖

logback-spring.xml 中表达式依赖janino​

 
 
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>2.7.8</version>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.7</version>
</dependency>

logback-spring.xml 的配置

这里名称必须是logback-spring.xml 为了可以读取到spring的 配置, 同时保证loback-spring.xml的通用性

Include support for a new <springProperty> element which can be used in
`logback-spring.xml` files to add properties from the Spring
Environment.​  来至网页:https://github.com/spring-projects/spring-boot/commit/055ace37f006120b0006956b03c7f358d5f3729f
 
 
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<springProperty name="destination" source="logstash.destination"/>
<springProperty name="logstashEnabled" source="logstash.enable"/>
<springProperty name="appName" source="micro-service.id"/>
<springProperty name="env" source="spring.profiles.active"/>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<if condition='property("logstashEnabled").equalsIgnoreCase("true")'>
<then>
<appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>${destination}</destination>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<customFields>{"logenv":"${env}","appname":"${appName}"}</customFields>
</encoder>
</appender>
</then>
</if>
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<file>${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>${LOG_FILE}.%i</fileNamePattern>
</rollingPolicy>
<triggeringPolicy
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
<if condition='property("logstashEnabled").equalsIgnoreCase("true")'>
<then>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<customFields>{"logenv":"${env}","appname":"${appName}"}</customFields>
</encoder>
</then>
</if>
</appender>
<root level="INFO">
<if condition='property("env").equalsIgnoreCase("dev")'>
<then>
<appender-ref ref="CONSOLE" />
</then>
</if>
<appender-ref ref="FILE" />
<if condition='property("logstashEnabled").equalsIgnoreCase("true")'>
<then>
<appender-ref ref="stash" />
</then>
</if>
</root>
</configuration>
增加了两个custom的字段,配置字段的值均来自spring的配置,保证logback-spring.xml 在各个spring boot的微服务的通用性
appname: 用来区分微服务, 比如: sourcing,sample
logenv: 用来区分不同的环境,比如: int, preprd

​application.properties 针对logstash的配置​

spring.profiles.active=dev
micro-service.id=apigateway
logstash.enable = true
logstash.destination=192.168.1.50:4560​

Ofbiz 架构的微服务的日志配置及说明​

log4j2.xml 配置 使用json layout
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="60">
    <!--
      Default configuration for logging; for customizations refer to http://logging.apache.org/log4j/2.x/manual/configuration.html.
      With this configuration the following behavior is defined:
       * all log messages of severity "warning" or greater, generated by external jars, are logged in the ofbiz.log file and in the console
       * all log messages of any severity, generated by OFBiz, are logged in the ofbiz.log file and in the console
       * all log messages of severity "error" or greater are also logged in the error.log file
      When the ofbiz.log file reaches 1MB in size a new file is created and a date/sequence suffix is added; up to 10 files are kept.
      When the error.log file reaches 1MB in size a new file is created and a date/sequence suffix is added; up to 3 files are kept.
      The settings in this configuration file can be changed without restarting the instance: every 60 seconds the file is checked for modifications.
    -->
    <Appenders>
        <Console name="stdout" target="SYSTEM_OUT">
            <PatternLayout pattern="%date{DEFAULT} |%-20.20thread |%-30.30logger{1}|%level{length=1}| %message%n"/>
        </Console>
        <RollingFile name="ofbiz" fileName="runtime/logs/ofbiz.log"
                     filePattern="runtime/logs/ofbiz-%d{yyyy-MM-dd}-%i.log">
           <!--  <PatternLayout pattern="%date{DEFAULT} |%-20.20thread |%-30.30logger{1}|%level{length=1}| %message%n"/> -->
           <JSONLayout complete="true" compact="true" eventEol="true"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="10 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>
        <RollingFile name="error" fileName="runtime/logs/error.log"
                     filePattern="runtime/logs/error-%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%date{DEFAULT} |%-20.20thread |%-30.30logger{1}|%level{length=1}| %message%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="10 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="3"/>
        </RollingFile>
        <Async name="async">
            <AppenderRef ref="ofbiz"/>
            <AppenderRef ref="stdout"/>
            <AppenderRef ref="error"/>
        </Async>
    </Appenders>
    <Loggers>
        <logger name="org.ofbiz.base.converter.Converters" level="warn"/>
        <logger name="com.okchem.b2b.datasync.jms" level="warn"/>
        <logger name="org.apache" level="warn"/>
        <logger name="freemarker" level="warn"/>

        <Root level="all">
            <AppenderRef ref="async"/>
        </Root>
    </Loggers>
</Configuration>

Ofbiz 架构的微服务的filebeat 的配置

​filebeat 可以将配置直接输出到ES, 也可以输出到logstash进行进一步的解析处理。 这里输出到logstash,logstash统一进行处理分发


################### Filebeat Configuration Example #########################

############################# Filebeat ######################################
filebeat:
  # List of prospectors to fetch data.
  prospectors:
    .......................
      paths:
        - /home/okchem/storage92g/ofbiz/runtime/logs/ofbiz.log
      fields:
        appname: ofibz
        logenv: int​

        ...................
output:
  ### Logstash as output
  logstash:
    # The Logstash hosts
    hosts: ["192.168.1.50:5044"]

Logstash的配置


logstash是有各个插件来组合完成解析及输出到ES的功能的, 这里并没有采用常用的gork插件。(据说效率不高,另外配置比较麻烦)

logstash的配置文件logstash.conf

input {
    tcp {
        port => 4560
        codec => json_lines
    }
    beats {
      port => 5044
      codec => "json"
    }
}
output {
  elasticsearch {
hosts => "localhost:9200"
index => "%{logenv}-logstash-%{+YYYY.MM.dd}"
  }
  stdout{
   codec => rubydebug
  }
}

input 配置tcp插件 端口4560去接收 spring boot的微服务输出的日志;beats插件 配置5044 端口接收来自filebeat的日志,并解析字符串为json。 

使用elasticsearch插件将日志推送至索引。 这里 logenv 是从前面配置的日志中custom field中获取,然后将同一环境的log 推送到同一个索引。 索引使用了logstash-%{+YYYY.MM.dd} 通配符,在ES会每天建一个索引。 (新版ES 推荐做法)。 如果去/var/lib/elasticsearch/elasticsearch/nodes/0/indices/ 可以查看到目录下:

​dev-logstash-2016.08.03  dev-logstash-2016.08.08     envdev-logstash-2016.08.04  envdev-logstash-2016.08.07     logstash-2016.07.26  logstash-2016.07.29  logstash-2016.08.01
dev-logstash-2016.08.04  envdev-logstash-2016.08.02  envdev-logstash-2016.08.05  envdev-logstash-2016.08.08     logstash-2016.07.27  logstash-2016.07.30  logstash-2016.08.02
dev-logstash-2016.08.05  envdev-logstash-2016.08.03  envdev-logstash-2016.08.06  %{logenv}-logstash-2016.08.02  logstash-2016.07.28  logstash-2016.07.31

ES 和 Kibana的配置

​使用默认配置即可

​通过Kibana访问日志

打开连接http://192.168.1.50:5601/,点击discover 菜单,选择int-logstash-*(通配符可以保证浏览所有的int 环境的日志)。 默认只会显示当年15分钟内的日志,通过右上角可以快速通过时间过滤日志

kibana.PNG



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值