¿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.
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.
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
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"
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
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")
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
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.
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')
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.
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