TWSNMPのログ監視機能で悩む
TWSNMPが受信できるsyslogには、たくさんの情報があり、うまく活用すれば、SNMPなどによるの情報収集よりも効果的な監視ができる。怖いことに、最近のネットワーク機器(ファイヤウォールなど)のログには、誰がどんなサイトにアクセスしているか、誰が無断でwifiを利用しているかというような情報が記録されている。これらの情報もうまく取り出して監視できるようにしたい。これまで、いくつかのログ分析のためのソフトを試してきた。一番有名なのは、
はじめて試した時は、ある意味衝撃的だった。多くのログから必要情報を魔法のように取り出して思いのままに集計、ビジュアライズできる。そう思った人が多いから使う人が増えたのだろう。でも、普通に使うには、値段が高い。
最近 使っているのが、
これは、splunkのユーザーだった人がsplunkが高いので自分で同じようなソフトを作ったらしい。それも、GO言語で!実際に使っていると高速で扱いやすいsplunkというイメージ。もちろん、splunkの特徴であるパイプライン検索もできる。splunkは、一日500MBまで無料版で使えるが、Gravwellは、一日2GBまで無料で使える。商用版もデータ量による課金ではない。
ただ、どちらも、プロ用のツールという感じで、使いこなすには、かなりハードルが高い。
TWSNMPにもこのような高度なログ検索に対応すべきか? 結構悩んだ。
技術的な話としては、
と
を組み合わせることで、実現できると思った。grokでログの中から必要な項目を抽出して、ottoによってJavaScriptで判断するような作りでよいはず。
組み合わせのは、こんな感じ
package main
import (
"fmt"
"github.com/robertkrimen/otto"
"github.com/vjeantet/grok"
)
func main() {
vm := otto.New()
g, _ := grok.NewWithConfig(&grok.Config{NamedCapturesOnly: true})
values, err := g.Parse("%{COMMONAPACHELOG}", `127.0.0.1 - - [23/Apr/2014:22:58:32 +0200] "GET /index.php HTTP/1.1" 404 207`)
if err != nil {
panic(err)
}
for k, v := range values {
vm.Set(k, v)
fmt.Printf("%s=%s\n", k, v)
}
value, err := vm.Run("response < 400")
if err != nil {
}
v, _ := value.ToBoolean()
fmt.Printf("v=%v\n", v)
}
これは、
127.0.0.1 - - [23/Apr/2014:22:58:32 +0200] "GET /index.php HTTP/1.1" 404 207
のようなWEBサーバーログから応答コード(response)を取り出して、400以下の正常応答か判断するためにJavaScriptの
response < 400
というもの。この方法を見つけた時、抽出や判定の設定をユーザーが自由にできるような汎用的な仕組みができると夢が膨らんで、何日か、そのことで、考えがいっぱいになった。
でも、今放送中の朝ドラ「スカーレット」の「自由は、不自由だ!」を思い出して、ユーザーが自由にできるような作りをやめた。TWSNMPの復刻版を作ることを考えた時の原点に戻って、ユーザーが、そんなに思い悩まなくても、それなりに、いい感じに監視してくれるソフトにしようと思う。ただ、内部的には、grokとottoは組み込んでいる。
つづく
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。