无法登录到 clojure 中的 fluentd

failed to log to fluentd in clojure

为了在javaAPI中log到fluentd,我们首先需要创建一个hashmap,然后将其转换为map,然后将map传递给log函数,如:

Map<String, String> data = new HashMap<String, String>();
        data.put("from", "userA");
        data.put("to", "userB");
        LOG.log("follow", data);

在 clojure 中,我创建了一个 hashmap 并将其传递给 log 函数(但我无法将 hashmap 转换为 map,也许 clojure 会自动为我完成),但它失败了,如下所示。

fluentd 的日志是

2015-05-02 20:52:18 +0800 [warn]: unexpected error error="Could not parse data entirely (0 != 49)"
  2015-05-02 20:52:18 +0800 [warn]: suppressed same stacktrace

clojure 错误是

   clojurewerkz.testcom.core=> (def log (org.fluentd.logger.FluentLogger/getLogger "app" "s1" 8888))
    #'clojurewerkz.testcom.core/log
    clojurewerkz.testcom.core=> (def x (java.util.HashMap. {"a" "testa"}))
    #'clojurewerkz.testcom.core/x
    clojurewerkz.testcom.core=> (.log log "test" x)
    true
    clojurewerkz.testcom.core=> (.log log "test" x)
    416694 [nREPL-worker-3] ERROR org.fluentd.logger.sender.RawSocketSender  - org.fluentd.logger.sender.RawSocketSender
    java.net.SocketException: Broken pipe
        at java.net.SocketOutputStream.socketWrite0(Native Method)
        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
        at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
        at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
        at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
        at org.fluentd.logger.sender.RawSocketSender.flush(RawSocketSender.java:184)
        at org.fluentd.logger.sender.RawSocketSender.send(RawSocketSender.java:172)
        at org.fluentd.logger.sender.RawSocketSender.emit(RawSocketSender.java:142)
        at org.fluentd.logger.sender.RawSocketSender.emit(RawSocketSender.java:124)
        at org.fluentd.logger.sender.RawSocketSender.emit(RawSocketSender.java:119)
        at org.fluentd.logger.FluentLogger.log(FluentLogger.java:100)
        at org.fluentd.logger.FluentLogger.log(FluentLogger.java:85)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:483)
        at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:93)
        at clojure.lang.Reflector.invokeInstanceMethod(Reflector.java:28)
        at clojurewerkz.testcom.core$eval3467.invoke(form-init3780157560314675153.clj:1)
        at clojure.lang.Compiler.eval(Compiler.java:6703)
        at clojure.lang.Compiler.eval(Compiler.java:6666)
        at clojure.core$eval.invoke(core.clj:2927)
        at clojure.main$repl$read_eval_print__6625$fn__6628.invoke(main.clj:239)
        at clojure.main$repl$read_eval_print__6625.invoke(main.clj:239)
        at clojure.main$repl$fn__6634.invoke(main.clj:257)
        at clojure.main$repl.doInvoke(main.clj:257)
        at clojure.lang.RestFn.invoke(RestFn.java:1523)
        at clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__599.invoke(interruptible_eval.clj:67)
        at clojure.lang.AFn.applyToHelper(AFn.java:152)
        at clojure.lang.AFn.applyTo(AFn.java:144)
        at clojure.core$apply.invoke(core.clj:624)
        at clojure.core$with_bindings_STAR_.doInvoke(core.clj:1862)
        at clojure.lang.RestFn.invoke(RestFn.java:425)
        at clojure.tools.nrepl.middleware.interruptible_eval$evaluate.invoke(interruptible_eval.clj:51)
        at clojure.tools.nrepl.middleware.interruptible_eval$interruptible_eval$fn__641$fn__644.invoke(interruptible_eval.clj:183)
        at clojure.tools.nrepl.middleware.interruptible_eval$run_next$fn__634.invoke(interruptible_eval.clj:152)
        at clojure.lang.AFn.run(AFn.java:22)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
    true

我猜你的 fluentd 配置有问题。您可能正在将转发类型的输入发送到流利服务器的 http 源。您的 fluentd.conf 中是否有以下配置?

<source>
  @type http

  port 8888
</source>

如果是这样,您必须将 http 替换为 forward 才能使用 fluent-logger-java.

发送日志
<source>
  @type forward

  port 8888
</source>