[ruby-on-rails] Rails에서 무언가를 독립적 인 로그 파일로 기록하는 방법은 무엇입니까?

레일에서는 표준 development.log 또는 production.log가 아닌 다른 로그 파일에 일부 정보를 기록하려고합니다. 모델 클래스 에서이 로깅을 수행하고 싶습니다.



답변

모든 모델 내에서 직접 Logger 객체를 만들 수 있습니다. 파일 이름을 생성자에 전달하고 일반적인 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

여기에서는 클래스 속성을 사용하여 로거를 메모합니다. 이 방법으로 생성되는 모든 단일 User 객체에 대해 생성되지는 않지만 반드시 그렇게 할 필요는 없습니다. 또한 앱 모델간에 코드를 공유 하기 위해 my_logger메소드를 ActiveRecord::Base클래스에 직접 삽입 하거나 너무 많이 패치하고 싶지 않은 경우 자체 슈퍼 클래스에 주입 할 수 있습니다 .


답변

최신 정보

아래의 솔루션을 기반으로 multi_logger 라는 보석을 만들었습니다 . 초기화 프로그램 에서이 작업을 수행하십시오.

MultiLogger.add_logger('post')

전화

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

그리고 당신은 끝났습니다.

직접 코딩하려면 아래를 참조하십시오.


보다 완벽한 해결책은 다음을 귀하 lib/또는 config/initializers/디렉토리 에 두는 것 입니다.

타임 스탬프 또는 심각도를 로그에 자동으로 지정하도록 포맷터를 설정할 수 있다는 이점이 있습니다. Rails의 어느 곳에서나 액세스 할 수 있으며 싱글 톤 패턴을 사용하여 깔끔하게 보입니다.

# 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


답변

나에게 맞는 괜찮은 옵션은 app/models폴더에 상당히 평범한 클래스를 추가하는 것입니다.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

다음 거의 모든 곳에서 당신은 당신의 레일 응용 프로그램 내에서 모델의 클래스를 참조 할 수 있다는 것을 정말 컨트롤러, 또는에서, 즉 어디서나 할 수있는 Post.create(:title => "Hello world", :contents => "Lorum ipsum");또는 비슷한이 같은 사용자 정의 파일에 로그인 할 수 있습니다

MyLog.debug "Hello world"


답변

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

config / initializers / special_log.rb에서 로거를 초기화하십시오.

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

앱의 어느 곳에서나 다음과 같이 로그인 할 수 있습니다.

SpecialLog.debug("something went wrong")
# or
SpecialLog.info("life is good")


답변

내 맞춤 로거는 다음과 같습니다.

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


답변

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  


답변

사용자 정의 로깅에 Log4r gem 을 사용하는 것이 좋습니다 . 페이지에서 인용 설명 :

Log4r은 Ruby 프로그램에서 사용하기 위해 Ruby로 작성된 포괄적이고 유연한 로깅 라이브러리입니다. 여기에는 여러 수준, 사용자 지정 수준 이름, 로거 상속, 로그 이벤트 당 여러 출력 대상, 실행 추적, 사용자 지정 형식, 스레드 안전, XML 및 YAML 구성 등의 계층 적 로깅 시스템이 있습니다.