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


157

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

답변:


187

모든 모델 내에서 직접 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클래스에 직접 삽입 하거나 너무 많이 패치하고 싶지 않은 경우 자체 슈퍼 클래스에 주입 할 수 있습니다 .


5
해당 모델에 대한 모든 기본 로깅을 변경하려는 경우 User.logger = Logger.new(STDOUT)또는 어디에서나 로그인하려는 곳을 사용 하면됩니다. 같은 방식으로 ActiveRecord::Base.logger = Logger.new(STDOUT)모든 모델의 모든 로깅을 변경합니다.
Dave

누구나 각 로그에 폴더를 만드는 방법을 알고 있습니까?
Mauro Dias

2
@Dave 나는 당신의 제안을 시도했지만 실패했습니다. User.logger = Logger.new(STDOUT)모든 모델의 모든 로깅을 변경했습니다. 글쎄, 그것은 바뀌었다ActiveRecord::Base.logger
fetsh

@ilzoff Yep,이 행동은 3 년 전부터 Rails에서 바뀌었을 가능성이 있습니다. 전화 해 주셔서 감사합니다.
Dave

감사. 배치하여 꽤 많이 내 컨트롤러 같은나요 my_loggerapplication_controller.rb.
kstratis

40

최신 정보

아래의 솔루션을 기반으로 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

1
무엇입니까 #{$$}?
Daniel Costa


37

나에게 맞는 괜찮은 옵션은 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"

2
똑똑하고 간단한 솔루션!
Anwar

9

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")

4

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

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

2
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  

1

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

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


1
class Post < ActiveRecord::Base
    def initialize(attributes)
        super(attributes)
        @logger = Logger.new("#{Rails.root}/log/post.log")
    end

    def logger
        @logger
    end

    def some_method
        logger.info('Test 1')
    end
end

ps = Post.new
ps.some_method
ps.logger.info('Test 2')
Post.new.logger.info('Test 3')

0

믿을 수 없을 정도로 단순한 이름의 로깅 프레임 워크는 정교함을 간파합니다!

로깅 레일 의 매우 간단한 지침을 따르십시오 노이즈 필터링, 경고 받기 및 세밀하고 높은 수준의 출력 선택을 시작하십시오.

완료되면 등을 두 드리십시오. 매일 로그 롤링. 그것만으로도 가치가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.