joppotjoppotコピペで絶対動く。この記事はだいぶ古くなってしまったので、新しく書き直しました。こちらの方を参照した方が多分良いことが書いてあります。https://joppot.info/2017/03/17/3521みなさんこんにちはcandleです。logをfluentdから取得する方法を行ってみたいと思います。fluentdはapacheのaccessログをとるフォーマットは予め作成されています。railsのログとなると、自分で正規表現を用いたフォーマットを作る必要がでてくるわけです。fluentdの正規表現は癖があり未だによく分かっておらず、難しいものです。railsで開発をしている人ならgemを探すわけです。act-fluent-loggerというのがその中でも一番railsログを取得する方法としては無難なのですが、問題がありました。それはFatalの情報を取れない問題です。logを取得する方法を紹介します。前提railsのテスト用のウェブサービスが1つある。railsが自由に動かせるのが前提になります。出来てない人はscaffoldなどで簡単なウェブサービスを作っておいてください。railsを動かすマシーンにfluentdがインストールされている事が前提になります。人は下の記事を参考にしてください。railsを動かします。webrickの環境でも問題ありません。railsのログフォーマットを変更するrailsのログのフォーマットはデフォルトで下のような感じになっていると思います。fomatterを有効にします。railsプロジェクトの中のconfigフォルダの中にdevelopment.rbとtest.rb、production.rbがあります。今動いているrailsの環境にあったファイルを開きます。私はproductionモードで動かしているのでproduction.rbを開きます。webrickを使っている普通のモードならdevelopment.rbを開いてください。したら、下の2行を追加します。Logger::Formatter.newこの記述を書いたら、railsサーバを再起動しましょう。restartもう一度railsプロジェクトのlog/production.logかlog/development.logを見ると、下のようにログフォーマットが変更されています。これで、fluentdがrailsログを取得できそうですが、幾つか問題があります。1つは先頭の「I,」という所、これはログレベルの頭文字を表しているのですが、その横に同じように「INFO」と書いてあります。同じ情報は2つもいらないので、この「I,」の部分は削除します。2つ目は自分もよく知らないのですが、#が付いたプロセスIDです。fluentd上では#はコメントアウトを表しており、この記号は使えません(自分がしらないだけで実は使えるのかもしれない)。#は取り除いておきます。3つ目はメッセージの部分の区切りがないことです。(7.7ms)」は先頭に空白があったりして、もしかすると正規表現を書いたさいに漏れる可能性があります。そこで明示的にシングルクォーテーションで囲みそこをメッセージとみなすことにします。このやり方は私が試行錯誤した上での方法でもしかするとよりより方法があるかもしれません。formatの関数をオーバーライドして書き換えます。railsプロジェクトのconfig/environment.rbを開きます。下のコードを記入しましょう。endend始めのif文でmsgがnilクラスでないか判定します。nilの場合はその後のpresent?関数でエラーがでてしまうので、先にnilが来たら弾くようにします。msg.gsubで改行コードを削除します。これをやるかというと、Fatalエラーの様に複数行のログを吐き出す場合fluentdは1行毎ログと判断してしまうからです。本当はfatalエラーのメッセージにもかかわらず、改行が入ってしうまうと別のログとして判断されてしまいます。そこで\nを無くすことでそれを回避します。=以下でfluentdからみて取りやすいフォーマットに変更しています。一度、railsサーバを再起動してlog/development.logかlog/production.logを見ましょう。下のようになっていれば成功です。fatalのところを見ても分かるように、\nが削除されて1行になっていますね。logの設定は完了しました。logを取得するにあたり、予め用意するものがあります。それを先に準備しておきましょう。fluent-plugin-rewriteをインストールするfluent-plugin-rewriteをインストールします。下のコマンドでインストールしましょう。fluent-plugin-rewritefluentdのログを保存するフォルダを作るもしも、fluentdのログを保存する場所がまだ作成されていない場合は下のコマンドでfluentdのログを保存する場所を作成しておきましょう。/var/log/fluent/準備ができました。次にfluentdの設定を行います。logを取得するフォーマットがまだ用意されていないので独自に作る必要があります。fluent.confが作成されてない場合は下のコマンドで作成しておきましょう。./fluent.confに下の内容を貼り付けましょう。gzip</match>pathでrailsプロジェクトのlogフォルダにあるproduction.logないしdevelopment.logを参照します。参照先のパスは各自のものにしてください。logのフォーマットに合わせています。railsのログをrails.logというタグを付けてrewriteになげます。rewriteでは\nが万が一ある場合は削除して、\”はシングルクォーテーションに変更します。/var/log/fluent/にrails_logというファイルを生成してそこにログを保存します。ファイルの分割は1日単位で行っています。logを取得する為の設定です。logが取得できるか試してみましょう。railsを動かします。restart次にfluentdを起動します。本番環境では恐らくfluentdが自動起動に成っていると思いますが、今回はfluentdを手動で起動します。/etc/fluent/fluent.confそしたら、サーバにアクセスしてみましょう。railsのログがfluentdで取得出来ているか確認します。/var/log/fluent/に移動して、rails_log.20982みたいなのがあるか確認します。中身をみると、取得できています。まとめfluentdはまだrailsのログを取るフォーマットを公式には出していませんが、apacheのerror_logのフォーマットを公式が出したようにその内、でるかもしれませんそれまではこれを使えると便利でしょう。スポンサードリンク「為になったなぁ」と思ったら、シェアお願いします。コメントをキャンセルメールアドレスが公開されることはありません。みなさんこんにちはcandleです。今回はReactで許可したhtmlタグだけを表示し、それ以外のタグは削除するプログラムを書いてみます。みなさんこんにちはcandleです。editorを導入したいと思います。squireはオープンソースの便利なwysiwygエディタです。皆さんこんにちはcandleです。今回はfabricで分割したpythonファイルを読み込んでみましょう。みなさんこんにちはcandleです。今回はrakeコマンドのややこしいところを扱います。みなさんこんにちはcandleです。今回はbasscssのv8でかなりデフォルトのスタイルから削除されてしまったスタイルをインポートします。Sansフォントウェイトのcss書き方まとめプロフィールベンチャー企業のCTOをやってます。大学時代にプログラミングを始め、javaから入門し、C++へて、PHPへと進み、会社ではRailsを使用。環境設定スポンサードリンクjoppotコピペで絶対動く。