2017-07-18 8 views
0

私はRails 5を使用しており、カスタムRailsロガーを作成する必要があります。私はこのロギング呼び出しを持つようにしたいコントローラのいくつかの場所で例えばカスタムRailsロガーの作成

:私のログ・ファイル内の

Rails.logger.info('Event happened', 
    { event_id: '...', email: '...', ...} 
) 

、後者私はこのような何かを見たい:

{ 
    "level": "info", 
    "ts": 1507972311.8043, 
    "caller": "controller/api/v2/news.rb:101", 
    "msg": "Event happened", 
    "app": "My App", 
    "env": "production", 
    "context": { 
    "event_id": "1234567", 
    "email": "[email protected]", 
    "first_name": "John", 
    "last_name": "Doe" 
    } 
} 

ですこれは可能ですか?どのようにすべてのログレベル(情報/デバッグ/エラー)同時にこれを行うには?

+0

Rails.logger. instance_variable_get(:@logger). instance_variable_get(:@log). formatter = proc do |severity, datetime, progname, msg| DO WHATEVER YOU WANT HERE end 
。 logger.debug {"人物属性ハッシュ:#{@@ person.attributes.inspect}"} –

答えて

1

は、ラッパーを所有して作成します。

class LocalLogger 

    def self.log(*args) 
    new.log(*args) 
    end 

    def logger 
    Rails.logger 
    end 
    delegate :info, :debug, :warn, :error, to: :logger 

    def log(level: :info, payload) 
    send(level, payload.inspect) 
    end 
end 

LocalLogger.log level: :warn, {foo: bar} 

は、あなたが望むように動作するlog方法を変更します。

しかし、これで賢明ではない誘惑を避けてください - デフォルトのロガーの動作はかなり良く、他のほとんどの開発者が期待するように動作します。

0

最善の解決策は、あなた自身のLogger#formatterを宣言するために、次のようになります。

あなたはこのようなものを使用することができます
+0

Rails.loggerの実装が変更されてもこれは壊れませんか? – Kris

+0

@Kris明らかにそうです。 Railsに依存すると、Railsの実装が変更されたときにすべてが壊れる可能性があります。 「Rails.logger」さえも存在しなくなるかもしれません。 – mudasobwa

+0

パブリックAPIを使用した場合、同じメジャーバージョンでは破損しません。だから私は 'SimpleDelegator'を使ってRails.loggerをラップして行くつもりです。 – Kris

関連する問題