No Rails, quero registrar algumas informações em um arquivo de log diferente e não no padrão development.log ou production.log. Eu quero fazer esse log de uma classe de modelo.
fonte
No Rails, quero registrar algumas informações em um arquivo de log diferente e não no padrão development.log ou production.log. Eu quero fazer esse log de uma classe de modelo.
Você pode criar um objeto Logger de dentro de qualquer modelo. Apenas passe o nome do arquivo para o construtor e use o objeto como o Rails usual 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
Aqui eu usei um atributo de classe para memorizar o criador de logs. Dessa forma, ele não será criado para cada objeto Usuário criado, mas você não é obrigado a fazer isso. Lembre-se também de que você pode injetar o my_logger
método diretamente na ActiveRecord::Base
classe (ou em alguma superclasse de sua preferência, se você não gostar muito do patch do macaco) para compartilhar o código entre os modelos do seu aplicativo.
User.logger = Logger.new(STDOUT)
ou onde quer que você faça o logon. Da mesma forma,ActiveRecord::Base.logger = Logger.new(STDOUT)
alterará todo o log para todos os modelos.User.logger = Logger.new(STDOUT)
mudou todo o log para todos os modelos. Bem, isso mudouActiveRecord::Base.logger
my_logger
emapplication_controller.rb
.Atualizar
Fiz uma gema com base na solução abaixo, chamada multi_logger . Basta fazer isso no inicializador:
e ligar
e você terminou.
Se você deseja codificá-lo, veja abaixo:
Uma solução mais completa seria colocar o seguinte no seu diretório
lib/
ouconfig/initializers/
.O benefício é que você pode configurar o formatador para prefixar timestamps ou severity nos logs automaticamente. Isso pode ser acessado de qualquer lugar no Rails e fica mais limpo usando o padrão singleton.
fonte
#{$$}
?Uma opção decente que funciona para mim é apenas adicionar uma classe bastante simples à sua
app/models
pasta, comoapp/models/my_log.rb
no controlador, ou quase em qualquer lugar em que você possa referenciar a classe de um modelo a partir do aplicativo rails, ou seja, em qualquer lugar que você possa fazer
Post.create(:title => "Hello world", :contents => "Lorum ipsum");
ou algo semelhante, você poderá fazer logon no seu arquivo personalizado como estefonte
Defina uma classe de criador de logs em (digamos) app / models / special_log.rb:
inicialize o logger (digamos) config / initializers / special_log.rb:
Em qualquer lugar do seu aplicativo, você pode fazer login com:
fonte
Aqui está o meu criador de logs personalizado:
fonte
fonte
Eu sugeriria o uso do Log4r gem para log personalizado. Citando a descrição de sua página:
fonte
fonte
A estrutura de log, com seu nome enganosamente simples, tem a sofisticação que você deseja!
Siga as instruções muito curtas dos trilhos de registro para começar a filtrar o ruído, receber alertas e escolher a saída de maneira refinada e de alto nível.
Dê um tapinha nas costas quando terminar. Rolando log, diariamente. Vale a pena só por isso.
fonte