Theme NexT works best with JavaScript enabled
0%

使用ELK搭建日记系统

简介

搭建日志系统的目的主要为了在生产环境下能够方便的查看多个项目的实时日记,增加开发效率。特别是在线上多台服务器部署时候,不用在登录服务器进入项目目录,通过 tail -f 等命令来查看日记了。

目标

  • 使用 ELK (Elasticsearch、Logstash、Kibana) 构建日记系统。
  • 实现多台服务器收集 Laravel 应用日记与 Nginx 日记。
  • Kibana 报表的展示日记信息。

架构

Filebeat + Redis + ELK ( Elasticsearch、Logstash、Kibana )

  1. Filebeat 从服务器取日志文件并存储到 Redis 中。
  2. Logstash 从 Redis 中取出日志记录,解析处理后并转发到 Elasticsearch 中。
  3. Kibana 从 Elasticsearch 中读取数据并展示。

配置

elasticsearch安装

1.安装

1
brew install elasticsearch

安装目录:/usr/local/Cellar/elasticsearch/{elasticsearch-version}/

日志目录:/usr/local/var/log/elasticsearch/

插件目录:/usr/local/var/elasticsearch/plugins/

配置目录:/usr/local/etc/elasticsearch/

2.启动

1
brew services start elasticsearch

首次启动,默认的端口号是9200,用户名是elastic,密码changeme

kibana

1.安装

1
brew install kibana

安装目录:/usr/local/Cellar/kibana/{kibana-version}/

配置目录:/usr/local/etc/kibana/

2.修改配置文件

1
2
3
4
5
6
7
8
9
vi /usr/local/etc/kibana/kibana.yml

erver.name: kibana
server.port: 5601
server.host: "localhost"
elasticsearch.hosts: "http://localhost:9200"
elasticsearch.username: "elastic"
elasticsearch.password: "changeme"
i18n.locale: "zh-CN"

3.启动

1
brew services start kibana

首次启动,默认端口号是5601,打开浏览器访问http://localhost:5601访问kibana管理页面,会弹框要求输入用户名密码,输入elastic和123456即可。

logstash

1.安装

1
brew install logstash

安装目录:/usr/local/Cellar/logstash/{logstash-version}/

2.安装插件

1
2
cd /usr/local/Cellar/logstash/{logstash-version}/
./logstash-plugin install logstash-input-jdbc

3.编辑配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
vi jdbc.conf
input {
jdbc {
jdbc_driver_library => "mysql连接jar包"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://数据库地址及数据库?useUnicode=true&characterEncoding=utf8&useSSL=false"
jdbc_user => "数据库账号"
jdbc_password => "数据库密码"
schedule => "* * * * *"
jdbc_paging_enabled => true
statement => "select * from tb_item"
}
jdbc {
jdbc_driver_library => "mysql连接jar包"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://数据库地址及数据库?useUnicode=true&characterEncoding=utf8&useSSL=false"
jdbc_user => "数据库账号"
jdbc_password => "数据库密码"
schedule => "* * * * *"
jdbc_paging_enabled => true
#执行语句
statement => "select * from tb_item where updated > :sql_last_value"
#使用数据库表的列
use_column_value => true
tracking_column => "updated"
tracking_column_type => "timestamp"
#这是存放上一次执行之后id的值
last_run_metadata_path => "lastUpdated.txt"
}
}

output {
#输入es地址
elasticsearch {
hosts => ["172.26.43.37:9200"]
# 索引名字,必须小写
index => "tb_item"
# 数据唯一索引
document_id => "%{id}"
}
stdout { codec => json_lines }
}

4.执行脚本

1
./logstash -f jdbc.conf

filebeat

安装

1
brew install filebeat

安装目录:/usr/local/Cellar/filebeat/{filebeat-version}/

配置目录:/usr/local/etc/filebeat/

缓存目录:/usr/local/var/lib/filebeat/

logstash安装

Logstash的安装脚本如下:

1
2
3
4
5
6
7
# 下载logstash的压缩包
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.2.0.zip
# 解压压缩包
upzip logstash-7.2.0.zip
# 将解压的包移到/usr/share目录下
mv logstash-7.2.0 /usr/share/
cd /usr/share/logstash-7.2.0/

stash第一个事件

Logstash管道有两个必需元素,输入和输出,以及一个可选元素filter。 输入插件使用来自源的数据,过滤器插件在您指定时修改数据,输出插件将数据写入目标。
如下如

img

1
datasource -> [logstash pipeline](inputs-filter-outputs) -> elasticsearch

要测试Logstash安装成功,运行最基本的Logstash管道。 执行以下的命令

1
bin/logstash -e 'input { stdin { } } output { stdout {} }'

-e标志使您可以直接从命令行指定配置。 通过在命令行指定配置,可以快速测试配置,而无需在迭代之间编辑文件。 示例中的管道从标准输入stdin获取输入,并以结构化格式将输入移动到标准输出stdout。
启动Logstash后,等到看到“Pipeline main started”,然后在命令提示符下输入hello world,显示的如下:

1
2
3
4
5
6
7
hello world
{
"host" => "VM_0_13_centos",
"message" => "hello world",
"@version" => "1",
"@timestamp" => 2019-07-02T06:26:28.684Z
}

配置logstash输出到elasticsearch

修改logstash的安装目录的config目录下的logstash-sample.conf文件,配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
input {
beats {
port => 5044
}
}

output {
elasticsearch {
hosts => ["http://10.0.0.5:9200", "http://10.0.0.13:9200", "http://10.0.0.17:9200"]
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
#user => "elastic"
#password => "changeme"
}
}

在上面的配置中,输入数据源为filebeat,关于filebeat见下一小节,输出源为elasticsearch。更多的输入和输出源的配置见官网https://www.elastic.co/guide/en/logstash/current/advanced-pipeline.html

用下面的命令从后台启动logstash:

1
./bin/logstash -f config/logstash-sample.conf >logstash.log  2>&1 &

logstash结合filebeat

在分布式系统中,一台主机可能有多个应用,应用将日志输出到主机的指定目录,这时由logstash来搬运日志并解析日志,然后输出到elasticsearch上。由于于
logstash是java应用,解析日志是非的消耗cpu和内存,logstash安装在应用部署的机器上显得非常的笨重。最常见的做法是用filebeat部署在应用的机器上,logstash单独部署,然后由
filebeat将日志输出给logstash解析,解析完由logstash再传给elasticsearch。

下载filebeat,下载命令如下:

1
2
3
4
 wget  https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.2.0-linux-x86_64.tar.gz
tar -zxvf filebeat-7.2.0-linux-x86_64.tar.gz
mv filebeat-7.2.0-linux-x86_64 /usr/share/
cd /usr/share/filebeat-7.2.0-linux-x86_64/

vim filebeat.yml修改配置:

1
2
3
4
5
6
7
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/service-hi.log
output.logstash:
hosts: ["192.168.1.4:5044"]

主要配置的是日志的搜集目录为/var/log/service-hi.log,这个目录是应用service-hi输出日志的文件。输出到logstsh的地址为192.168.1.4

启动filebeat,执行一下命令:

1
2
sudo chown root filebeat.yml
sudo ./filebeat -e >filebeat.log 2>&1 &

Spring Boot整合ELK+Filebear构建日志系统

在SpringBoot应用service-hi,定时输出日志如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@SpringBootApplication
public class ElkTestApplication {
Logger logger= LoggerFactory.getLogger(ElkTestApplication.class);
Random random=new Random(10000);

public static void main(String[] args) {
SpringApplication.run(ElkTestApplication.class, args);
new ElkTestApplication().initTask();
}

private void initTask(){
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
logger.info("seed:"+random.nextInt(999999));
}
},100,100, TimeUnit.MILLISECONDS);
}
}

然后在部署了filebeat的机器上部署该应用,应用的输出文件为/var/log/service-hi.log,应用启动命令如下:

1
nohup java -jar  elk-test-0.0.1-SNAPSHOT.jar > /var/log/service-hi.log 2>&1  &

应用启动成功后日志输出如下:

1
2
3
4
5
2019-07-02 17:13:13.530  INFO 31579 --- [pool-1-thread-1] com.example.elktest.ElkTestApplication   : seed:562779
2019-07-02 17:13:13.630 INFO 31579 --- [pool-1-thread-1] com.example.elktest.ElkTestApplication : seed:963836
2019-07-02 17:13:13.730 INFO 31579 --- [pool-1-thread-1] com.example.elktest.ElkTestApplication : seed:825694
2019-07-02 17:13:13.830 INFO 31579 --- [pool-1-thread-1] com.example.elktest.ElkTestApplication : seed:33228
2019-07-02 17:13:13.930 INFO 31579 --- [pool-1-thread-1] com.example.elktest.ElkTestApplication : seed:685589

这时的日志数据的传输路径如下图:

img

1.png

在kibana组件上查看,可以看到创建了一个filebeat开头的数据索引,如下图:

img

微信截图_20190702170554.png

在日志搜索界面,可以看到service-hi应用输出的日志,如图所示:

img

坚持原创技术分享,您的支持将鼓励我继续创作!

欢迎关注我的其它发布渠道