ELK技术2:日志收集实践(EFK)

日志收集实践

filebeat是什么?
Filebeat是用于转发和集中日志数据的轻量级传送程序。
作为服务器上的代理安装,Filebeat监视您指定的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或 Logstash等进行索引。

filebeat工作方式
Filebeat的工作方式如下:启动Filebeat时,它将启动一个或多个输入,这些输入将在为日志数据指定的位置中查找。对于Filebeat所找到的每个日志,Filebeat都会启动harvester。每个harvester都读取单个日志以获取新内容,并将新日志数据发送到libbeat,libbeat将聚集事件,并将聚集的数据发送到为Filebeat配置的输出。

input:负责管理harvester并查找所有可读取的资源。Input包括多种类型Log,syslog,kafka,redis,tcp,s3 等等、

Tips: Filebeat保留每个文件的状态,并经常将状态刷新到注册表文件中的磁盘。该状态用于记住harvester正在读取的最后一个偏移量。
在这里插入图片描述

filebeat常见命令&参数

export 将配置或索引模板导出到stdout。

help 显示任何命令的帮助。

keystore 管理秘密密钥库。

modules 管理配置的模块。

run 运行Filebeat。如果在未指定命令的情况下启动Filebeat,则默认使用此命令。

setup 设置初始环境,包括索引模板,Kibana仪表板和机器学习作业

test 测试配置。

version 显示有关当前版本的信息

-E  覆盖配置文件中的配置。   

filebeat -E  "output.elasticsearch.hosts=["http://myhost:9200"]"

-M 覆盖filebeat模块的配置

filebeat -modules=nginx -M "nginx.access.var.paths=[/var/log/nginx/access.log*]"

-c  小c 指定配置文件的路径。

-e 记录到stderr并禁用syslog /文件输出。

filebeat test config -c filebeat.yml  测试配置文件正确与否

安装filebeat

在web服务器上安装filebeat用于收集日志,和传输日志数据

[root@centos6 opt]# tar zxf filebeat-5.4.1-linux-x86_64.tar.gz
[root@centos6 opt]# ls
filebeat-5.4.1-linux-x86_64 filebeat-5.4.1-linux-x86_64.tar.gz nginx-1.12.2-1.el6.ngx.x86_64.rpm
[root@centos6 opt]# mv filebeat-5.4.1-linux-x86_64 /usr/local/filebea

配置filebeat:
[root@web01 ~]# cat /etc/filebeat/filebeat.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/messages

output.elasticsearch:
  hosts: ["10.0.0.161:9200","10.0.0.162:9200","10.0.0.163:9200"]

2.检查Cerebro中是否存在索引:

3.登录Kibana,查看索引;

1.索引模式-->创建索引-->匹配索引对应的名称-->添加-->timestamp

安装rsyslog
[root@web01 ~]# yum install rsyslog -y
[root@web01 ~]# vim /etc/rsyslog.conf
#Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
. /var/log/oldxu.log
[root@web01 ~]# systemctl restart rsyslog

[root@web01 ~]# logger “rsyslog test from oldxu”

修改filebeat的配置文件:
[root@web01 ~]# cat /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/oldxu.log

output.elasticsearch:
hosts: [“10.0.0.161:9200”,“10.0.0.162:9200”,“10.0.0.163:9200”]

删除ES中原来FIlebeat的索引; 重新添加;

-------------------------filebeat仅包含需要的内容;
1.删除kibana匹配es索引的模式; ( 不能看数据,不代表索引被删除; )
2.删除es的索引; ( 删除索引,数据页没了; )

3.配置filebeat
[root@web01 ~]# cat /etc/filebeat/filebeat.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/oldxu.log

  # 仅包含,错误信息,警告信息,sshd的相关配置,其他的都会过滤掉
  include_lines: ['^ERR', '^WARN', 'sshd']

output.elasticsearch:
  hosts: ["10.0.0.161:9200","10.0.0.162:9200","10.0.0.163:9200"]

[root@web01 ~]# systemctl restart filebeat

问题:
1.索引名称能不能定制; filebeat-2021-01-01… fileba-2021-01-02

	1.自定义索引名称;
	2.自定义分片和副本数量;
[root@web01 ~]# cat /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/oldxu.log

  # 仅包含,错误信息,警告信息,sshd的相关配置,其他的都会过滤掉
  include_lines: ['^ERR', '^WARN', 'sshd']

output.elasticsearch:
  hosts: ["10.0.0.161:9200","10.0.0.162:9200","10.0.0.163:9200"]
  index: "system-%{[agent.version]}-%{+yyyy.MM.dd}"

setup.ilm.enabled: false
setup.template.name: "system"       #定义模板名称
setup.template.pattern: "system-*"  #定义模板的匹配索引名称

setup.template.settings:
  index.number_of_shards: 3
  index.number_of_replicas: 1

	
		# 注意: 如果先配置了自定义名称,后期无法修改,分片,因为模板固定分片为1;
				解决方法: 删除模板,删除索引,然后重启filebeat,产生新的数据;

2.如果收集多个web节点相同的日志;是不是应该写入同一个索引中;如果是;如何区分数据是哪个节点产生的;
2.1 安装filebeat
2.2 将环境修改为一致, rsyslog
2.2 拷贝配置文件

Nginx:

message: 10.0.0.7 - - [19/Jan/2021:14:42:28 +0800] "GET / HTTP/1.1" 200 8 "-" "curl/7.29.0" "-"
	Client: 10.0.0.7
	Request: 
	http_version:  HTTP/1.1
	status: 200
	bytes: 8

修改成json格式的两种方法:
1.修改Nginx日志;
[root@web01 ~]# vim /etc/nginx/nginx.conf
http { 
	log_format json '{ "time_local": "$time_local", '
							  '"remote_addr": "$remote_addr", '
							  '"referer": "$http_referer", '
							  '"request": "$request", '
							  '"status": $status, '
							  '"bytes": $body_bytes_sent, '
							  '"agent": "$http_user_agent", '
							  '"x_forwarded": "$http_x_forwarded_for", '
							  '"up_addr": "$upstream_addr",'
							  '"up_host": "$upstream_http_host",'
							  '"upstream_time": "$upstream_response_time",'
							  '"request_time": "$request_time"'
		'}';
	
	access_log  /var/log/nginx/access.log  json;
}

[root@web01 ~]# > /var/log/nginx/access.log
[root@web01 ~]# systemctl restart nginx


filebeat:------------------------->
[root@web01 ~]# cat /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
  json.keys_under_root: true  #Flase会将json解析的格式存储至messages,改为true则不存储至message
  json.overwrite_keys: true   #覆盖默认message字段,使用自定义json格式的key

output.elasticsearch:
  hosts: ["10.0.0.161:9200","10.0.0.162:9200","10.0.0.163:9200"]
  index: "nginx-access-%{[agent.version]}-%{+yyyy.MM.dd}"

setup.ilm.enabled: false
setup.template.name: "nginx"       #定义模板名称
setup.template.pattern: "nginx-*"  #定义模板的匹配索引名称
[root@web01 ~]# systemctl restart filebeat

删除之前Nginx的索引;

	2.filebeat--> Logstash数据解析和转换;

1.收集Nginx访问日志,Nginx错误日志

访问日志: json
错误日志: 文本

[root@web01 ~]# cat  /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
  json.keys_under_root: true  #Flase会将json解析的格式存储至messages,改为true则不存储至message
  json.overwrite_keys: true   #覆盖默认message字段,使用自定义json格式的key
  tags: nginx-access

- type: log
  enabled: true
  paths:
    - /var/log/nginx/error.log
  tags: nginx-error


output.elasticsearch:
  hosts: ["10.0.0.161:9200","10.0.0.162:9200","10.0.0.163:9200"]
  indices:
    - index: "nginx-access-%{[agent.version]}-%{+yyyy.MM.dd}"
      when.contains:
        tags: "nginx-access"  #tags为access的日志存储至nginx-access-* 索引
    - index: "nginx-error-%{[agent.version]}-%{+yyyy.MM.dd}"
      when.contains:
        tags: "nginx-error"   #tags为error的日志存储至nginx-error-* 索引

setup.ilm.enabled: false
setup.template.name: "nginx"       #定义模板名称
setup.template.pattern: "nginx-*"  #定义模板的匹配索引名称

测试:
[root@web01 ~]# curl -HHost:elk.oldxu.com http://10.0.0.7/dadsadsa

2.如果是虚拟主机的情况,怎么收集?

blog ---> /var/log/nginx/blog.oldxu.com.log
	edu ---> /var/log/nginx/edu.oldxu.com.log
	
	
[root@web01 conf.d]# cat edu.oldxu.com.conf 
server {
	listen 80;
	server_name edu.oldxu.com;
	root /code/edu;
	access_log /var/log/nginx/edu.log json;

	location / {
		index index.html;
	}

[root@web01 conf.d]# cat blog.oldxu.com.conf 
server {
	listen 80;
	server_name blog.oldxu.com;
	root /code/blog;
	access_log /var/log/nginx/blog.log json;

	location / {
		index index.html;
	}
}


mkdir /code/blog
echo "blog.." > /code/blog/index.html
mkdir /code/edu
echo "edu.." > /code/edu/index.html

systemctl reload nginx
curl -HHost:edu.oldxu.com http://10.0.0.7
curl -HHost:blog.oldxu.com http://10.0.0.7


[root@web01 conf.d]# cat /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
  json.keys_under_root: true  #Flase会将json解析的格式存储至messages,改为true则不存储至message
  json.overwrite_keys: true   #覆盖默认message字段,使用自定义json格式的key
  tags: nginx-access

- type: log
  enabled: true
  paths:
    - /var/log/nginx/blog.log
  json.keys_under_root: true  #Flase会将json解析的格式存储至messages,改为true则不存储至message
  json.overwrite_keys: true   #覆盖默认message字段,使用自定义json格式的key
  tags: nginx-blog

- type: log
  enabled: true
  paths:
    - /var/log/nginx/edu.log
  json.keys_under_root: true  #Flase会将json解析的格式存储至messages,改为true则不存储至message
  json.overwrite_keys: true   #覆盖默认message字段,使用自定义json格式的key
  tags: nginx-edu

- type: log
  enabled: true
  paths:
    - /var/log/nginx/error.log
  tags: nginx-error


output.elasticsearch:
  hosts: ["10.0.0.161:9200","10.0.0.162:9200","10.0.0.163:9200"]
  indices:
    - index: "nginx-access-%{[agent.version]}-%{+yyyy.MM.dd}"
      when.contains:
        tags: "nginx-access"  #tags为access的日志存储至nginx-access-* 索引
    - index: "nginx-blog-%{[agent.version]}-%{+yyyy.MM.dd}"
      when.contains:
        tags: "nginx-blog"   #tags为error的日志存储至nginx-error-* 索引
    - index: "nginx-edu-%{[agent.version]}-%{+yyyy.MM.dd}"
      when.contains:
        tags: "nginx-edu"   #tags为error的日志存储至nginx-error-* 索引
    - index: "nginx-error-%{[agent.version]}-%{+yyyy.MM.dd}"
      when.contains:
        tags: "nginx-error"   #tags为error的日志存储至nginx-error-* 索引


setup.ilm.enabled: false
setup.template.name: "nginx"       #定义模板名称
setup.template.pattern: "nginx-*"  #定义模板的匹配索引名称

3.filebeat收集tomcat的错误日志和access日志

访问日志:
改成json就完事;

		
<Host name="elk.tomcat.com"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
          <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
            prefix="elk.tomcat_access_log" suffix=".txt"
            pattern="{&quot;clientip&quot;:&quot;%h&quot;,&quot;ClientUser&quot;:&quot;%l&quot;,&quot;authenticated&quot;:&quot;%u&quot;,&quot;AccessTime&quot;:&quot;%t&quot;,&quot;method&quot;:&quot;%r&quot;,&quot;status&quot;:&quot;%s&quot;,&quot;SendBytes&quot;:&quot;%b&quot;,&quot;Query?string&quot;:&quot;%q&quot;,&quot;partner&quot;:&quot;%{Referer}i&quot;,&quot;AgentVersion&quot;:&quot;%{User-Agent}i&quot;}" />

错误日志:
多行合并为1行;

配置filebeat文件

[root@web01 filebeat]# cat /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /soft/tomcat/logs/elk.tomcat_access_log.*.txt
  json.keys_under_root: true  #Flase会将json解析的格式存储至messages,改为true则不存储至message
  json.overwrite_keys: true   #覆盖默认message字段,使用自定义json格式的key
  tags: tomcat-access


- type: log
  enabled: true
  paths:
    - /soft/tomcat/logs/catalina.out
  tags: tomcat-error
  multiline.pattern: '^\d{2}'
  multiline.negate: true
  multiline.match: after
  multiline.max_lines: 1000


output.elasticsearch:
  hosts: ["10.0.0.161:9200","10.0.0.162:9200","10.0.0.163:9200"]
  indices:
    - index: "tomcat-access-%{[agent.version]}-%{+yyyy.MM.dd}"
      when.contains:
        tags: "tomcat-access"  #tags为access的日志存储至nginx-access-* 索引
    - index: "tomcat-error-%{[agent.version]}-%{+yyyy.MM.dd}"
      when.contains:
        tags: "tomcat-error"

setup.ilm.enabled: false
setup.template.name: "tomcat"       #定义模板名称
setup.template.pattern: "tomcat-*"  #定义模板的匹配索引名称

猜你喜欢

转载自blog.csdn.net/xiaoleinb/article/details/112850747