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