16

この記事に基づいて、Rails3.0.4でlog4rを構成してみました:http ://www.dansketcher.com/2007/06/16/integrating-log4r-and-ruby-on-rails/

/Users/toto/.rvm/gems/ruby-1.9.2-p0/gems/log4r-1.1.9/lib/log4r/yamlconfigurator.rb:166:in `sub!': can't convert Pathname into String (TypeError)
    from /Users/toto/.rvm/gems/ruby-1.9.2-p0/gems/log4r-1.1.9/lib/log4r/yamlconfigurator.rb:166:in `block in paramsub'
    from /Users/toto/.rvm/gems/ruby-1.9.2-p0/gems/log4r-1.1.9/lib/log4r/yamlconfigurator.rb:165:in `each'
    from /Users/toto/.rvm/gems/ruby-1.9.2-p0/gems/log4r-1.1.9/lib/log4r/yamlconfigurator.rb:165:in `paramsub'
    from /Users/toto/.rvm/gems/ruby-1.9.2-p0/gems/log4r-1.1.9/lib/log4r/yamlconfigurator.rb:156:in `block in decode_hash_params'

Rails 3の統合をグーグルで検索しましたが、実用的な解決策が見つかりませんでした。YAMLファイルを使用したログ構成と実行時の初期化を可能にする実用的なコードスニペットを誰かに教えてもらえますか?

参考までに、サンプルlogger.rbをconfig / initializersフォルダーに配置し、log4r.ymlをconfigディレクトリに配置しました。

ありがとう

4

3 に答える 3

31

Hehe ... Log4rのアイデアは、Javaプログラミングの人生で私のお気に入りのロガーである有名な「Log4j」から来ています。ただし、log4rのドキュメントは非常に貧弱で、初心者にとっては非常に困難です。私の解決策を示しましょう:

ステップ1。log4r構成ファイルを作成します:(ファイル名:config / log4r.yml)

log4r_config:
  # define all loggers ...
  loggers:
    - name      : production
      level     : WARN
      trace     : 'false'
      outputters :
      - datefile
    - name      : development
      level     : DEBUG
      trace     : 'true'
      outputters :
      - datefile

  # define all outputters (incl. formatters)
  outputters:
  - type: DateFileOutputter
    name: datefile
    dirname: "log"
    # notice the file extension is needed! 
    # if you want the file is named by the process, just comment it,
    # then it will automatically get the same name with its process,
    # e.g.  rails_2017-05-03.log
    filename: "my_app.log" 
    formatter:
      date_pattern: '%H:%M:%S'
      pattern     : '%d %l: %m '
      type        : PatternFormatter

ステップ2。config/application.rbを変更します

require 'rails/all'
# add these line for log4r
require 'log4r'
require 'log4r/yamlconfigurator'
require 'log4r/outputter/datefileoutputter'
include Log4r

Bundler.require(:default, Rails.env) if defined?(Bundler)
module Zurich
  class Application < Rails::Application
    #...
    # assign log4r's logger as rails' logger.
    log4r_config= YAML.load_file(File.join(File.dirname(__FILE__),"log4r.yml"))
    YamlConfigurator.decode_yaml( log4r_config['log4r_config'] )
    config.logger = Log4r::Logger[Rails.env]
  end
end

ステップ3。この行をGemfileに追加します。

# which is the latest version and support "datefileoutputter"
gem 'log4r', '1.1.9'  

(Rails 4以降(Rails6を含む)を使用している場合でも、step4があります。このファイルをconfig/initializersフォルダーに追加します。

# config/initializers/log4r_patch_for_rails4.rb
class Log4r::Logger
  def formatter()       # for rails4+
    Proc.new{|severity, time, progname, msg|
      formatted_severity = sprintf("%-5s",severity.to_s)
      formatted_time = time.strftime("%Y-%m-%d %H:%M:%S")
      "[#{formatted_severity} #{formatted_time} #{$$}]\n #{msg}\n"
    }

  end
  def formatter= temp   # for rails6+
  end
end  

)。

終わった。次に、Railsアプリケーションフォルダーに「cd」し、「bundle」を実行してlog4rをインストールし、次に「rails s」を実行すると、次のように「/log」フォルダーにログファイルがあります。

May  9 17:05 rails_2011-05-09.log
May 10 13:42 rails_2011-05-10.log

ログの内容は(私のお気に入りの形式)です:

$ tail log/rails_2011-05-10.log
Started GET "/????_settings/19/edit" for 127.0.0.1 at ...
13:42:11 INFO:   Processing by ????SettingsController ...
13:42:11 INFO:   Parameters: {"id"=>"19"}
13:42:12 DEBUG:   ????Setting Load (0.0ms)  SELECT "d ...
13:42:12 INFO: Completed 200 OK in 750ms

私の環境:

  1. OS:XPで実行されているcygwin
  2. ルビー1.8.7(2011-02-18パッチレベル334)[i386-mingw32]
  3. レール:3.0.5
  4. 宝石:1.6.0

ご不明な点がございましたらお知らせください〜:-)

参照:https ://stackoverflow.com/a/20154414/445908 、およびrails6 log4r tags_logging.rb:22:in `call':引数の数が間違っています

于 2011-05-11T03:49:19.080 に答える
4

Railsのログ動作(環境依存のログファイルへのログイン)を模倣するには、次のlog4r.ymlを使用します。

log4r_config:
  # define all loggers ...
  loggers:
  - name      : production
    level     : WARN
    trace     : 'false'
    outputters :
    - datefile_production
  - name      : development
    level     : DEBUG
    trace     : 'true'
    outputters :
    - datefile_development
  - name      : test
    level     : DEBUG
    trace     : 'true'
    outputters :
    - datefile_test

  # define all outputters (incl. formatters)
  outputters:
  - type: DateFileOutputter
    name: datefile_production
    dirname: "log"
    filename: "production.log"
    formatter:
      date_pattern: '%H:%M:%S'
      pattern     : '%d %l: %m '
      type        : PatternFormatter
  - type: DateFileOutputter
    name: datefile_development
    dirname: "log"
    filename: "development.log"
    formatter:
      date_pattern: '%H:%M:%S'
      pattern     : '%d %l: %m '
      type        : PatternFormatter
  - type: DateFileOutputter
    name: datefile_test
    dirname: "log"
    filename: "test.log"
    formatter:
      date_pattern: '%H:%M:%S'
      pattern     : '%d %l: %m '
      type        : PatternFormatter
于 2012-09-06T08:32:18.800 に答える
1

YAMLファイルを使用したログ構成と実行時の初期化を可能にする実用的なコードスニペットを誰かに教えてもらえますか?

標準のRailsロガーを置き換える方法でlog4rを設定する方法についての詳細なブログ投稿を書きました。さらに、複数のロガーの使用方法、ログレベルの使用方法、およびLog4rを使用してMongoid、ActiveRecord、および例外(スタックトレースを含む)をログに記録する方法について詳しく説明しました。

この記事に対応するHackerNewsスレッドのコメントで、 「 Logging 」と呼ばれるもう1つの明らかに成熟したgemが提案されたため、Log4rに関心のある人はこのgemも確認することをお勧めします。

于 2013-10-15T02:49:04.527 に答える