9 ответов:
вы можете создать объект 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здесь я использовал атрибут класса для запоминания регистратора. Таким образом, он не будет создан для каждого объекта пользователя, который будет создан, но вы не обязаны это делать. Помните также, что вы можете ввести
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/или
достойный вариант, который работает для меня, чтобы просто добавить довольно простой класс
app/modelsпапку, напримерapp/models/my_log.rbclass MyLog def self.debug(message=nil) @my_log ||= Logger.new("#{Rails.root}/log/my.log") @my_log.debug(message) unless message.nil? end endзатем в вашем контроллере или действительно почти везде, где вы можете ссылаться на класс модели из вашего приложения rails, т. е. в любом месте, где вы могли бы сделать
Post.create(:title => "Hello world", :contents => "Lorum ipsum");или что-то подобное вы можете войти в свой пользовательский файл, как этоMyLog.debug "Hello world"
вот мой пользовательский регистратор:
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
определите класс регистратора в (скажем) app/models/special_log.РБ:
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.РБ:
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 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 для использования в рубиновых программах. Оно отличает иерархической внося в журнал системой любого числа уровни, пользовательские имена уровней, наследование регистратора, несколько выходных назначений за событие журнала, трассировка выполнения, пользовательское форматирование, безопасность потока, XML и конфигурации YAML, а больше.
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')
структура ведения журнала, с его обманчиво простым именем, имеет сложность, которую вы жаждете!
следуйте очень коротким инструкциям logging-rails чтобы начать отфильтровывать шум, получать оповещения и выбирать вывод мелкозернистым и высокоуровневым способом.
похлопать себя по спине, когда вы сделали. Бревно-прокатка, ежедневно. Это того стоит.
Comments