2017-08-14 20 views
1

リーマンの複数のログストリームを設定しようとしています。私は単純なClojureファイル書き込み関数を使って追加のストリームを設定することに決めました。ただし、ファイルはリーマンがリロードされるとすぐに書き込まれますが、関連するイベントが呼び出され、ファイルを書き込む必要があるときにnullポインタ例外が発生します。リーマンを使用してファイルに書き込もうとするときにNULLポインタ例外が発生する

(where (and (or (tagged "source1") (host "shubham")) 
        (not (= (:installation_id event) "default"))) 

       (smap (fn [event] (prepare-influx-event event {:time-unit :nanoseconds})) 
        influx 
        ) 

       (let [wrtr (io/writer "/var/log/riemann/test.txt" :append true)] 
        (.write wrtr "Listen please1\n") 
        (.close wrtr)) 
       ;;(spit "/var/log/riemann/test.txt" "Listen please2\n" :append true) 
       ) 
+0

「/ var/log」に書き込む権限がないことがあります。例外のスタックトレースを追加できますか? –

答えて

0

リーマンconfigがリーマンの起動時に実行されるClojureの表現が含まれています。このexpsreassionを実行した結果、つまり戻り値を評価することは、すべてのイベントを処理するために使用されます。 Riemannの設定ファイルは実際の作業を行う関数を返す関数です。この場合、リーマンはその最後の式をロードすると、実行準備が整っている間にファイルを開いて書き込みを終了します。それを閉じて、イベントを処理する関数として扱います。

ファイルをクローズした結果がnullであるため、後でそのヌルを関数として実行してNPEを実行しようとします。

あなたはたぶんletの周りにスマップが必要な場合や、リーマンが実行するたびにこのファイルを開いたままにしておきたい場合は、単にcloseを削除してください。あなたがあなたのために行っていることは、上記のsmapの呼び出しをletの中の最後の式にすることを検討するかもしれません。この線より下の


純粋に私の意見ではなく、答えの一部です:

あなたはほぼ確実リーマンホスト上のディスクにコンテンツを記録するために、適切なロギングのものを使用します。これらのホストは、中断されずに長時間実行される傾向があります(私はそれらを数年残す傾向があります)。そして、あなたが1つのファイルに書き込むと、そのファイルは最終的に物理ディスク(フルディスク、サイズ制限など) sshを実行して削除すると、リーマンはまだファイルを開いているので、空き領域は解放されません。これはどういうわけか、実際には監視がうまくいっているいくつかのイベント中にいつも起こるようです。一般的には、ログローテーションのものを使うのは良い考えです。

関連する問題