elasticsearch:
#创建自定义的网络(用于连接到连接到同一网络的其他服务(例如Kibana))
docker network create elk
docker run -d --name elasticsearch --net elk -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” elasticsearch:7.7.0
kibana:
docker run -d --name kibana --net elk -p 5601:5601 kibana:7.7.0
中文:配置文件添加 i18n.locale: “zh-CN”
logstash:
1.数据卷:
添加logstash.yml:
path.config: /usr/share/logstash/conf.d/**/*.conf
path.logs: /var/log/logstash
2.docker run -d --restart=always --net elk --privileged=true --log-driver json-file --log-opt max-size=100m --log-opt max-file=2 -p 5044:5044 --name logstash -v /var/lib/docker/volumes/logstash_conf/_data/logstash.yml:/usr/share/logstash/config/logstash.yml -v /var/lib/docker/volumes/logstash_conf/_data/conf.d/:/usr/share/logstash/conf.d/ logstash:7.7.0
注意:如果容器内出现permission denied,创建容器时添加–privileged,宿主机对需要权限的目录运行
chmod -R 777 目录/
3.收集beat采集的日志
添加conf.d/beat/beat.conf:
input {
beats {
#指定监听端口
port => 5044
codec => "json"
}
}
filter{
mutate{
remove_field => ["agent","esc","tags"]
}
}
output {
if [fields][appname] == "nginx_access" {
elasticsearch {
hosts => ["elasticsearch:9200"]
index => "nginx_log_%{+YYYY.MM.dd}"
document_type => "nginx_log"
}
}
if [fields][appname] == "mysql" {
elasticsearch {
hosts => ["elasticsearch:9200"]
index => "mysql_log_%{+YYYY.MM.dd}"
document_type => "mysql_log"
}
}
stdout { codec => rubydebug }
}
4.采集csv
添加conf.d/csv/csv.conf
input {
file {
#只能绝对路径
path => "/usr/share/logstash/conf.d/csv/movies.csv"
start_position => "beginning"
#记录上次读取的位置,如果需要从头读,要删掉
sincedb_path => "db_path.log"
}
}
filter {
csv {
separator => ","
columns => ["id","content","genre"]
}
mutate {
split => { "genre" => "|" }
remove_field => ["path", "host","@timestamp","message"]
}
mutate {
split => ["content", "("]
add_field => { "title" => "%{[content][0]}"}
add_field => { "year" => "%{[content][1]}"}
}
mutate {
convert => {
"year" => "integer"
}
strip => ["title"]
remove_field => ["path", "host","@timestamp","message","content"]
}
}
output {
elasticsearch {
hosts => ["elasticsearch:9200"]
index => "movies"
document_id => "%{id}"
document_type => "csv"
}
stdout {}
}
5.采集mysql数据
mysql驱动放到/usr/share/logstash/logstash-core/lib/jars目录下
input {
jdbc {
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://192.168.31.229:3306/manage?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&allowMultiQueries=true"
jdbc_user => "root"
jdbc_password => "root"
#启⽤追踪,如果为true,则需要指定tracking_column
use_column_value => true
#指定追踪的字段,
tracking_column => id
#追踪字段的类型,⽬前只有数字(numeric)和时间类型(timestamp),默认是数字类型
tracking_column_type => "numeric"
#记录最后⼀次运⾏的结果
record_last_run => true
#上⾯运⾏结果的保存位置
last_run_metadata_path => "mysql-position.txt"
statement => "SELECT * FROM sys_oper_log where oper_id > :sql_last_value"
schedule => "* * * * * *"
}
}
output {
elasticsearch {
hosts => ["elasticsearch:9200"]
# 索引名
index => "sys_oper_log"
# 需要关联的数据库中有有一个id字段,对应索引的id号
document_id => "%{oper_id}"
document_type => "sys_oper_log"
}
stdout{
codec => rubydebug
}
}
自动处理:放到loagstash.yml指定的文件目录下
手动处理:进入bin/目录,运行./logstash --debug -f 配置文件目录
写入事件所用的索引。可以动态的使用%{foo}语法,它的默认值是:
“logstash-%{+YYYY.MM.dd}”,以天为单位分割的索引,使你可以很容易的删除老的数据或者搜索指定时间范围内的数据。
索引不能包含大写字母。推荐使用以周为索引的ISO 8601格式,例如logstash-%{+xxxx.ww}
filebeat:
1.数据卷
添加filebeat.docker.yml
#日志输入配置
filebeat.inputs:
#一个配置文件里面可以同时收集多个日志
- type: log #指定input类型,有log、stdin、redis、tcp、syslog等
enabled: true
paths:
#需要收集的日志所在的位置,可使用通配符进行配置
- /nginx_logs/*.log
json.keys_under_root: true
json.overwrite_keys: true
fields:
appname: nginx_access # 附加的可选字段,以向output添加额外的信息。output里面可以使用这个变量
#日志输出配置(采用 logstash 收集日志,5044为logstash端口)
output.logstash:
hosts: ['logstash:5044']
2.docker run --restart=always --log-driver json-file --log-opt max-size=100m --log-opt max-file=2 --name filebeat --net elk --user=root -d -v /usr/local/nginx/logs/:/nginx_logs/ -v /var/lib/docker/volumes/filebeat_conf/_data/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml store/elastic/filebeat:7.7.0
docker run --restart=always --name filebeat_mysql --net elk -v /var/lib/docker/volumes/2790f3ed8359526c06bab4f4ad07b6f6257318869f1a1bb8ead61e5b258f25a8/_data/:/logs/ -idt store/elastic/filebeat:7.7.0
filter{
mutate{
remove_field => ["agent","esc","tags"]
}
grok{
match => {"id"=> "%{WORD:date} %{NUMBER:num} Query %{WORD:Query}"}
}
geoip{
source => "remote_addr"
}
}
#日志输入配置
filebeat.inputs:
- type: log
enabled: true
paths:
#需要收集的日志所在的位置,可使用通配符进行配置
- /mysql_logs/*.log
#json.keys_under_root: true
#json.overwrite_keys: true
fields:
appname: mysql_binlog
#日志输出配置(采用 logstash 收集日志,5044为logstash端口)
output.logstash:
hosts: ['logstash:5044']
docker run --restart=always --log-driver json-file --log-opt max-size=100m --log-opt max-file=2 --name filebeat_mysql --net elk --user=root -d -v /var/lib/docker/volumes/9fbd77d53f34e50d55bdd3828adbd0a498929e97bf1bb408b66e0b365843af4c/_data/:/mysql_logs/ -v /var/lib/docker/volumes/filebeat_mysql_conf/_data/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml store/elastic/filebeat:7.7.0
3.filebeat自带一些常用应用的模块,位于modules.d目录,带disabled后缀的表示不可使用,去掉就表示或使用。使用模块的情况下,数据是直接传递给elasticsearch。
MetricBeat:
docker run --restart=always -d --name metricbeat --net elk --user=root -v /var/run/docker.sock:/var/run/docker.sock elastic/metricbeat:7.7.0
#修改配置,添加 Elasticsearch 和 Kibana 的主机
vi metricbeat.yml
metricbeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
processors:
- add_cloud_metadata: ~
- add_docker_metadata: ~
output.elasticsearch:
hosts: 'elasticsearch:9200'
username: 'elastic'
password: 'xxx'
setup.kibana:
host: "kibana:5601"
启用 docker采集模块
metricbeat modules enable docker
编辑 docker采集配置
vi modules.d/docker.yml
- module: docker
metricsets:
- container
- cpu
- diskio
- event
- healthcheck
- info
- memory
- network
period: 10s
hosts: ["unix:///var/run/docker.sock"]
设置 Metricbeat 创建 Kibana上的 Index Pattern 和 Dashboard
metricbeat setup
重启 Metricbeat 生效配置
docker restart metricbeat