복붙노트

[RUBY-ON-RAILS] 어떻게 독립적 인 로그 파일에 레일에 뭔가를 기록하려면?

RUBY-ON-RAILS

어떻게 독립적 인 로그 파일에 레일에 뭔가를 기록하려면?

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

해결법

  1. ==============================

    1.당신은 어떤 모델 내부에서 로거 객체를 직접 만들 수 있습니다. 그냥 생성자에 파일 이름을 전달하고 일반 레일 로거와 같은 개체를 사용 :

    당신은 어떤 모델 내부에서 로거 객체를 직접 만들 수 있습니다. 그냥 생성자에 파일 이름을 전달하고 일반 레일 로거와 같은 개체를 사용 :

    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
    

    여기에 내가 로거를 memoize하는 클래스 속성을 사용했다. 이 방법은가 작성되는 모든 단일 사용자 개체에 대해 작성되지 않습니다,하지만 당신은 그렇게 할 필요가 없습니다. 당신은 액티브 :: 기본 클래스에 직접 my_logger 방법을 주입 (또는 자신의 일부 슈퍼 클래스에 너무 많은 원숭이 패치 마음에 들지 않으면) 앱의 모델 사이의 코드를 공유 할 수 있다는 것을 기억하라.

  2. ==============================

    2.최신 정보

    최신 정보

    나는 multi_logger라는 아래의 솔루션을 기반으로 보석을했다. 그냥 초기화에서이 작업을 수행 :

    MultiLogger.add_logger('post')
    

    및 전화

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

    작업이 완료된다.

    당신이 자신의 코드를 원하는 경우, 아래 참조 :

    더 완벽한 솔루션은 lib 디렉토리 / 또는 설정 / 초기화 / 디렉토리에 다음을 배치하는 것입니다.

    이점은 포맷터에 접두사 타임 스탬프 또는 심각도 로그에 자동으로 설치 할 수 있다는 것입니다. 이 레일에서 어디서나 접근 할 수 있으며, 외모는 싱글 톤 패턴을 사용하여 깔끔한.

    # 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
    
  3. ==============================

    3.나를 위해 작품을 그냥 앱에 상당히 일반 클래스를 추가하는 것입니다 괜찮은 옵션 / 모델은 응용 프로그램 / 모델 / my_log.rb으로 폴더

    나를 위해 작품을 그냥 앱에 상당히 일반 클래스를 추가하는 것입니다 괜찮은 옵션 / 모델은 응용 프로그램 / 모델 / 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
    

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

    MyLog.debug "Hello world"
    
  4. ==============================

    4.(예를 들어) 응용 프로그램 / 모델 / special_log.rb에서 로거 클래스를 정의합니다 :

    (예를 들어) 응용 프로그램 / 모델 / 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
    

    설정 / 초기화 / 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")
    
  5. ==============================

    5.여기에 내 사용자 정의 로거는 다음과 같습니다

    여기에 내 사용자 정의 로거는 다음과 같습니다

    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
    
  6. ==============================

    6.

    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  
    
  7. ==============================

    7.나는 사용자 지정 로깅 Log4r 보석을 사용하는 것이 좋습니다 것입니다. 그 페이지에서 설명을 인용 :

    나는 사용자 지정 로깅 Log4r 보석을 사용하는 것이 좋습니다 것입니다. 그 페이지에서 설명을 인용 :

  8. ==============================

    8.

    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')
    
  9. ==============================

    9.로깅 프레임 워크는 그 현혹 간단한 이름으로, 당신이 갈망 정교함이있다!

    로깅 프레임 워크는 그 현혹 간단한 이름으로, 당신이 갈망 정교함이있다!

    의 매우 짧은 지침에 따라, 노이즈 필터링 경고를 받고, 그리고 세분화 된 높은 수준의 방법으로 출력을 선택하는 시작하는 로깅을-레일.

    작업이 완료 될 때 뒷면에 자신을 팻. 매일, 로그 롤링. 혼자에 대한 가치가.

  10. from https://stackoverflow.com/questions/337739/how-to-log-something-in-rails-in-an-independent-log-file by cc-by-sa and MIT license