Dans les rails je veux enregistrer certaines informations dans un autre fichier journal et non pas le standard de développement.de journal ou de la production.journal. Je veux faire cet enregistrement à partir d'un modèle de classe.
Réponses
Trop de publicités?Vous pouvez créer un objet Logger vous-même à l'intérieur de tout modèle. Il suffit de passer le nom du fichier pour le constructeur et l'utilisation de l'objet comme d'habitude Rails 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
Ici j'ai utilisé un attribut de classe à memoize l'enregistreur. De cette façon, il ne sera pas créé pour chaque Utilisateur de l'objet qui vient d'être créé, mais vous n'êtes pas tenu de le faire. Rappelez-vous aussi que vous pouvez injecter de l' my_logger
méthode directement dans l' ActiveRecord::Base
de la classe (ou dans certains super-classe de votre propre si vous ne aimez pas à monkey patch trop) pour partager du code entre votre application de modèles.
Mise à jour
J'ai fait un bijou basé sur la solution ci-dessous, appelé multi_logger. Viens de le faire dans l'initialiseur:
MultiLogger.add_logger('post')
et appel
Rails.logger.post.error('hi')
# or call logger.post.error('hi') if it is accessible.
et vous avez terminé.
Si vous voulez coder vous-même, voir ci-dessous:
Une solution plus complète serait de placer la ligne suivante dans votre lib/
ou config/initializers/
répertoire.
L'avantage est que vous pouvez configurer formateur à préfixe horodateurs ou de la gravité de l'connecte automatiquement. Ceci est accessible à partir de n'importe où dans les Rails, et a l'air plus propre en utilisant le pattern 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
Un décent option qui fonctionne pour moi est tout simplement à ajouter un assez claire de la classe à vos app/models
le dossier comme 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
puis dans votre contrôleur, ou vraiment presque n'importe où que vous pouvez faire référence à un modèle de classe à partir de votre application rails, c'est à dire n'importe où vous pourriez faire Post.create(:title => "Hello world", :contents => "Lorum ipsum");
ou quelque chose de similaire, vous pouvez vous connecter à votre fichier personnalisé comme ceci
MyLog.debug "Hello world"
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
Je conseille Log4r gem pour la journalisation personnalisé. Citant description de sa page:
Log4r est un ensemble complet et flexible de journalisation bibliothèque écrite en Ruby pour une utilisation en Ruby programmes. Il dispose d'un hiérarchique du système d'enregistrement de n'importe quel nombre de niveaux, personnaliser le niveau des noms, enregistreur de succession, plusieurs destinations de sortie par journal des événements, l'exécution de traçage, mise en forme personnalisée, fil safteyness, XML et de configuration YAML, et plus encore.