Rails에서 무언가를 독립적 인 로그 파일로 기록하는 방법은 무엇입니까? production.log가 아닌 다른 로그

레일에서는 표준 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 구성 등의 계층 적 로깅 시스템이 있습니다.