2012-01-16 3 views
4

私は、複数のアプリケーションノードに分散しているWebサービスへの要求と応答を記録するログシステムを構築しています。私はMongoDBをリポジトリとして使用し、x個のリクエストの後にリアルタイムで、またはより現実的にDBにログをダンプすることを考えていました。このアプリケーションはかなり大量に設計されており、Perlで構築されています。誰もこれをやっている経験がありますか?推薦?それとも、これはノーですか?MongoDBのログ

答えて

1

これは、2つのアプリケーションサーバーで実行されるWebアプリケーションでこれを実行しました。 mongodbへの書き込みはデフォルトでは非ブロック化されています(javaドライバはあなたの要求をただちに返し、私はそれがperlと同じだと仮定しますが、より良い点を確認します)。ユーザーがログを記録するのを待つ必要があります。

いくつかの失敗シナリオでは、いくつかのログが失われる可能性があるという欠点があります(たとえば、mongoがデータを取得する前にアプリケーションが失敗する)。

+0

グレート。リアルタイムのログ記録を行っていますか?どのように負荷が集中しているのですか? – MadHacker

3

多くの企業がMongoDBを使ってログを保存しているのを見てきました。そのスキーマ・フリーネスは、スキーマが時々変更される傾向があるアプリケーション・ログにとっては本当に柔軟性があります。また、そのCapped Collection機能は、古いデータを自動的にパージして、データをメモリに収めるため、非常に便利です。

人は通常のグループ化またはMapReduceでログを集計しますが、それほど高速ではありません。特にMongoDBのMapReduceは単一のスレッド内でしか動作せず、JavaScriptの実行オーバーヘッドは膨大です。 New aggregation frameworkはこの問題を解決する可能性があります。

もう1つ懸念事項は、書き込みスルーが高いことです。 MongoDBの挿入はデフォルトでfire-and-forgetスタイルですが、多くのinsertコマンドを呼び出すと書き込みロックの競合が大きくなります。これは、アプリケーションのパフォーマンスに影響を与え、読者が格納されたログを集約/フィルタするのを防ぎます。

,Logstash、またはFlumeのようなログコレクタフレームワークを使用している可能性があります。これらのデーモンはすべてのアプリケーションノードで起動され、appプロセスからログを取得します。

fluentd plus mongodb

彼らは、ログをバッファリングし、非同期書き込みをバッチで行うので、それはアプリケーションから直接書くよりも多くの方が効率的ださMongoDBの/ PostgreSQLの/などのような他のシステムにデータを書き出します。このリンクでは、PerlプログラムからFluentdにログを出力する方法について説明します。アプリのいくつかの興味深いアイデアを

0

お持ちでない場合は、私がGraylog2をチェックアウトをお勧めします。彼らはMongoDBとElasticsearchの組み合わせをかなり効果的に使います。強力な検索エンジンをミックスに追加すると、興味深いクエリと分析オプションが得られます。

参考資料として、ログ処理ツールとテクニック専用のElasticsearch pageがあります。

処理前にログエントリをキューに入れる予定がある場合は(これが私の推奨する)Kestrelをメッセージキューオプションとして推奨します。これはGaug.esが使用しているもので、最近私はそれをペースで入れています。 Javaアプリケーションです。これは非常に高速で素早く、便利にMemcacheプロトコルを話します。これは、水平方向に拡大するのに最適な方法です。メモリキャッシュは、速度と耐久性のバランスを考慮して、ジャーナルファイルにバックアップされます。

2

私はLog::Dispatch::MongoDBでいくつかのアプリケーションでそれを使用しています。魅力のように動作します!

# Declaration 
use Log::Dispatch; 
use Log::Dispatch::MongoDB; 
use Log::Dispatch::Screen; 
use Moose; 

has log => (is => 'ro', isa => 'Log::Dispatch', default => sub { Log::Dispatch->new }, lazy => 1) 

... 

# Configuration 
$self->log->add(
    Log::Dispatch::Screen->new(
     min_level => 'debug', 
     name  => 'screen', 
     newline  => 1, 
    ) 
); 
$self->log->add(
    Log::Dispatch::MongoDB->new(
     collection => MongoDB::Connection->new(
      host => $self->config->mongodb 
     )->saveme->log, 
     min_level => 'debug', 
     name  => 'crawler', 
    ) 
); 

... 

# The logging facility 
$self->log->log(
    level => 'info', 
    message => 'Crawler finished', 
    info => { 
     origin => $self->origin, 
     country => $self->country, 
     counter => $self->counter, 
     start => $self->start, 
     finish => time, 
    } 
); 

そして、ここcapped collectionからサンプルレコードです:

{ 
    "_id" : ObjectId("50c453421329307e4f000007"), 
    "info" : { 
      "country" : "sa", 
      "finish" : NumberLong(1355043650), 
      "origin" : "onedayonly_sa", 
      "counter" : NumberLong(2), 
      "start" : NumberLong(1355043646) 
    }, 
    "level" : "info", 
    "name" : "crawler", 
    "message" : "Crawler finished" 
} 
関連する問題