首先之前记录了如何部署安装sebp/elk,在启动后这些应用扮演的角色和功能,以及详细每个工具的应用我们在这里进行介绍。
Logstash,分布式日志收集。可以将所有分布式应用的日志进行回收采集。
一、对于上一篇结尾
sebp/elk,对于Logstash的配置文件在etc/logstash/conf.d/下,它会整合所有的配置文件然后启动。
默认的input方式是filebeat,我们修改配置文件02-beats-input.conf
vim 02-beats-input.conf
input {
tcp {
port => 5044
codec => json_lines
}
}
//这样就可以一个app一个日志
filter{
mutate{
lowercase=>["springAppName"] 转为小写 索引不能有大写
}
}
output{
elasticsearch {
hosts => ["192.168.12.122:9200"]
//action => "index" //action=>”index” #es要执行的动作 index, delete, create, update
index => "%{springApName}"
}
}
之后重启容器即可。
之后按照之前说的,将POM引入
<!--引入logback,elk日志的依赖 -->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.1</version>
</dependency>
在resource目录下编写logback.xml,见上篇文章
Codecs
codecs 是基于数据流的过滤器,它可以作为input,output的一部分配置。Codecs可以帮助你轻松的分割发送过来已经被序列化的数据。流行的codecs包括 json,msgpack,plain(text)。
json:使用json格式对数据进行编码/解码
multiline:将汇多个事件中数据汇总为一个单一的行。比如:java异常信息和堆栈信息
二、配置文件
logstash pipeline包含2个必须元素:input和output 和一个可选的filter。也就是配置文件的编写规则、
logstash input可以从 stdin屏幕输入、file文件中、syslog通过网络将系统日志消息、beats、kafka、jdbc等读取日志
logstash output可以 输出到 屏幕、file文件中、kafka、elasticseach 在es中存储日志
这些都是input和output的很多插件
input{
file{
path => "/var/log/nginx/access.log" //文件路径,允许模糊/var/log/**/*.log
start_position => "beginning" //选择开始读取文件的位置
type => "nginx_access_log" //通用选项,激活过滤器
}
syslog{
port =>"514"
type => "syslog"
}
beats {
port => 5044 #要监听的端口
}
kafka{
bootstrap_servers=> "kafka01:9092,kafka02:9092,kafka03:9092" //用于建立群集初始连接的Kafka实例的URL列表
topics => ["access_log"] //要订阅的主题列表,kafka topics
group_id => "logstash-file" //消费者所属组的标识符
codec => "json"
}
kafka{
bootstrap_servers=> "kafka01:9092,kafka02:9092,kafka03:9092"
topics => ["weixin_log","user_log"]
codec => "json"
}
redis {
codec => json
host => "192.168.2.246"
port => 56379
key => "data-mgr"
data_type => "list"
}
}
output{ //输出配置
stdout{
codec => "rubydebug"
}
file {
path => "/data/logstash/%{host}/{application}
codec => line { format => "%{message}"} }
}
kafka{
bootstrap_servers => "localhost:9092"
topic_id => "test_topic" #必需的设置。生成消息的主题
}
elasticsearch {
hosts => "192.168.12.122:9200"
index => "share-log-%{+YYYY.MM.dd}"
}
}
filter过滤
用的是grok插件,它可以匹配一切数据,只是举个栗子 要结合实际来编写
filter {
#定义数据的格式
grok {
match => { "message" => "%{DATA:timestamp}\|%{IP:serverIp}\|%{IP:clientIp}\|%{DATA:logSource}\|%{DATA:userId}\|%{DATA:reqUrl}\|%{DATA:reqUri}\|%{DATA:refer}\|%{DATA:device}\|%{DATA:textDuring}\|%{DATA:duringTime:int}\|\|"}
}
#定义时间戳的格式
date {
match => [ "timestamp", "yyyy-MM-dd-HH:mm:ss" ]
locale => "cn"
}
#定义客户端的IP是哪个字段(上面定义的数据格式)
geoip {
source => "clientIp"
}
}
三、实战
一个java应用,将log4j日志远程发送到logstash
引入pom
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
配置log4j
#输出日志到logstash
log4j.appender.logstash=org.apache.log4j.net.SocketAppender
log4j.appender.logstash.RemoteHost=192.168.12.122
log4j.appender.logstash.port=4560
log4j.appender.logstash.ReconnectionDelay=60000
log4j.appender.logstash.LocationInfo=true
logstasg配置
input {
log4j {
host => "192.168.12.122"
port => 4560
}
}
output {
stdout {
codec => rubydebug
}
elasticsearch{
hosts => ["192.168.12.122:9200"]
index => "log4j-%{+YYYY.MM.dd}"
document_type => "log4j_type"
}
}