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

Null pointer exception when trying to write to file using 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)
                )

riemann 配置包含一个 Clojure 表达式,当 riemann 启动时它是 运行。 运行 这个表达式的结果,也就是评估它 returns 的结果,然后用于处理所有事件。黎曼的配置文件是一个函数,returns 一个将完成实际工作的函数。 (在这里插入 yo'dog 模因)

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

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

您可能需要 let 周围的 smap,或者只是删除关闭,因为您希望 riemann 在整个 运行s 期间保持此文件打开。根据您的目标,您可以考虑将上面对 smap 的调用作为 let 中的最后一个表达式。


下面这行纯粹是我的意见,不属于答案的一部分:

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