背景:
我们在服务部署很多的应用,但是有时候服务器会报错或者启动失败等等,我们就需要去服务器看日志,看看是什么问题,如果我们部署很多,那么查看日志就会很繁琐。
这里就引入日志中心,来汇聚所有服务的日志,并且提供了可视化界面来看日志,这样就便捷很多。
过程中看了很多人的帖子,我这里也记录一下搭建过程
ELK它是3个产品的缩写,E就是ElasticSearch(搜索引擎,处理数据),L就是Logstash(接受日志),K就是Kibana(展示数据)3个独立可以运行的产品、linux存在一个整体的docker容器,直接可以 一次性启动3个(因为启动过程不好把控,建议单独一个一个安装,后续自己打docker)。
docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -e ES_MIN_MEM=128m -e ES_MAX_MEM=1024m -it --name elk sebp/elk
5601 - Kibana web 接口
9200 - Elasticsearch JSON 接口
5044 - Logstash 日志接收接口
提供3个访问接口
运行过程中的问题
Starting Elasticsearch Server future versions of Elasticsearch will require Java 11; your Java version from [/usr/lib/jvm/java-8-openjdk-amd64/jre] does not meet this requirement
原因:这是ES的一种安全措施,不让用root用户,下面提到过
解决方案:1. 下载docker pull sebp/elk:683其他版本
2.(未尝试暂不建议使用,只提供思路)找到sebp/elk的dockerfile,将创建用户等语句放在里面,https://hub.docker.com/r/sebp/elk/dockerfile
3. 我在百度es root身份不能启动的时候,发现有这样的解决方法。如图
之前我看过dockerfile的 代码,最后写着
于是去看了start.sh发现其中有对应的参数,所以我们可以在这里设置allow.root = true
所以遇到问题 要多去了解,尽可能从不同角度去看解决问题
我先采用1方案
-- elk一些帮助文档 https://ixjx.gitbooks.io/docker-elk-doc
1方案启动,还会报错,
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
原因:vm.max_map_count至少需要262144,附永久修改vm.max_map_count
解决方案: vi /etc/sysctl.conf 添加 一行 vm.max_map_count=655360
加载参数 sysctl -p
这里介绍如何分别部署,以及应用监听
启动成功后就是修改配置来使用,具体可以看dockerfile来找配置文件
/etc/logstash/conf.d/02-beats-input.conf
1. 搭建Elasticsearch
下载安装Elasticsearch,官网地址:https://www.elastic.co/downloads/elasticsearch
可以安装windows或者 linux版本
linux版:
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.2.tar.gz
tar -xvf elasticsearch-6.3.2.tar.gz
sudo chown -R es:elasticsearch elasticsearch-6.3.2
从5.0开始 elasticsearch 安全级别提高了 不允许采用root帐号启动 所以我们要添加一个用户用来启动 elasticsearch
useradd es
chown -R es:es /usr/local/elasticsearch-6.2.4///把目录权限赋予给es用户
su es//切换至es用户
修改elasticsearch.yml
cluster.name: my-application
node.name: node-1
network.host: 0.0.0.0
http.port: 9200
#因为Centos6不支持SecComp,而ES默认bootstrap.system_call_filter为true进行检测
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
vim /etc/sysctl.conf
在文件最后面添加内容:
vm.max_map_count=262144
保存退出后,使用sysctl -p 刷新生效
修改文件/etc/security/limits.conf
添加
* hard nofile 65536
* soft nofile 65536
* soft nproc 2048
* hard nproc 4096
启动elasticesearch 可能还会报如下错误
max number of threads [1024] for user [lish] likely too low, increase to at least [4096]
解决:切换到root用户,进入limits.d目录下修改配置文件。
vi /etc/security/limits.d/90-nproc.conf
修改如下内容:
* soft nproc 1024
#修改为
* soft nproc 4096
2. 搭建Logstash
在每个微服务应用中引入pom依赖,之后在/src/main/resources/路径下配置logback.xml。与zipkin类似,每个服务给logstash发送消息(ELK安装好后需要在etc/logstash/conf.d/中的配置文件修改,它会进行整合然后启动)
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.1</version>
</dependency>
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<contextName>ProviderLog</contextName>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<!--本工程中没使用文件输出日志,只用了console和logstash,此处配置无用-->
<property name="LOG_HOME" value="D:/" />
<!--可以手动指定log名字-->
<property name="appName" value="auth" />
<!--也可以使用工程的名字-->
<springProperty scope="context" name="springAppName" source="spring.application.name"/>
<springProperty scope="context" name="serverPort" source="server.port"/>
<!-- logstash远程日志配置-->
<appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>127.0.0.1:5044</destination>
<!-- 默认是JSON格式,所以logstash中应该配置codec为json_lines-->
<!-- LoggingEventCompositeJsonEncoder是LogstashEncoder的父类,可以使用pattern自定义json的关键字
-->
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder" >
<!-- <encoder class="net.logstash.logback.encoder.LogstashEncoder" >-->
<providers>
<!--可以配合LogstashEncoder使用-->
<!-- <timestamp/>-->
<!-- <version/>-->
<!-- <message/>-->
<!-- <loggerName/>-->
<!-- <threadName/>-->
<!-- <logLevel/>-->
<!-- <callerData/>-->
<timestamp>
<timeZone>UTC</timeZone>
</timestamp>
<pattern>
<pattern>
<!--或者使用"app": "${appName}",-->
<!-- 都是sleuth的,本处没用到-->
<!-- "trace": "%X{X-B3-TraceId:-}",-->
<!-- "span": "%X{X-B3-SpanId:-}",-->
<!-- "parent": "%X{X-B3-ParentSpanId:-}",-->
<!-- "stack_trace": "%exception{10},"-->
{
"app": "${springAppName}_${serverPort}",
"level": "%level",
"thread": "%thread",
"class": "%logger{40}",
"message": "%message"
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>
<!-- 控制台输出 -->
<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{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/system.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</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{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="stash" />
<appender-ref ref="STDOUT" />
<!-- <appender-ref ref="FILE" />-->
</root>
</configuration>
安装logstash
Logstash 是一个实时数据收集引擎,可收集各类型数据并对其进行分析,过滤和归纳。按照自己条件分析过滤出符合数据导入到可视化界面。它可以实现多样化的数据源数据全量或增量传输,数据标准格式处理,数据格式化输出等的功能,常用于日志处理。工作流程分为三个阶段:
(1)input数据输入阶段,可接收oracle、mysql、postgresql、file等多种数据源;
(2)filter数据标准格式化阶段,可过滤、格式化数据,如格式化时间、字符串等;
(3)output数据输出阶段,可输出到elasticsearch、mongodb、kfka等接收终端
路径:https://www.elastic.co/downloads/logstash
linux版:
下载
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.6.0.tar.gz
解压
tar –zxvf logstash-6.6.0.tar.gz
重命名
mv logstash-6.6.0 logstash
与redis类似
创建xxx.conf,然后 执行 ./logstash -f ../test/xxx.conf
input{
file{
path =>"/home/logstash/logstash-5.4.0/test/access_log.2018-04-10.log"
start_position=>"beginning"
}
}
filter{
grok{
match=>{
"message"=>"%{DATA:clientIp} - - \[%{HTTPDATE:accessTime}\] \"%{DATA:method} %{DATA:requestPath} %{DATA:httpversion}\" %{DATA:retcode} %{DATA:size} \"%{DATA:fromHtml}\" \"%{DATA:useragent}\""
}
remove_field=>"message"
}
date{
match=>["accessTime","dd/MMM/yyyy:HH:mm:ss Z"]
}
}
output{
stdout{
codec=>rubydebug
}
}
可以指定从哪里读取日志文件,或者给定目录读取所有文件
windows版:
下载好,解压到elasticsearch同级目录方便管理
接收控制台输入,Logstash解析输出到ElasticSearch集群
input{
2 stdin {}
3 }
4 output {
5 elasticsearch {
6 hosts => ["127.0.0.1:9200"]
7 index => "yj_index"
8 }
9 stdout { codec => rubydebug}
10 }
3. 搭建Kibana
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.3.2-linux-x86_64.tar.gz
tar -zxvf kibana-6.3.2-linux-x86_64.tar.gz
修改配置文件
vim config/kibana.yml
# 放开注释,将默认配置改成如下:
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "http://192.168.12.121:9200"
kibana.index: ".kibana"
启动
bin/kibana
windows版:
地址:https://www.elastic.co/downloads/kibana
下载,解压,修改kibana.yml文件
设置elasticsearch.url为启动的elasticsearch http://localhost:9200/
进入kibana的bin目录,双击kibana.bat