Skip to content
forked from funbox/loggun

Приводит логи приложения к единому формату

License

Notifications You must be signed in to change notification settings

mikeoleynik/loggun

This branch is 1 commit ahead of funbox/loggun:master.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

f3dc3f9 · Oct 11, 2023
Feb 10, 2020
Oct 9, 2023
Sep 22, 2020
Feb 17, 2020
Feb 10, 2020
Jul 28, 2020
Oct 9, 2023
Feb 10, 2020
Feb 10, 2020
Sep 22, 2020
Feb 10, 2020
Apr 6, 2020

Repository files navigation

Loggun

Gem Version Build Status

Приводит логи приложения к единому формату.

Содержание

Установка

Чтобы установить гем, добавьте его в Gemfile:

gem 'loggun'

И выполните команду:

$ bundle

Использование

Loggun можно использовать как обертку для вашего logger. Для этого необходимо передать ему инстанс логгера и настроить его formatter:

Loggun.logger = Rails.logger
Loggun.logger.formatter = Loggun::Formatter.new

Теперь можно использовать Loggun для логирования в стандартизированном формате:

Loggun.info('http_request.api.request', user_id: current_user.id)
#=> 2020-04-11T22:35:04.225+03:00 - 170715 INFO http_request.api.request - {"user_id": 5465}
...
Loggun.info('http_request.api.response', user_id: current_user.id, success: true)
#=> 2020-04-11T22:35:04.225+03:00 - 170715 INFO http_request.api.response - {"user_id": 5465, "success": true} 

Конфигурация

Конфигурацию гема необходимо производить при инициализации приложения. Например, так:

Loggun::Config.configure do |config|
  config.precision = :milliseconds
  config.pattern = '%{time} - %{pid} %{severity} %{type} %{tags_text} %{message}'
  config.parent_transaction_to_message = false
  config.message_format = :json

  config.modifiers.rails = true
  config.modifiers.sidekiq = false
  config.modifiers.clockwork = false
  config.modifiers.incoming_http = false
  config.modifiers.outgoing_http = false
end

Настройки

Все настройки опциональны.

  • precision — точность отметок времени.

    Может принимать одно из следующих значений: sec, seconds, ms, millis, milliseconds, us, micros, microseconds, ns, nanos, nanoseconds.

    По умолчанию milliseconds.

  • pattern — текстовый шаблон для формата вывода данных в лог.

    Доступные ключи внутри шаблона: time, pid, severity, type, tags_text, message, parent_transaction.

  • parent_transaction_to_message — если true, то значение parent_transaction будет добавлено в тело логируемого сообщения.

    Ключ parent_transaction в шаблоне pattern можно использовать вне зависимости от значения этой настройки.

  • force_utc — если true, то значение time будет переведено в UTC.

    По умолчанию false.

  • message_format — формат переменной message в шаблоне pattern.

    Доступные значения:

    • :jsonmessage логируется как JSON-строка;
    • :key_valuemessage логируется в формате key1=value1 key2=value2.
  • log_format — формат лога.

    Доступные значения:

    • :json — лог формируется как JSON-строка игнорируя шаблон pattern и настройку message_format;
    • :plain — лог формируется по шаблону pattern.

    По умолчанию :plain.

    При log_format == :json в message будет попадать только сообщение, которое было передано строкой. Сообщение, переданное хешем попадет в поле metadata. Пример:

      Loggun.info("my.best.action", "message string", test: true)
      # {
      #    "metadata":{"test":true},
      #    "message":"message string",
      #    "type":"my.best.action",
      #    "timestamp":"2020-09-22T14:57:22.233+03:00",
      #    "severity":"INFO",
      #    ...
      #    }
  • exclude_keys — список ключей, которые будут исключены из лога.

    Используется, если log_format имеет значение :json и список only_keys пуст.

  • only_keys — список ключей, которые будут включены в JSON-строку.

    Используется, если log_format имеет значение :json.

  • modifiers — модификаторы для переопределения формата логирования указанного компонента. См. «Модификаторы».

Модификаторы

Каждый модифкатор может быть активирован двумя равнозначными способами:

config.modifiers.rails = true

или

config.modifiers.rails.enable = true

(В качестве примера активируется Rails модификатор, но может быть любой другой.)

Rails модификатор

config.modifier.rails

Модифицирует форматирование логгера Rails.

Active Record модификатор

config.modifier.active_record

Добавляет (именно добавляет, а не модифицирует) нового подписчика на SQL-события.

SQL начинает дополнительно логироваться в Loggun формате, severityinfo. Например:

2020-04-12T20:08:52.913+03:00 - 487257 INFO storage.sql.query - {"sql":"SELECT 1","name":null,"duration":0.837}

Дополнительные настройки:

  • log_subscriber_class_name — имя класса, реализующего логирование SQL-события.

    Необходим метод #sql. По умолчанию: ::Loggun::Modifiers::ActiveRecord::LoggunLogSubscriber.

  • payload_keys — необходимые ключи в полезной нарзуке. Используется в классе по умолчанию.

    Доступные ключи: %i[sql name duration source].

Пример:

Loggun::Config.configure do |config|
  #...
  config.modifiers.active_record.enable = true
  config.modifiers.active_record.log_subscriber_class_name = 'MyApp::MyLogSubscriber'
  config.modifiers.active_record.payload_keys = %i[sql duration]
  #...
end

Sidekiq модификатор

config.modifiers.sidekiq

Модифицирует форматирование логгера Sidekiq.

Clockwork модификатор

config.modifiers.clockwork

Модифицирует форматирование логгера Clockwork.

Модификатор исходящих HTTP-запросов

config.modifiers.outgoing_http

Добавляет логирование исходящих HTTP-запросов. На данный момент поддерживаются только запросы, выполненные с помощью гема HTTP.

Модификатор входящих запросов в Rails

config.modifiers.incoming_http

Добавляет логирование входящих HTTP-запросов для контроллеров Rails.

Может иметь дополнительные настройки:

  • controllers — массив имён базовых контроллеров, для которых необходимо добавить указанное логирование.

  • success_condition — лямбда, определяющая, содержит ли успех ответ экшена.

    Например: -> { JSON.parse(response.body)['result'] == 'ok' }

  • error_info — лямбда, позволяющая добавить в лог информацию об ошибке, содержащейся в неуспешном ответе экшена.

    Например: -> { JSON.parse(response.body)['error_code'] }

Пример (приведены значения по умолчанию):

Loggun::Config.configure do |config|
  #...
  config.modifiers.incoming_http.enable = true
  config.modifiers.incoming_http.controllers = ['ApplicationController']
  config.modifiers.incoming_http.success_condition = -> { response.code == '200' }
  config.modifiers.incoming_http.error_info = -> { nil }
  #...
end

Для Rails 6 и выше данный модификатор может работать некорректно.

В этом случае можно добавить в требуемый базовый контроллер строку:

include Loggun::HttpHelpers

Это делает настройки enable и controllers модификатора безсполезными, однако позволяет гарантированно логировать входящие HTTP-запросы.

Настройки success_condition и error_info продолжают использоваться и могут быть установлены требуемым образом.

Пользовательские модификаторы

Помимо указанных модификаторов существует возможность добавить собственный. Необходимо уснаследовать его от Loggun::Modifiers::Base и указать в методе apply все необходимые действия:

require 'sinatra/custom_logger'

class NewModifier < Loggun::Modifiers::Base
  def apply
    Loggun::Config.setup_formatter(Sinatra::CustomLogger)
  end
end

Затем необходимо добавить его при конфигурации гема:

Loggun::Config.configure do |config|
  #...
  config.add_mofifier NewModifier
  #...
end

Хелперы

Подключение хэлперов в класс позволяет использовать методы логирования log_info и log_error, а также генерировать идентификатор транзации для каждого метода класса.

Например:

class SomeClass
  include Loggun::Helpers

  log_options entity_action: :method_name, as_transaction: true, only: %i[download_data]

  def download_data
    log_info 'http_request', 'Information'
    # ... make http request here
    log_info 'http_response', success: true
  end
end

При вызове #download_data будет следующий вывод в лог:

2020-03-04T16:58:38.207+05:00 - 28476 INFO http_request.some_class.download_data#ffg5431_1583323118203 - {"message":["Information"]}
2020-03-04T16:58:38.208+05:00 - 28476 INFO http_response.some_class.download_data#ffg5431_1583323118203 - {"success": true}

Важно, что с хэлпером log_options необходимо использовать только методы вида log_<severity>. Методы модуля Loggun не будут работать.

Список всех опций хэлпера log_options:

  • entity_name — имя сущности метода, string;
  • entity_action — действие сущности метода, string;
  • as_transaction — добавлять ли уникальный ID транзакции для метода, boolean;
  • transaction_generator — собственный генератор ID транзакции, lambda;
  • log_all_methods — применять ли хэлпер ко всем методам, boolean;
  • only — список методов, для которых необходимо применить хэлпер (работает только когда log_all_methods = false), Array{Symbol};
  • except — список методов, которые надо исключить для хэлпера, Array{Symbol};
  • log_transaction_except — список методов, логирование которых не нужно обогащать ID транзакции, Array{Symbol}.

Sponsored by FunBox

About

Приводит логи приложения к единому формату

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Ruby 99.3%
  • Other 0.7%