2017-08-14 81 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仍然会打开文件。不知何故,这似乎总是发生在你真正希望监视工作的事件中。使用对数旋转的东西通常是一个好主意。

相关问题