Module: Legion::Logging::Shipper

Defined in:
lib/legion/logging/shipper.rb,
lib/legion/logging/shipper/file_transport.rb,
lib/legion/logging/shipper/http_transport.rb

Defined Under Namespace

Modules: FileTransport, HttpTransport

Constant Summary collapse

LEVEL_ORDER =
%w[debug info warn error fatal].freeze
TRANSPORTS =
{
  file: FileTransport,
  http: HttpTransport
}.freeze

Class Method Summary collapse

Class Method Details

.enabled?Boolean

Returns:

  • (Boolean)


68
69
70
71
72
# File 'lib/legion/logging/shipper.rb', line 68

def enabled?
  return false unless defined?(Legion::Settings)

  Legion::Settings.dig(:logging, :shipper, :enabled) == true
end

.flushObject



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/legion/logging/shipper.rb', line 27

def flush
  return if @buffer.nil? || @buffer.empty?

  transport = TRANSPORTS[transport_type]
  return unless transport

  @flush_mutex ||= Mutex.new
  @flush_mutex.synchronize do
    batch = nil
    @mutex.synchronize { batch = @buffer.dup }
    return if batch.empty?

    delivered = deliver(transport, batch)
    @mutex.synchronize { @buffer.shift(batch.size) if delivered }
    delivered
  end
end

.ship(event) ⇒ Object



18
19
20
21
22
23
24
25
# File 'lib/legion/logging/shipper.rb', line 18

def ship(event)
  return unless enabled?
  return unless shippable_level?(event[:level] || event['level'])

  redacted  = Redactor.redact(event)
  transport = TRANSPORTS[transport_type]
  buffer_event(redacted) if transport
end

.startObject



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/legion/logging/shipper.rb', line 45

def start
  return unless enabled?
  return if @flush_thread&.alive?

  @buffer ||= []
  @mutex  ||= Mutex.new
  @flush_mutex ||= Mutex.new
  interval = flush_interval
  @flush_thread = Thread.new do
    loop do
      sleep interval
      flush
    end
  end
  @flush_thread.abort_on_exception = false
end

.stopObject



62
63
64
65
66
# File 'lib/legion/logging/shipper.rb', line 62

def stop
  @flush_thread&.kill
  @flush_thread = nil
  flush
end