logstash的更多實用功能

1、合併日誌
php的錯誤日誌中常常會出現這樣的日誌

[03-Jun-2013 13:15:29] PHP Fatal error:  Uncaught exception 'Leb_Exception' in /data1/www/bbs.xman.com/htdocs/framework/xbox/ufo.php:68
Stack trace:
#0 /data/www/bbs.xman.com/htdocs/framework/dao/abstract.php(299): Leb_Dao_Pdo->connect(Array, 'read')
#1 /data/www/bbs.xman.com/htdocs/framework/dao/pdo.php(108): Leb_Dao_Abstract->initConnect(false)
#2 /data/www/bbs.xman.com/htdocs/framework/dao/abstract.php(1123): Leb_Dao_Pdo->query('SELECT * FROM `...')
#3 /data/www/bbs.xman.com/htdocs/framework/dao/abstract.php(1217): Leb_Dao_Abstract->select(Array)
#4 /data/www/bbs.xman.com/htdocs/framework/model.php(735): Leb_Dao_Abstract->daoSelect(Array, false)
#5 /data/www/bbs.xman.com/htdocs/app/configure/model/configure.php(40): Leb_Model->find()
#6 /data/www/bbs.xman.com/htdocs/app/search/default.php(131): Configure->get_configure_by_type('news')
#7 /data/www/bbs.xman.com/htdocs/framework/dispatcher.php(291): defaultController->indexAction()
#8 /data/www/bbs.xman.com/htdocs/framework/dispatcher.php(222): Leb_Di in /data1/www/bbs.xman.com/htdocs/framework/dao/pdo.php on line 68

 這個時候 logstash一般會只記錄上面一行,所以這類的日誌就看不全了。怎麼辦呢?logstash提供了一個功能解決了這個問題就是"multiline"
這個filter的功能顧名思義就是對多行的日誌進行處理 這個是官網上的說明
multiline filter
This filter will collapse multiline messages into a single event.
The multiline filter is for combining multiple events from a single source into the same event.

下面看下格式

filter {
  multiline {
    type => "type"   #類型,不多說
    pattern => "pattern, a regexp" #參數,也可以認爲是字符,有點像grep ,如果符合什麼字符就交給下面的 what 去處理
    negate => boolean
    what => "previous" or "next" #這個是符合上面 pattern 的要求後具體怎麼處理,處理方法有兩種,合併到上面一條日誌或者下面的日誌
  }
}

The 'negate' can be "true" or "false" (defaults false). If true, a message not matching the pattern will constitute a match of the multiline filter and the what will be applied. (vice-versa is also true)
這個 negate 有兩種 true 或者 false,默認是 true,如果選了false 的話估計就是取反的意思。
看看例子

filter {
  multiline {
    pattern => "^[^\[]"
    what => "previous"
  }
  }

這個例子是針對我上面的php日誌寫的,意思就是 如果不是以 "["開頭的日誌 都跟上一個日誌合併在一起。以此類推遇到其他的多行日誌也可以按照這個方法來做合併。


2、logstash 根據@message內容來觸發命令"exec"
 我當初的想法是這樣的,如果php日誌文件中出現 "PHP Fatal error"的時候將相關的錯誤日誌發給相關開發的負責人。一開始想到了 output 的 email 功能,但我嘗試
了很多次這個email功能不太穩定,有時候能發出來郵件有的時候卻發不出來。不知道是郵件服務器的問題還是 logstash本身的問題,具體配置如下


output {
email {
   match => [ "@message", "aaaaa" ]
   to => "[email protected]"
   from => "[email protected]"
   options => [ "smtpIporHost", "smtp.mibnet.com",
                "port", "25",
                "userName", "[email protected]",
                "starttls", "true",
                "password", "opmonitor",
                "authenticationType", "login"
              ]
   subject => "123"
   body => '123'
   via => smtp
}
}

後來換了方法,改用 grep+exec來做,具體思路就是 grep 過濾到了 PHP Fatal error 之後根據域名將郵件發給具體人員,格式如下

filter {
  grep {
    match => [ "@message", "PHP Fatal error" ]
    drop  => false
    add_tag => [fatal_error]
       }
                                                  
       grep {
       tags => [fatal_error]
       match => [ "@message", ".*(xbox\.com|xbox\.mib\.com\.cn|supports\.game\.mib\.com\.cn)" ]
       drop  => false
       add_tag => [xboxerror]
            }
         }
output {
  exec {
    tags => [xboxerror]
    command => "echo '%{@timestamp} %{@source}: %{@message}' | mail -s xbox_phplog_error_message [email protected]"
        }
}

如此這般 先定義一個grep tag 爲fatal_error 先把帶有 PHP Fatal error 的日誌過濾出來,後面的 grep承接上面的 tag fatal_error 過濾出具體的域名之後再新建一個
tag 叫 xboxerror,最後的output 調用 exec(執行) 去調用一個命令,將時間,源和錯誤信息發到[email protected] 這個郵箱裏。
OK 現在就能做到快速的郵件報警了。

3、替換
上面做到了郵件實時提醒,但有的時候我發現並沒有發出去郵件,查找原因後發現如果郵件內容中出現很多 單引號 " ' " 的話,mail命令就會報錯沒法發送。
於是就找到了mutate 這個功能,下面是介紹
The mutate filter allows you to do general mutations to fields. You can rename, remove, replace, and modify fields in your events.
好吧,我現在需要把@message裏面的 ' 都給替換成" 這樣就能正常發郵件了,什麼你說開發換了個符號會看不懂?我#¥%……&*((&……%¥%
格式如下:

mutate {
    type => "phplog"
    gsub => [ "@message","'", "\"" ]
}

好了,有了這些功能模塊logstash可以工作的比較開心了~~~ 希望你們也開心

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章