Class: Julewire::SemanticLogger::Transport

Inherits:
Object
  • Object
show all
Defined in:
lib/julewire/semantic_logger/transport.rb

Constant Summary collapse

LOGGER_NAME =
"julewire"
DEFAULT_MAX_QUEUE_SIZE =
AsyncOptions::DEFAULT_MAX_QUEUE_SIZE
LEVEL_MAP =
{
  # SemanticLogger has no unknown level; fatal keeps unknown core records visible.
  unknown: :fatal
}.freeze
LEVEL_SET =
::SemanticLogger::LEVELS.to_h { [it, true] }.freeze

Instance Method Summary collapse

Constructor Details

#initialize(**options) ⇒ Transport

Returns a new instance of Transport.



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/julewire/semantic_logger/transport.rb', line 16

def initialize(**options)
  @mutex = Mutex.new
  @async = options.delete(:async)
  @async_options = AsyncOptions.extract(options)
  @async = @async_options.async?(@async)
  @max_queue_size = @async_options.max_queue_size
  @health = Core::Integration::DestinationHealth.new(counter_keys: %i[writes])
  @appenders = build_appenders(
    appenders: options.delete(:appenders),
    appender: options.delete(:appender),
    file_name: options.delete(:file_name),
    io: options.delete(:io),
    options: options
  )
  @sink = build_sink(@appenders)
  @appender = build_transport_appender(@sink)
end

Instance Method Details

#after_fork!Object



67
# File 'lib/julewire/semantic_logger/transport.rb', line 67

def after_fork! = reopen

#closeObject



53
54
55
56
57
# File 'lib/julewire/semantic_logger/transport.rb', line 53

def close
  appender.close
  @closed = true
  nil
end

#flushObject



46
47
48
49
50
51
# File 'lib/julewire/semantic_logger/transport.rb', line 46

def flush
  degradation_marker = @health.degradation_marker
  appender.flush
  @health.clear_degradation_if_unchanged(degradation_marker)
  nil
end

#healthObject



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/julewire/semantic_logger/transport.rb', line 69

def health
  snapshot = @health.snapshot(status: status)
  counts = snapshot.fetch(:counts)

  {
    type: "semantic_logger",
    status: snapshot.fetch(:status),
    async: @async,
    warnings: lifecycle_warnings,
    last_failure: snapshot[:last_failure],
    counts: {
      writes: counts.fetch(:writes),
      failures: counts.fetch(:failures)
    },
    appender: appender_health(appender),
    appenders: @appenders.each_with_index.map { |child, index| appender_health(child, index: index) }
  }
end

#reopenObject



59
60
61
62
63
64
65
# File 'lib/julewire/semantic_logger/transport.rb', line 59

def reopen
  degradation_marker = @health.degradation_marker
  appender.reopen if appender.respond_to?(:reopen)
  @closed = false
  @health.clear_degradation_if_unchanged(degradation_marker)
  nil
end

#write(value, severity:) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
# File 'lib/julewire/semantic_logger/transport.rb', line 34

def write(value, severity:)
  degradation_marker = @health.degradation_marker
  log = log_for(value, severity: severity)
  @health.increment(:writes)
  @mutex.synchronize { appender.log(log) } unless @async
  appender.log(log) if @async
  @health.clear_degradation_if_unchanged(degradation_marker)
rescue StandardError => e
  @health.record_failure(e)
  raise
end