2017-11-16 3 views
0

、と私はラクダのログEIPを使用します。このルートの目的は、後のログアグリゲータによってピックアップされたボディーをJSONとログに記録するタイプマップのソースをマーシャリングすることですキャメルが小数点ではなくASCIIテキストを記録する方法を教えてください。私のラクダのルートの一つで

from("direct:someSourceWithBodyOfTypeMap") 
    .marshal().json(JsonLibrary.Jackson) 
    .to("direct:logHandler"); 


// on a separate route builder 
from("direct:logForFilebeat") 
    .convertBodyTo(String.class, "UTF-8") 
    .log(LoggingLevel.INFO, "jsonLogger","${body}"); 

。私はロギングにログバックを使用しています。 logback-spring.xmlの部分は次のようになります。通常の流れで

<appender name="JSON_TX" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
     <file>${BASE_LOG_PATH}/json.log</file> 
     <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
     <fileNamePattern>${BASE_LOG_PATH}/json.%d{yyyy-MM-dd}.%i.log</fileNamePattern> 
     <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> 
      <maxFileSize>100MB</maxFileSize> 
     </timeBasedFileNamingAndTriggeringPolicy> 
     </rollingPolicy> 
     <encoder> 
     <charset>UTF-8</charset> 
     <pattern>%msg%n</pattern> 
     </encoder> 
    </appender> 
    <appender name="ASYNC_JSON_TX" class="ch.qos.logback.classic.AsyncAppender"> 
     <appender-ref ref="JSON_TX" /> 
    </appender> 
    <logger name="jsonLogger" level="INFO"> 
     <appender-ref ref="ASYNC_FILEBEAT_TX" /> 
    </logger> 

、それが適切のようなJSON文字列として記録されます:

{"id":2456,"name":"foo","gender":"MALE"} 

それをログに記録されることをインスタンスがありますよう:

123 34 105 100 34 58 50 52 53 54 44 34 110 97 109 101 34 58 34 102 111 111 34 44 34 103 101 110 100 101 114 34 58 34 77 65 76 69 34 125 

これは、ログがシャットダウンのためにトリガされた経路と、スプリング・ブートアップによって処理されているメッセージがあるときに生成される小数。 (私はソースルートの前にプロセッサにブレークポイントを置いてから、「someSourceWithBodyOfTypeMap」にメッセージがルーティングされている間にspring-boot appをシャットダウンすることで、これをローカルに複製することができました)

追加するものログファイルは10進数ではないASCIIテキスト形式でなければなりませんか?そして、最初にログが10進数で表示される原因は何ですか?

答えて

1

メッセージボディがバイトストリームとしてマーシャリングされているため、小数点以下は小数点以下です。 marshalの後ろに.convertBodyTo(String)を追加するか、${bodyAs(String)}で文字列に変換するように指定することで、最初にメッセージ本文を文字列に変換できます。

+0

実際には、ログを呼び出す前に.convertBodyTo(String.class、 "UTF-8")を使ってテストしましたが、その時のロガーは別のルートビルダーにあります。私は前述のデバッギングを使用してjson文字列をローカルで生成することができましたが、データ量の多いプロダクションでは破綻しました。私は '$ {bodyAs(String)}'で試してみます – geneqew

+0

ストリーミングと空のボディの問題については、このFAQを参照してください。http://camel.apache.org/why-is-my-message-body-empty .html –

関連する問題