2014-12-12 5 views
-2

Так что нам нужно что-то, что произошло в приложении Rails войти:Каков наилучший способ форматирования моделей Rails для журналов?

logger.info("Created zone #{zone} for user #{user}.") 

zone и user являются стандартными моделями, то есть объекты ActiveRecord::Base -derived классов. И выход по умолчанию не очень полезно:

Created zone #<Zone:0x007f93b3709498> for user #<User:0x007f93b3509418>. 

Для отладки, это имеет смысл для вывода, по меньшей мере модели id с. Также было бы неплохо увидеть некоторые ключевые атрибуты (набор которых варьируется от модели к модели), например user.name и zone.area.

inspect был бы излишним, потому что некоторые из наших моделей (User в комплекте) имеют много неключевых атрибутов, которые не сразу полезны и будут только мешать журналам.

Переопределение to_s не чувствует себя хорошо, потому что модели должны заботиться о своем состоянии, а не о представлении. Кроме того, этот «короткий осмотр» - это то, что нужно только в журналах, а не каждый время, которое мы хотим вывести на модели.

Каков наилучший способ форматирования моделей Rails для журналов?

+0

Где я должен задавать такие вопросы? –

ответ

2

Мои непосредственные мысли:

  1. Почему вы сохранять их?
  2. Каковы ваши требования к этому журналу, если это важно?

Они направят вас в том направлении, в котором вам нужно идти. Если вы хотите использовать такую ​​интерполяцию строк, то to_s - это то, что будет вызываться.

Чтобы сохранить информацию из моделей, которые вы могли бы использовать concerns, чтобы смешать его в:

# app/models/concerns/user/log_format.rb 
module Concerns::User::LogFormat 
    extend ActiveSupport::Concern 
    def to_log_format 
    "Hey I'm a User and I have some #{attributes}!" 
    end 
end 

Смешайте его к User:

class User < ActiveRecord::Base 
    include Concerns::User::LogFormat 
end 

Затем вы можете открыть Logger и добавить умный метод:

class ActiveSupport::Logger 
    def log_models(level, message, *args) 
    args = args.map { |arg| arg.try(:to_log_format) || arg } 
    self.send(level, sprintf(message, *args)) 
    end 
end 

T вы можете это назвать:

user = ... 
zone = ... 
logger.log_models(:info, "Created zone %s for user %s.", zone, user) 

Похоже, это долгий путь, чтобы занести в журнал кучу информации, с какой целью? Если у вас есть определенная цель, возможно, общий журнал приложений не подходит для этого.

+0

Спасибо! Я полностью забыл о хорошем старом форматировании строк! –

Смежные вопросы