2011-04-14 5 views
16

He intentado configurar log4r con rieles 3.0.4 sobre la base de este artículo: http://www.dansketcher.com/2007/06/16/integrating-log4r-and-ruby-on-rails/¿Cómo se configura Log4r con Rails 3.0.x?

/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' 

He buscado en Google para una integración Rails 3, pero no han encontrado una solución de trabajo. ¿Alguien puede indicarme un fragmento de código que funcione y que permita la configuración del registro mediante un archivo YAML y la inicialización en tiempo de ejecución?

Como referencia, puse el ejemplo logger.rb en la carpeta config/initializers y log4r.yml en el directorio config.

Gracias

+0

¿Por qué querrías hacer esto? – jvatic

+1

Para permitir el registro de aplicaciones personalizable con marcas de tiempo, rotación del archivo de registro basado en el tiempo, separación del registro del nivel de contexto. Estas son algunas de mis características deseadas. – user553620

+2

Resolví la excepción: en Rails 3, el valor de Rails.root no es un objeto de cadena. Al cambiar la definición de variable a Rails.root.to_s, se corrigió el error anterior. Espero que esto ayude a alguien. – user553620

Respuesta

31

Jeje ... La idea de Log4r proviene de la famosa "Log4J", que es mi registrador favorito en mi vida de programación Java. Sin embargo, el documento de log4r es realmente pobre, y es realmente difícil para los novatos. Permítanme mostrar mi solución:

Paso1. crear el archivo de configuración log4r: (nombre de archivo: 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 

paso 2. modificar 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 

step3. agrega esta línea a tu Gemfile.

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

(si está utilizando rieles 4+, todavía es Paso 4: añadir este archivo a la carpeta config/inicializadores

# config/initializers/log4r_patch_for_rails4.rb 
class Log4r::Logger 
    def formatter() 
    end 
end  

)

Está hecho. Ahora "cd" en su Rieles carpeta de la aplicación, ejecute "paquete" para instalar log4r, luego "carriles s", encontrará los archivos de registro en "/ log" carpeta como esta:

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

y el registro contenido es (mi formato favorito):

$ 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 

mi entorno:

  1. OS: Funcionamiento cygwin en XP
  2. rubí 1.8.7 (2011-02-18 Patchlevel 334) [i386-mingw32]
  3. rieles: 3.0.5
  4. joya: 1.6.0

Cualquier pregunta por favor hágamelo saber ~ :-)

se refieren a: https://stackoverflow.com/a/20154414/445908

+3

En su configuración, Rails no anula el valor de configuración "file" del outputter - el argumento es "filename" :) Por defecto es el nombre del archivo/comando que inició el proceso. Tenga en cuenta que cualquier nombre de archivo personalizado que especifique __must__ tiene una extensión de archivo, ¡o no incluirá la fecha en el nombre del archivo! – Nevir

+0

@ Nevir: gracias por tu comentario! –

+0

En log4j arena, una de mis funciones favoritas de log4j era cargar la configuración dinámicamente (http://logging.apache.org/log4j/2.x/manual/configuration.html). ¿Conoces prácticas similares? –

4

para imitar el comportamiento de los carriles de tala (tala en el entorno dependend archivos de registro) utilizo el siguiente 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 
1

¿Alguien me puede indicar un fragmento de código que funcione que permita la configuración de registro usando un archivo YAML, y la inicialización en tiempo de ejecución?

Escribí un detailed blogpost about how to set up log4r de una manera que reemplaza al registrador de rieles estándar. Además, entré en detalle sobre cómo usar múltiples registradores, usar niveles de registro y cómo registrar Mongoid, ActiveRecord y Exceptions (incluidos los Stack Traces) usando Log4r.

Se sugirió otra gema aparentemente más madura llamada "Logging" en los comentarios en el HackerNews thread correspondiente al artículo, por lo que las personas interesadas en Log4r también querrían consultar esta gema.

Cuestiones relacionadas