Logstash筆記(二)----input插件

     在"hello World" 示例中,我們已經見到并介紹了Logstash 的運行流程和配置的基礎語法。 請記住一個原則:Logstash 配置一定要有一個 input 和一個 output。在演示過程中,如果沒有寫明 input,默認就會使用 "hello world" 里我們已經演示過的 input/stdin ,同理,沒有寫明的 output 就是 output/stdout

目前創(chuàng)新互聯公司已為數千家的企業(yè)提供了網站建設、域名、虛擬空間、成都網站托管、企業(yè)網站設計、上林網站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

    如果有什么問題的話,請查看該文檔:http://udn.yyuap.com/doc/logstash-best-practice-cn/input/index.html。以下是input插件的具體解釋:

(1),標準輸入。type和tags是logstash事件中特殊的字段。 type 用來標記事件類型—— 我們肯定是提前能知道這個事件屬于什么類型的。而 tags 則是在數據處理過程中,由具體的插件來添加或者刪除的

[root@localhost test]# vim stdin.conf 
input {
    stdin {
        add_field => {"key" => "value"}
        codec => "plain"
        tags => ["add"]
        type => "std-lqb"
    }
}
output {
     stdout {
                        codec => rubydebug
                }
}
[root@localhost logstash]# /usr/local/logstash/bin/logstash -f test/stdin.conf 
Settings: Default pipeline workers: 1
Logstash startup completed
hello world
{
       "message" => "hello world",
      "@version" => "1",
    "@timestamp" => "2017-05-24T08:11:45.852Z",
          "type" => "std-lqb",
           "key" => "value",
          "tags" => [
        [0] "add"
    ],
          "host" => "localhost.localdomain"
}
abclqb
{
       "message" => "abclqb",
      "@version" => "1",
    "@timestamp" => "2017-05-24T08:13:21.192Z",
          "type" => "std-lqb",
           "key" => "value",
          "tags" => [
        [0] "add"
    ],
          "host" => "localhost.localdomain"
}
#####對stdin進行修改,添加tags列
[root@localhost test]# vim stdin.conf 

input {
    stdin {
        add_field => {"key" => "value2222222222222222222222222222222222222222222
2"}
        codec => "plain"
        tags => ["add","xxyy","abc"]
        type => "std-lqb"
    }
}

output {
     stdout {
                        codec => rubydebug
                }
}
[root@localhost logstash]# /usr/local/logstash/bin/logstash -f test/stdin.conf 
Settings: Default pipeline workers: 1
Logstash startup completed
hello world
{
       "message" => "hello world",
      "@version" => "1",
    "@timestamp" => "2017-05-24T09:07:43.228Z",
          "type" => "std-lqb",
           "key" => "value22222222222222222222222222222222222222222222",
          "tags" => [
        [0] "add",
        [1] "xxyy",
        [2] "abc"
    ],
          "host" => "localhost.localdomain"
}


#########根據tags來進行判斷:
[root@localhost test]# vim stdin_2.conf 

input {
  stdin {
  add_field =>{"key11"=>"value22"}
  codec=>"plain"
  tags=>["add","xxyy"]
  type=>"std"
 }
}

output {
if "tttt" in [tags]{
 stdout {
  codec=>rubydebug{}
   }
}
 else if "add" in [tags]{
 stdout {
  codec=>json
   }
}

}

[root@localhost logstash]# /usr/local/logstash/bin/logstash -f test/stdin_2.con
f 
Settings: Default pipeline workers: 1
Logstash startup completed
yyxxx
{"message":"yyxxx","@version":"1","@timestamp":"2017-05-24T09:32:25.840Z","type":"std","key11":"value22","tags":["add","xxyy"],"host":"localhost.localdomain"}
{"message":"","@version":"1","@timestamp":"2017-05-24T09:32:32.480Z","type":"std","key11":"value22","tags":["add","xxyy"],"host":"localhost.localdomain"}xxyy
{"message":"xxyy","@version":"1","@timestamp":"2017-05-24T09:32:42.249Z","type":"std","key11":"value22","tags":["add","xxyy"],"host":"localhost.localdomain"}

(2).讀取文件。Logstash 使用一個名叫 FileWatch 的 Ruby Gem 庫來監(jiān)聽文件變化。這個庫支持 glob 展開文件路徑,而且會記錄一個叫 .sincedb 的數據庫文件來跟蹤被監(jiān)聽的日志文件的當前讀取位置。所以,不要擔心 logstash 會漏過你的數據.

[root@localhost test]# cat  log.conf
input {  
  file {  
   path =>"/usr/local/nginx/logs/access.log"
   type=>"system"  
  start_position =>"beginning"  
}  
}  
  
output {  
        stdout {  
                        codec => rubydebug  
                }   
}

[root@localhost logstash]# /usr/local/logstash/bin/logstash -f test/log.conf 
Settings: Default pipeline workers: 1
Logstash startup completed
{
       "message" => "192.168.181.231 - - [24/May/2017:15:04:29 +0800] \"GET / HTTP/1.1\" 502 537 \"-\" \"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36\" \"-\"",
      "@version" => "1",
    "@timestamp" => "2017-05-24T09:39:16.600Z",
          "path" => "/usr/local/nginx/logs/access.log",
          "host" => "localhost.localdomain",
          "type" => "system"
}
{
       "message" => "192.168.181.231 - - [24/May/2017:15:04:32 +0800] \"GET / HTTP/1.1\" 502 537 \"-\" \"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36\" \"-\"",
      "@version" => "1",
    "@timestamp" => "2017-05-24T09:39:16.614Z",
          "path" => "/usr/local/nginx/logs/access.log",
          "host" => "localhost.localdomain",
          "type" => "system"
}

解釋:

有一些比較有用的配置項,可以用來指定 FileWatch 庫的行為:

  • discover_interval

logstash 每隔多久去檢查一次被監(jiān)聽的 path 下是否有新文件。默認值是 15 秒。

  • exclude

不想被監(jiān)聽的文件可以排除出去,這里跟 path 一樣支持 glob 展開。

  • sincedb_path

如果你不想用默認的 $HOME/.sincedb(Windows 平臺上在 C:\Windows\System32\config\systemprofile\.sincedb),可以通過這個配置定義 sincedb 文件到其他位置。

  • sincedb_write_interval

logstash 每隔多久寫一次 sincedb 文件,默認是 15 秒。

  • stat_interval

logstash 每隔多久檢查一次被監(jiān)聽文件狀態(tài)(是否有更新),默認是 1 秒。

  • start_position

logstash 從什么位置開始讀取文件數據,默認是結束位置,也就是說 logstash 進程會以類似 tail -F 的形式運行。如果你是要導入原有數據,把這個設定改成 "beginning",logstash 進程就從頭開始讀取,有點類似 cat,但是讀到最后一行不會終止,而是繼續(xù)變成 tail -F

注意

  1. 通常你要導入原有數據進 Elasticsearch 的話,你還需要 filter/date 插件來修改默認的"@timestamp" 字段值。稍后會學習這方面的知識。

  2. FileWatch 只支持文件的絕對路徑,而且會不自動遞歸目錄。所以有需要的話,請用數組方式都寫明具體哪些文件。

  3. LogStash::Inputs::File 只是在進程運行的注冊階段初始化一個 FileWatch 對象。所以它不能支持類似 fluentd 那樣的 path => "/path/to/%{+yyyy/MM/dd/hh}.log" 寫法。達到相同目的,你只能寫成 path => "/path/to/*/*/*/*.log"。

  4. start_position 僅在該文件從未被監(jiān)聽過的時候起作用。如果 sincedb 文件中已經有這個文件的 inode 記錄了,那么 logstash 依然會從記錄過的 pos 開始讀取數據。所以重復測試的時候每回需要刪除 sincedb 文件。

  5. 因為 windows 平臺上沒有 inode 的概念,Logstash 某些版本在 windows 平臺上監(jiān)聽文件不是很靠譜。windows 平臺上,推薦考慮使用 nxlog 作為收集端

(3).TCP輸入。未來你可能會用 redis 服務器或者其他的消息隊列系統(tǒng)來作為 logstash broker 的角色。不過 Logstash 其實也有自己的 TCP/UDP 插件,在臨時任務的時候,也算能用,尤其是測試環(huán)境。

[root@localhost test]# cat tcp.conf 
input {  
 tcp {  
   port =>8888  
   mode=>"server"  
  ssl_enable =>false  
 }  
}  
  
output {  
        stdout {  
                        codec => rubydebug  
                }  
}
[root@localhost logstash]# /usr/local/logstash/bin/logstash -f test/tcp.conf 
Settings: Default pipeline workers: 1
Logstash startup completed
{
       "message" => "GET /jenkins/ HTTP/1.1\r",
      "@version" => "1",
    "@timestamp" => "2017-05-24T10:09:53.980Z",
          "host" => "192.168.181.231",
          "port" => 59426
}
{
       "message" => "Host: 192.168.180.9:8888\r",
      "@version" => "1",
    "@timestamp" => "2017-05-24T10:09:54.175Z",
          "host" => "192.168.181.231",
          "port" => 59426
}
{
       "message" => "Connection: keep-alive\r",
      "@version" => "1",
    "@timestamp" => "2017-05-24T10:09:54.180Z",
          "host" => "192.168.181.231",
          "port" => 59426
}

備注:先關閉8888端口的應用,再開啟,會輸出如下日志。

(4)編碼插件Codec:

    Codec 是 logstash 從 1.3.0 版開始新引入的概念(Codec 來自 Coder/decoder 兩個單詞的首字母縮寫)。在此之前,logstash 只支持純文本形式輸入,然后以過濾器處理它。但現在,我們可以在輸入 期處理不同類型的數據,這全是因為有了 codec 設置。我們在第一個“Hello world”列子中已經用過Codec編碼了,rubydebug就是一種Codec雖然它一般只會在stdout插件中,作為配置測試或者調試的工具。

 

 (4.1)采用JSON編碼,直接輸入預定義好的 JSON 數據,這樣就可以省略掉 filter/grok 配置!

配置實例以nginx為例,具體步驟如下:

a,編輯配置nginx配置文件nginx.conf。把原先的配置文件注釋掉,換成json的格式,然后重啟下你的nginx

[root@localhost test]# vim  /usr/local/nginx/conf/nginx.conf
user  ftp;
worker_processes  2;
worker_rlimit_nofile 65535;
events {
    use epoll;
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    include       proxy.conf;
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    #
log_format json '{"@timestamp":"$time_iso8601",'
               '"@version":"1",'
               '"host":"$server_addr",'
               '"client":"$remote_addr",'
               '"size":$body_bytes_sent,'
               '"responsetime":$request_time,'                
               '"domain":"$host",'                            
               '"url":"$uri",'                                
               '"status":"$status"}';                         
    access_log  logs/nginx_access.log  json;                  
#    access_log  logs/access.log  main;  

####################注意:在$request_time和$body_bytes_sent 變量兩頭沒有雙引號"" ,這兩個數據在JSON
里應該是數值類型。

b,編輯下你的logstash配置文件json.conf

[root@localhost test]# vim json.conf 
input {
  file {
        path => "/usr/local/nginx/logs/nginx_access.log"
        type => "nginx"
        start_position => "beginning"
        add_field => { "key"=>"value"}
        codec => "json"
  }
  }
output {
stdout{
        codec => rubydebug{ }
}
}

c,logstash加載啟動測試:

[root@localhost logstash]# /usr/local/logstash/bin/logstash -f test/json.conf 
Settings: Default pipeline workers: 1
Logstash startup completed
{
      "@timestamp" => "2017-05-25T03:26:19.000Z",
        "@version" => "1",
            "host" => "192.168.180.9",
          "client" => "192.168.181.231",
            "size" => 8250,
    "responsetime" => 0.157,
          "domain" => "192.168.180.9",
             "url" => "/",
          "status" => "200",
            "path" => "/usr/local/nginx/logs/nginx_access.log",
            "type" => "nginx",
             "key" => "value"
}
{
      "@timestamp" => "2017-05-25T03:26:19.000Z",
        "@version" => "1",
            "host" => "192.168.180.9",
          "client" => "192.168.181.231",
            "size" => 450,
    "responsetime" => 0.017,
          "domain" => "192.168.180.9",
             "url" => "/sc.do",
          "status" => "200",
            "path" => "/usr/local/nginx/logs/nginx_access.log",
            "type" => "nginx",
             "key" => "value"
}
{
      "@timestamp" => "2017-05-25T03:26:19.000Z",
        "@version" => "1",
            "host" => "192.168.180.9",
          "client" => "192.168.181.231",
            "size" => 16,
    "responsetime" => 0.083,
          "domain" => "192.168.180.9",
             "url" => "/logger/catch.do",
          "status" => "200",
            "path" => "/usr/local/nginx/logs/nginx_access.log",
            "type" => "nginx",
             "key" => "value"
}
{
      "@timestamp" => "2017-05-25T03:26:19.000Z",
        "@version" => "1",
            "host" => "192.168.180.9",
          "client" => "192.168.181.231",
            "size" => 41153,
    "responsetime" => 0.362,
          "domain" => "192.168.180.9",
             "url" => "/getPageData.do",
          "status" => "200",
            "path" => "/usr/local/nginx/logs/nginx_access.log",
            "type" => "nginx",
             "key" => "value"
}
{
      "@timestamp" => "2017-05-25T03:26:20.000Z",
        "@version" => "1",
            "host" => "192.168.180.9",
          "client" => "192.168.181.231",
            "size" => 51042,
    "responsetime" => 0.565,
          "domain" => "192.168.180.9",
             "url" => "/getPageData.do",
          "status" => "200",
            "path" => "/usr/local/nginx/logs/nginx_access.log",
            "type" => "nginx",
             "key" => "value"

(4.2)合并多行數據(Multiline):有些時候,應用程序調試日志會包含非常豐富的內容,為一個事件打印出很多行內容。這種日志通常都很難通過命令行解析的方式做分析。 logstash 正為此準備好了 codec/multiline 插件。multiline 插件也可以用于其他類似的堆棧式信息,比如 linux 的內核日志。

當啟動logstash及配置文件時會讓你輸入一連串的字符,知道輸入[ 時才終止當前輸入,如下:

[

root@localhost test]# vim multiline.conf
input {
    stdin {
        codec => multiline {
                pattern => "^\["
                negate => true
                what => "previous"
                }
         }
}
output {
        stdout {
                codec => rubydebug{ }
        }
}
[root@localhost logstash]# /usr/local/logstash/bin/logstash -f test/multiline.c
onf 
Settings: Default pipeline workers: 1
Logstash startup completed
hello
hello world
how are you 
abc2345
[
{
    "@timestamp" => "2017-05-25T03:44:35.604Z",
       "message" => "[\nhello\nhello world\nhow are you \nabc2345",
      "@version" => "1",
          "tags" => [
        [0] "multiline"
    ],
          "host" => "localhost.localdomain"
}

總之,這個插件的原理很簡單,就是把當前行的數據添加到前面一行后面,直到新進的當前行匹配 "["  正則為止。這個正則還可以用 grok 表達式。

當前文章:Logstash筆記(二)----input插件
標題鏈接:http://muchs.cn/article14/jcjdde.html

成都網站建設公司_創(chuàng)新互聯,為您提供搜索引擎優(yōu)化、全網營銷推廣、手機網站建設、企業(yè)建站、小程序開發(fā)網站設計

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

h5響應式網站建設