162 votes

Comment se connecter à quelque chose dans les Rails dans un fichier journal indépendant ?

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.

197voto

Thiago Arrais Points 10051

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.

41voto

lulalala Points 3895

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

38voto

Vaughn Draughon Points 681

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"

2voto

Tony Points 6793
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

1voto

Kangur Points 2412

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X