Отступы в журналах Rails

При регистрации пользовательской информации, например в задаче rake я хотел бы сделать отступы в строках журнала для лучшей читаемости. Например:

Seeding database...
  Importing xyz.csv...
    Skipping row 5 due to invalid value 'Unknown' in column 'year'
  Finished importing xyz.csv
Finished seeding database

В моем seeds.rb для ведения журнала я использую следующее:

logger = Logger.new(STDOUT)
logger.info('Seeding database...')

Однако регистрация Skipping row 5... происходит в сервисе, который не обязательно должен вызываться из seeds.rb, но может быть вызван из любого места. Таким образом, я не могу жестко закодировать правильный отступ (в любом случае, это звучит как плохая идея).

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

Что описывает уровень отступа для чего-то. Это явное или неявное?

Vatsal Jain 13.09.2019 12:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
1
213
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Лучшее решение - предоставить объекту службы объект регистратора вместе с данными для обработки. Таким образом, ему не нужно ничего знать о ваших предпочтениях регистратора.

И используйте что-то вроде:

require 'logger'

class IndentedLogger < Logger

  INDENTATION_STR = '  '.freeze
  attr_accessor :indentation

  def initialize(io, *args, **params)
    self.indentation = 0
    super
  end

  def indented
    return self.dup.tap{|l| l.indentation += 1 } unless block_given?
    self.indentation += 1
    yield self
    self.indentation -= 1
  end

  protected

  def format_message(severity, datetime, progname, msg)
    (@formatter || @default_formatter).call(severity, datetime, progname, "#{INDENTATION_STR*indentation}#{msg}")
  end

end

# Example:
logger = IndentedLogger.new(STDOUT)

logger.info "Foo"
logger.indented{
  logger.info "Foo"
  logger.indented.info "Indented even more"
}
logger.info "Foo"

А для вызова сервисной службы - YourService.new(some_data, logger: logger.indented).process_or_whatever

Поднимите палец вверх за блочный подход! Это действительно решает проблему, поскольку вызываемый метод может просто регистрироваться, не зная о текущем уровне отступа, и отступ автоматически сбрасывается после выхода из блока.

Timitry 17.09.2019 09:10

Другие вопросы по теме