1

我正在尝试为 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)
                )
4

1 回答 1

1

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

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

关闭文件的结果为 null,因此稍后它将尝试将该 null 作为函数“运行”并产生 NPE。

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


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

您几乎肯定想使用适当的日志记录东西将内容记录到 riemann 主机上的磁盘。这些主机往往会长时间不间断地运行(我倾向于让它们离开几年),如果你让它写入单个文件,该文件最终会遇到物理问题(完整磁盘、大小限制等),然后如果你ssh 并删除它,不会释放任何空间,因为 riemann 仍然会打开文件。不知何故,这似乎总是在您真正希望监控工作的某些事件中发生。使用带有对数旋转的东西通常是一个好主意。

于 2017-08-14T19:04:39.953 回答