2017-08-14 49 views
1

我正在嘗試爲riemann設置多個日誌記錄流。我決定使用簡單的Clojure文件寫入功能來設置其他流。但是,只要riemann被重新加載,文件就會被寫入,但是當調用相關事件並且需要寫入文件時會導致空指針異常。嘗試使用riemann寫入文件時出現空指針異常

(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

riemann config包含一個Ciejure表達式,當riemann啓動時運行。運行這個expsreassion的結果,即評估它返回的結果,然後用於處理所有事件。黎曼的配置文件是一個函數,它返回一個可以完成實際工作的函數。 (在這裏插入yo'dog memes)

在這種情況下,當riemann加載最後一個表達式時,當它準備運行時,它會打開文件,寫入文件,關閉它。那麼它將採用關閉它的結果並將其視爲處理事件的函數。

關閉文件的結果爲空,因此它稍後會嘗試將「null」作爲函數和NPE結果「運行」。

您可能想要一個圍繞let的smap,或者只是刪除close,因爲您希望riemann在整個運行過程中保持該文件打開。取決於你打算爲你做什麼,可能會考慮讓上面的smap調用成爲let中的最後一個表達式。


下面這行純粹是我的意見,而不是答案的一部分:

你幾乎肯定要使用正確的記錄,事情記錄的東西到磁盤黎曼主機上。這些主機往往運行很長時間不間斷(我傾向於讓他們幾年),如果你有它寫入一個文件,該文件將最終遇到物理(完整磁盤,大小限制等),然後如果你ssh和刪除它,沒有空間將被釋放,因爲riemann仍然會打開文件。不知何故,這似乎總是發生在你真正希望監視工作的事件中。使用對數旋轉的東西通常是一個好主意。

相關問題