尝试使用riemann写入文件时出现空指针异常

时间:2017-08-14 09:45:36

标签: clojure nullpointerexception riemann

我正在尝试为riemann设置多个日志记录流。我决定使用简单的Clojure文件写入功能来设置其他流。但是,只要重新加载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)
                )

1 个答案:

答案 0 :(得分:1)

riemann配置包含一个在riemann启动时运行的Clojure表达式。运行此expsreassion的结果,即评估它返回的内容,然后用于处理所有事件。 Riemann的配置文件是一个函数,它返回一个能完成实际工作的函数。 (在这里插入哟'狗模因)

在这种情况下,当riemann加载最后表达它时,当它准备好运行时,它将打开文件,写入它,关闭它。然后它将采取关闭它的结果并将其视为处理事件的函数。

关闭文件的结果为null,因此稍后会尝试"运行" null作为函数和NPE结果。

你可能希望在let周围有一个smap,或者只是删除关闭,因为你希望riemann在整个运行过程中保持这个文件打开。根据你的目标你可能会考虑将上面的smap调用作为let中的最后一个表达式。

低于这条线纯粹是我的意见,而不是答案的一部分:

你几乎肯定想要使用正确的日志记录来将东西记录到riemann主机上的磁盘上。这些主机往往会不间断地运行很长时间(我倾向于让它们保留几年),如果你把它写入一个文件,那么该文件最终会遇到物理(完整磁盘,大小限制等)然后如果你ssh并删除它,没有空间将被释放,因为riemann仍然会打开文件。这种情况似乎总是发生在某些事件中,你真的宁愿监控工作。使用具有对数旋转的东西通常是个好主意。