カテゴリー別アーカイブ: ruby

acts-as-taggable-onとact-fluent-logger-railsの組み合わせで発生する問題


Railsを使っていて結構謎な現象が起きた。
fluentdでRailsのログをS3に設置しようとしていたのだけれど、本番環境のログがうまくfluentdで処理されなかった?

現象の詳細

act-fluent-logger-railsの内部の join で `incompatible character encodings: UTF-8 and ASCII-8BIT (Encoding::CompatibilityError)` が発生する。

発生条件

  1. acts-as-taggable-on ( v3.4.3 )
    act-fluent-logger-rails ( v0.1.5 )
    を使っていること。
  2. `config/fluent-logger.yml`の`messages_type`が`string`である
  3. `config.log_level`が`debug`である
  4. 上記を満たしている時に、`acts-as-taggable-on`で日本語の含まれているタグを扱うと発生する

原因

acts-as-taggable-onのnamedメソッド内部で、ascii-8bitとして扱うような記述があるため、クエリログがascii-8bitとなってしまっていた。この場合に日本語などのマルチバイト文字を含んでいると、`join`などの文字列処理で例外が発生してしまう。

対策

act-fluent-logger-railsへ渡すログの文字列を強制的にUTF8にする