¿Cómo registrar algo en Rails en un archivo de registro independiente?


En rails quiero registrar alguna información en un archivo de registro diferente y no en el desarrollo estándar.registro o producción.registro. Quiero hacer este registro desde una clase modelo.

Author: akshat, 2008-12-03

9 answers

Puede crear un objeto Logger usted mismo desde el interior de cualquier modelo. Simplemente pase el nombre del archivo al constructor y use el objeto como los Rails habituales logger:

class User < ActiveRecord::Base
  def my_logger
    @@my_logger ||= Logger.new("#{Rails.root}/log/my.log")
  end

  def before_save
    my_logger.info("Creating user with name #{self.name}")
  end
end

Aquí utilicé un atributo de clase para memorizar el registrador. De esta manera, no se creará para cada objeto de usuario que se cree, pero no está obligado a hacerlo. Recuerde también que puede inyectar el método my_logger directamente en la clase ActiveRecord::Base (o en alguna superclase propia si no le gusta monkey patch demasiado) para compartir el código entre los modelos de tu app.

 159
Author: Thiago Arrais,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-08 18:11:22

Update

Hice una gema basada en la solución de abajo, llamada multi_logger. Simplemente haga esto en el inicializador:

MultiLogger.add_logger('post')

Y llamar

Rails.logger.post.error('hi')
# or call logger.post.error('hi') if it is accessible.

Y has terminado.

Si desea codificarlo usted mismo, vea a continuación:


Una solución más completa sería colocar lo siguiente en su directorio lib/ o config/initializers/.

El beneficio es que puede configurar formatter para prefijar marcas de tiempo o severidad a los registros automáticamente. Esto es accesible desde cualquier lugar en los carriles, y se ve más limpio mediante el uso del patrón de singleton.

# Custom Post logger
require 'singleton'
class PostLogger < Logger
  include Singleton

  def initialize
    super(Rails.root.join('log/post_error.log'))
    self.formatter = formatter()
    self
  end

  # Optional, but good for prefixing timestamps automatically
  def formatter
    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} #{$$}] #{msg.to_s.strip}\n"
    }
  end

  class << self
    delegate :error, :debug, :fatal, :info, :warn, :add, :log, :to => :instance
  end
end

PostLogger.error('hi')
# [ERROR 2012-09-12 10:40:15] hi
 36
Author: lulalala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-03 10:15:32

Una opción decente que funciona para mí es simplemente agregar una clase bastante simple a su carpeta app/models como app/models/my_log.rb

class MyLog
  def self.debug(message=nil)
    @my_log ||= Logger.new("#{Rails.root}/log/my.log")
    @my_log.debug(message) unless message.nil?
  end
end

Luego, en su controlador, o realmente casi en cualquier lugar donde pueda hacer referencia a la clase de un modelo desde su aplicación rails, es decir, en cualquier lugar que pueda hacer Post.create(:title => "Hello world", :contents => "Lorum ipsum"); o algo similar, puede iniciar sesión en su archivo personalizado de esta manera

MyLog.debug "Hello world"
 33
Author: Vaughn Draughon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-06 14:55:44

Aquí está mi registrador personalizado:

class DebugLog
  def self.debug(message=nil)
    return unless Rails.env.development? and message.present?
    @logger ||= Logger.new(File.join(Rails.root, 'log', 'debug.log'))
    @logger.debug(message) 
  end
end
 4
Author: Dorian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-29 14:59:39

Defina una clase logger en (digamos) app/models/special_log.rb:

class SpecialLog
  LogFile = Rails.root.join('log', 'special.log')
  class << self
    cattr_accessor :logger
    delegate :debug, :info, :warn, :error, :fatal, :to => :logger
  end
end

Inicializa el logger en (digamos) config/initializers/special_log.rb:

SpecialLog.logger = Logger.new(SpecialLog::LogFile)
SpecialLog.logger.level = 'debug' # could be debug, info, warn, error or fatal

En cualquier lugar de su aplicación, puede iniciar sesión con:

SpecialLog.debug("something went wrong")
# or
SpecialLog.info("life is good")
 3
Author: Les Nightingill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-25 03:00:43
class Article < ActiveRecord::Base  

      LOGFILE = File.join(RAILS_ROOT, '/log/', "article_#{RAILS_ENV}.log")  

      def validate  
        log "was validated!"  
      end   

      def log(*args)  
       args.size == 1 ? (message = args; severity = :info) : (severity, message = args)  
       Article.logger severity, "Article##{self.id}: #{message}"  
     end  

     def self.logger(severity = nil, message = nil)  
       @article_logger ||= Article.open_log  
       if !severity.nil? && !message.nil? && @article_logger.respond_to?(severity)  
         @article_logger.send severity, "[#{Time.now.to_s(:db)}] [#{severity.to_s.capitalize}] #{message}\n"  
       end  
       message or @article_logger  
     end  

     def self.open_log  
       ActiveSupport::BufferedLogger.new(LOGFILE)  
     end  

   end  
 2
Author: Tony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-01 02:26:11

Sugeriría usar Log4r gem para el registro personalizado. Citando la descripción de su página:

Log4r es una biblioteca de registro completa y flexible escrita en Ruby para su uso en programas Ruby. Cuenta con un sistema de registro jerárquico de cualquier número de niveles, nombres de nivel personalizados, herencia del registrador, múltiples destinos de salida por evento de registro, seguimiento de ejecución, formato personalizado, seguridad del hilo, XML y configuración YAML, y más.

 1
Author: Kangur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-30 16:29:57
class Post < ActiveRecord::Base
    def initialize(attributes)
        super(attributes)
        @logger = Logger.new("#{Rails.root}/log/post.log")
    end

    def logger
        @logger
    end

    def some_method
        logger.info('Test 1')
    end
end

ps = Post.new
ps.some_method
ps.logger.info('Test 2')
Post.new.logger.info('Test 3')
 1
Author: hlcs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-30 14:24:31

El marco de registro, con su nombre engañosamente simple, tiene la sofisticación que usted anhela!

Siga las instrucciones muy cortas de logging-rails para comenzar a filtrar el ruido, obtener alertas y elegir la salida de una manera precisa y de alto nivel.

Date palmaditas en la espalda cuando hayas terminado. Registro de rodadura, todos los días. Vale la pena solo por eso.

 0
Author: olleolleolle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-04 12:56:47