ELK 日志归集
2016-08-23 21:43
387 查看
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:
修改log4j2.xml 配置使用 JSONLayout 将日志转换成json的格式进行输出。 (单行输出,即异常也输出到一行)
安装filebeat监听log文件,将文件通过日志通过tcp输出至logstash
logstash 在汇集log后, 通过logenv 字段来区分不同的环境将json格式的日志push到ES中不同的index中
INT系统部署图
软件的安装
软件统一采用yum的安装方式,各个repo文件请查考
logstash.repo
name=Logstash repository for 2.3.x packagesbaseurl=https://packages.elastic.co/logstash/2.3/centosgpgcheck=1gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearchenabled=1
elasticsearch.repo
[elasticsearch-2.x]name=Elasticsearch repository for 2.x packagesbaseurl=https://packages.elastic.co/elasticsearch/2.x/centosgpgcheck=1gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearchenabled=1
kibana.repo
[kibana-4.5]name=Kibana repository for 4.5.x packagesbaseurl=http://packages.elastic.co/kibana/4.5/centosgpgcheck=1gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearchenabled=1
filebeat.repo
[beats]name=Elastic Beats Repositorybaseurl=https://packages.elastic.co/beats/yum/el/$basearchenabled=1gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearchgpgcheck=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=devmicro-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分钟内的日志,通过右上角可以快速通过时间过滤日志相关文章推荐
- 计算机视觉、模式识别、机器学习相关方向资源
- Java基础之(三十六)Java异常处理<二>
- Node.Js 全局对象与全局属性(一)
- 后台执行Jquery代码
- 项目中cache应用实践
- [HDU 5795] A Simple Nim【博弈论&组合游戏】
- LeetCode进阶之路(Length of Last Word)
- android界面回传值
- 家教信息服务平台的开发
- TCP拥塞控制的实现
- Ubuntu16.04下Python2.7.12从头开始配置TensorFlow
- 【Light-oj】-1138 - Trailing Zeroes (III)(二分,数学)
- iOS swift-emoji表情的显示
- 简单购物车的实现
- Android中如何判断密码不能为纯数字或纯字母
- UVA 11059 枚举
- Pedis: NoSQL data store using the SEASTAR framework, compatible with Redis
- C#与C/C++的交互zz
- 【windows程序设计入门教程之一】开发环境的搭建&helloword程序
- 随机问题之--洗牌算法