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)


74
75
76
77
78
# File 'lib/legion/logging/shipper.rb', line 74

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
  @mutex ||= Mutex.new
  batch = @mutex.synchronize do
    return true if @buffer.nil? || @buffer.empty?

    flushed = @buffer.dup
    @buffer.clear
    flushed
  end

  transport = TRANSPORTS[transport_type]
  return true unless transport

  delivered = deliver(transport, batch)
  @mutex.synchronize { @buffer.prepend(*batch) } unless delivered
  delivered
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
61
62
63
64
# File 'lib/legion/logging/shipper.rb', line 45

def start
  @start_mutex ||= Mutex.new
  @start_mutex.synchronize do
    return unless enabled?
    return if @flush_thread&.alive?

    @buffer ||= []
    @mutex  ||= Mutex.new
    @running = true
    interval = flush_interval
    @flush_thread = Thread.new do
      while @running
        sleep interval
        flush
      end
    end
    @flush_thread.name = 'legion-log-shipper'
    @flush_thread.abort_on_exception = false
  end
end

.stopObject



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

def stop
  @running = false
  thread = @flush_thread
  @flush_thread = nil
  thread&.join(5)
  flush
end