Как настроить Log4r с Rails 3.0.x?

Я попытался настроить log4r с Rails 3.0.4 на основе этой статьи: 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.

Спасибо


person user553620    schedule 14.04.2011    source источник
comment
Почему вы хотите это сделать?   -  person jvatic    schedule 16.04.2011
comment
Чтобы разрешить настраиваемое ведение журнала приложений с отметками времени, ротацию файлов журнала по времени, разделение журнала на уровне контекста. Это некоторые из моих желаемых функций.   -  person user553620    schedule 20.04.2011
comment
Я разрешил исключение - в Rails 3 значение Rails.root не является строковым объектом. Изменение определения переменной на Rails.root.to_s устранило указанную выше ошибку. Надеюсь, это поможет кому-то.   -  person user553620    schedule 20.04.2011


Ответы (3)


Хе-хе ... Идея Log4r исходит от известного Log4j, который является моим любимым регистратором в моей жизни программирования Java. Однако документация 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), остается шаг 4: добавьте этот файл в папку 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, запустите пакет для установки 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. ОС: cygwin работает в XP
  2. ruby 1.8.7 (уровень исправления 334 18 февраля 2011 г.) [i386-mingw32]
  3. рельсы: 3.0.5
  4. драгоценный камень: 1.6.0

Любой вопрос, пожалуйста, дайте мне знать~ :-)

см.: https://stackoverflow.com/a/20154414/445908 и rails6 log4r tagged_logging.rb:22:in `call': неправильное количество аргументов

person Siwei    schedule 11.05.2011
comment
В вашей конфигурации Rails не переопределяет значение конфигурации файла средства вывода - аргументом является имя файла :) По умолчанию используется имя файла/команды, запустившей процесс. Обратите внимание, что любое пользовательское имя файла, которое вы указываете, должно иметь расширение файла, иначе дата не будет вставляться в имя файла! - person Nevir; 25.08.2011
comment
В области log4j одной из моих любимых функций log4j была динамическая загрузка конфигурации (logging.apache.org/log4j/2.x/manual/configuration.html). Знаете ли вы о подобных практиках? - person Raymond Kroeker; 14.05.2014
comment
извините, у меня нет соответствующего опыта по этому поводу. - person Siwei; 15.05.2014
comment
Где вы указали, что имя лог-файла будет меняться ежедневно? - person vish4071; 22.05.2017

Чтобы имитировать поведение журналов 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
person fpauser    schedule 06.09.2012

Может ли кто-нибудь указать мне рабочий фрагмент кода, который позволит настроить журнал с использованием файла YAML и инициализировать во время выполнения?

Я написал подробный пост в блоге о том, как настроить log4r таким образом, чтобы он заменил стандартный рельсовый регистратор. Кроме того, я подробно рассказал о том, как использовать несколько регистраторов, использовать уровни журналов, а также как регистрировать Mongoid, ActiveRecord и исключения (включая трассировки стека) с помощью Log4r.

В комментариях к Logging. /news.ycombinator.com/item?id=6237419" rel="nofollow">тема HackerNews, соответствующая статье, так что люди, интересующиеся Log4r, могут захотеть проверить и эту жемчужину.

person mmlac    schedule 15.10.2013