收集日志的几种方式:
1.logstash (消耗内存多。功能性好)
2.logstash的TCP/UDP 监听端口,在”其他“服务器安装 nc 命令
3.通过 rsyslog 收集日志,要logstash接收再转发到ES :
4.filebeat 收集日志:写入es redis logstash kafka (消耗内存少,不使用java,不支持多输出 ,不支持IF的type判断,filebeat服务器的配置文件中先定义fields:)
使用 filebeat 替代 logstash 收集日志:
Filebeat 是轻量级单用途的日志收集工具,用于在没有安装 java 的服务器上专
门收集日志,可以将日志转发到 logstash、elasticsearch 或 redis 及 kafka 等场景中进行下一步处理。
从input读取事件源,经过相应解析和处理之后,从output输出到目标存储库(elasticsearch或其他)。
输入可以从Log、Syslog、Stdin、Redis、UDP、Docker、TCP、NetFlow输入,然后可以输出到Elasticsearch、Logstash、Kafka、Redis、File、Console、Cloud。
注意1:output到服务器,不能同时有多个, 取多个inputs时,只会生成一个index文件,造成混乱,建议分类,filebeat由于不支持IF的type判断,先传给logstash或Redis。
注意1:output到ES服务器,不支持josn格式,(可以先到Redis解决此问题)
1.docker适合这种方式。
2.默认日志格式为 json 格式
实验说明
192.168.80.100 localhost7A.localdomain ES-node1 head cerebro kibana
192.168.80.110 localhost7B.localdomain ES-node2
192.168.80.120 localhost7C.localdomain ES-node3
192.168.80.130 localhost7D.localdomain logstash1
192.168.80.140 localhost7E.localdomain Redis
192.168.80.150 localhost7F.localdomain Kafka
192.168.80.160 localhost7G.localdomain logstash2 nginx 模拟客户端和filebeat接收端
192.168.80.170 localhost7H.localdomain filebeat nginx 模拟客户端
实验测试几种情况:
情况1.filebeat收集日志,ES接收。 日志混乱,所有日志成为一个index,无法分类.
情况2.filebeat收集日志redis接收,logstash在redis服务器上读取日志,并写入ES服务器。 日志混乱,在Redis中就成一个index,无法分类。
情况3.filebeat收集日志logstash接收, 接5。
情况4.logstash2收集日志,ES接收. 正常,日志能分类。
情况5.logstash2收集日志,redis接收,logstash1在redis服务器上读取日志,并写入ES服务器 正常,日志能分类
[root@localhost7H ~] yum install filebeat-7.6.1-x86_64.rpm nginx
[root@localhost7H ~] systemctl restart filebeat.service
[root@localhost7H ~] systemctl restart nginx.service
一、filebeat配置文件说明:
[root@localhost7H ~]#cat /etc/filebeat/filebeat.yml
#-------------------- Filebeat inputs -------------------
取本地的配置文件,可以有多个。
filebeat.inputs:
- type: log
enabled: true #开启功能
fields: #自定义的字段名,用于日志分类
type: nginx_access
host: 1.1.1.1
paths:
- /var/log/nginx/access.log
#- c:\programdata\elasticsearch\logs\*
- type: log
enabled: true
fields:
type: nginx_error
host: 2.2.2.2
# level: debug
paths:
- /var/log/nginx/error.log
#三行为处理多行日志,参考"收集 java 多行日志"
#multiline.pattern: ^\[
#multiline.negate: false
#multiline.match: after
#-------------------- Elasticsearch output ---------------
输出到各服务器,不能同时多个
输出到logstash服务器,hosts: 为logstashIP地址和监听端口,loadbalance:表示对端口轮流发数据。 worker 发数据的工作进程 ,情况3
output.logstash:
hosts: ["192.168.80.160:5044", "192.168.80.160.5045"]
loadbalance: true
worker: 3
输出到redis服务器,情况2
#output.redis:
# hosts: ["192.168.80.140:6379"]
# password: "12345678"
# key: "filebeat_redis_nginx"
# db: 1
# timeout: 5
输出到本地路径
#output.file:
# path: "/tmp/"
# filename: "filebeat-linux.log"
输出到ES服务器,es的index系统自己生成。情况1
#output.elasticsearch:
# hosts: ["192.168.80.100:9200"]
情况1测试结果: 日志混乱,所有日志成为一个index,无法分类.
情况2测试结果:日志混乱,所有日志成为一个index,无法分类.
二、redis 配置
1.安装redis并设置密码
[root@localhost7e ~]# yum install redis
[root@localhost7e ~]# redis-cli
127.0.0.1:6379> config set requirepass 12345678 #动态设置,重启后无效
OK
验证 redis 是否有数据
127.0.0.1:6379> auth 12345678
127.0.0.1:6379> SELECT 1
127.0.0.1:6379[1]> keys *
1) "filebeat_redis_nginx"
127.0.0.1:6379[1]> TYPE filebeat_redis_nginx
list
127.0.0.1:6379[1]>
127.0.0.1:6379[1]> LPOP filebeat_redis_nginx
三、logstash 配置文件
[root@localhost7G ~]# cat /etc/logstash/conf.d/log-to-redis.conf
#logstash的beats插件开启的监听端口,客户端为 elk的filebeat插件。
input {
beats {
port => 5044
codec => "json"
}
beats {
port => 5045
codec => "json"
}}
#输出到redis服务器
output {
#[fields][type]的值在filebeat服务器的配置文件中先定义fields:。
if [fields][type] == "nginx_error" {
redis {
host => "192.168.80.140"
port => "6379"
db => "1"
password => "12345678"
data_type => "list"
key => "nginx-errorlog"
}}
if [fields][type] == "nginx_access" {
redis {
host => "192.168.80.140"
port => "6379"
db => 1
password => "12345678"
data_type => "list"
key => "nginx-accesslog"
codec => "json"
}}}
情况3测试结果:验证 redis 是否有数据
[root@localhost7G ~]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/log-to-redis.conf
[root@localhost7e ~]# redis-cli
127.0.0.1:6379> auth 12345678
127.0.0.1:6379> SELECT 1
127.0.0.1:6379[1]> keys *
1) "nginx-accesslog-170"
2) "nginx-errorlog-170"
四.logstash 配置文件
[root@localhost7D ~]# cat /etc/logstash/conf.d/redis-to-es.conf
#读取redis的服务器
input {
redis {
host => "192.168.80.140"
port => "6379"
db => 1
password => "12345678"
data_type => "list"
key => "nginx-errorlog"
}
redis {
host => "192.168.80.140"
port => "6379"
db => 1
password => "12345678"
data_type => "list"
key => "nginx-accesslog"
codec => "json"
}}
#输出到es服务器
output {
if [fields][type] == "nginx_error" {
elasticsearch {
hosts => ["192.168.80.100:9200"]
index => "nginx-errlog-170-%{+YYYY.MM.dd}"
#codec => "json"
}}
if [fields][type] == "nginx_access" {
elasticsearch {
hosts => ["192.168.80.100:9200"]
index => "nginx-accesslog-170-%{+YYYY.MM.dd}"
codec => "json"
}}}
五、在http://192.168.810.100:5601 中management--》kibana --》 index-mode 创建索引模式: 是json格式的。
在http://192.168.810.100:5601 中disover中查看日志信息
六、logstash 收集日志并写入 redis:
用一台服务器按照部署 redis 服务,专门用于日志缓存使用,用于 web 服务器产生大量日志的场景,
例如下面的服务器内存即将被使用完毕,查看是因为 redis服务保存了大量的数据没有被读取而占用了大量的内存空间。
在logstash服务器收集nginx日志和监听一个端口,并写入redis服务器
[root@localhost7G ~]# cat /etc/logstash/conf.d/logstash-to-redis.conf
input {
file {
path => "/var/log/nginx/access_.*.log"
type => "nginx-accesslog"
start_position => "end"
stat_interval => "3"
codec => "json"
}
tcp {
port => 7777
mode => "server"
type => "tcplog" #定义type,在下面使用。
}
}
output {
if [type] == "nginx-accesslog" {
redis {
data_type => "list"
key => "nginx-access-160"
host => "192.168.80.140"
port => "6379"
db => "2"
password => "12345678"
}
}
if [type] == "tcplog" {
redis {
data_type => "list"
key => "tcplog"
host => "192.168.80.140"
port => "6379"
db => "2"
password => "12345678"
}
}
}
测试: 验证 redis 是否有数据
1.访问nginx
2.echo "伪设备 1" > /dev/tcp/192.168.80.160/7777
登录redis查看。
[root@localhost7e ~]# redis-cli
127.0.0.1:6379> config set requirepass 12345678
127.0.0.1:6379> auth 12345678
127.0.0.1:6379> select 2
127.0.0.1:6379[1]> keys *
1) "tomcat-access-160"
2) "tcplog"
logstash 配置文件
在redis服务器上读取日志,并写入ES服务器
[root@localhost7D /]# vim /etc/logstash/conf.d/redis-to-es-160.conf
input {
redis {
data_type => "list"
key => "nginx-access-160"
host => "192.168.80.140"
port => "6379"
db => "2"
password => "12345678"
codec => "json"
}
redis {
data_type => "list"
key => "tcplog"
host => "192.168.80.140"
port => "6379"
db => "2"
password => "12345678"
}
}
output {
if [type] == "nginx-accesslog" {
elasticsearch {
hosts => ["192.168.80.100:9200"]
index => "nginx_accesslog_160_%{+YYYY.MM.dd}"
}
}
if [type] == "tcplog" {
elasticsearch {
hosts => ["192.168.80.100:9200"]
index => "tcplog_160_%{+YYYY.MM.dd}"
codec => "json"
}
}
}
在http://192.168.80.100:5601 中management--》kibana --》 index-mode 创建索引模式:
在http://192.168.80.100:5601 中disover中查看日志信息 json格式
=====================================================
使用logstash 收集日志并写入 kafka
实验说明
192.168.80.100 localhost7A.localdomain ES-node1 head cerebro kibana
192.168.80.110 localhost7B.localdomain ES-node2
192.168.80.120 localhost7C.localdomain ES-node3
192.168.80.130 localhost7D.localdomain logstash1
192.168.80.150 localhost7F.localdomain Kafka
192.168.80.160 localhost7G.localdomain logstash2 nginx 模拟客户端
192.168.80.170 localhost7H.localdomain filebeat nginx 模拟客户端和filebeat接收端
1.安装kafka 和zookeeper :
https://www.cnblogs.com/Yuanbangchen/p/17056168.html
https://www.cnblogs.com/Yuanbangchen/p/17057413.html
2.收集和配置 logstash2 收集单日志文件并写入kafka中,安装nginx设置json格式的日志。
[root@localhost7G conf.d]# cat logstash-to-kafka.conf
input {
file {
path => "/var/log/dmesg"
type => "kafka-syslog"
}
file {
path => "/var/log/nginx/access.log"
start_position => "beginning"
type => "nginx-accesslog-160"
codec => "json"
}
}
output {
# stdout {
# codec =>"rubydebug"
# }
if [type] == "kafka-syslog" {
kafka {
bootstrap_servers => "192.168.80.150:9092" #多个kafka使用,号。
topic_id => "magedu-linux39-testlog"
codec => "json"
}}
if [type] == "nginx-accesslog-160" {
kafka {
bootstrap_servers => "192.168.80.150:9092"
topic_id => "nginx-accesslog-160"
codec => "json"
}}
}
[root@localhost7G conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash-to-kafka.conf -t
访问nginx产生测试日志日志,验证是否写入 kafka:
[root@localhost7F ~]# /usr/local/kafka/bin/kafka-topics.sh --list --zookeeper 192.168.80.150:2181
nginx-accesslog-160
magedu-linux39-testlog
3.配置 logstash1 从 kafka 读取日志并写入ES中。
[root@localhost7D /]# cat /etc/logstash/conf.d/kafka-to-es.conf
input {
kafka {
bootstrap_servers => "192.168.80.150:9092" #多个kafka使用,号。
topics => "magedu-linux39-testlog"
codec => "json"
}
kafka {
bootstrap_servers => "192.168.80.150:9092"
topics => "nginx-accesslog-160"
codec => "json"
}
}
output {
if [type] == "kafka-syslog" {
elasticsearch {
hosts => ["192.168.80.100:9200"]
index => "kafka-syslog-%{+YYYY.MM.dd}"
}}
if [type] == "nginx-accesslog-160" {
elasticsearch {
hosts => ["192.168.80.100:9200"]
index => "logstash-kafka-nginxlog-%{+YYYY.MM.dd}"
}}
}
[root@localhost7D /]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash-to-kafka.conf -t
四、在http://192.168.80.130:5601 中management--》kibana --》 index-mode 创建索引模式:
在http://192.168.80.100:5601 中disover中查看日志信息
使用 filebeat 收集日志并写入kafka
fields 设置
[root@localhost7h ~]# vim /etc/filebeat/filebeat.yml
cat /etc/filebeat/filebeat.yml
#读本地文件
filebeat.inputs:
- type: log
enabled: true
fields:
type: nginx-access
logResource: dev-nginx-access
paths:
- /var/log/nginx/access.log#-------------------- Elasticsearch output ---------------
输出到各服务器,不能同时多个
输出到logstash服务器,hosts: 为logstashIP地址和监听端口,loadbalance:表示对端口轮流发数据。 worker 发数据的工作进程
output.logstash:
hosts: ["192.168.80.160:5044"]
loadbalance: true
worker: 3
#logstash2监听两个端口,接收到的数据输出到kafka中。
[root@localhost7G conf.d]# vim /etc/logstash/conf.d/logstash-to-kafka-2.conf
input {
beats {
port => 5044
#codec => "json"
}
beats {
port => 5045
#codec => "json"
}}
output {
if [fields][type] == "nginx-access" {
kafka {
bootstrap_servers => "192.168.80.150:9092"
topic_id => "nginx-accesslog-170"
codec => "json"
}}
}
[root@localhost7G conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash-to-kafka-2.conf [root@localhost7F ~]# /usr/local/kafka/bin/kafka-topics.sh --list --zookeeper 192.168.80.150:2181
nginx-accesslog-170
#logstash1在读取kafka中的数据并输出到ES中。
cat /etc/logst/conf.d/kafka-to-es.conf
input {
kafka {
bootstrap_servers => "192.168.80.150:9092" #多个kafka使用,号。
topics => "nginx-accesslog-170"
codec => "json"
}
}output {
if [fields][type] == "nginx-access" {
elasticsearch {
hosts => ["192.168.80.100:9200"]
index => "logstash-kafka-nginxlog-170-%{+YYYY.MM.dd}"
}}
}
验证, json序列化可以。
在http://192.168.810.100:5601 中management--》kibana --》 index-mode 创建索引模式:
在http://192.168.810.100:5601 中disover中查看日志信息