首先之前记录了如何部署安装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"
    }
}