Class: Appsignal::Logger

Inherits:
Logger
  • Object
show all
Defined in:
lib/appsignal/logger.rb

Overview

Logger that flushes logs to the AppSignal logging service.

Constant Summary collapse

PLAINTEXT =
0
LOGFMT =
1
JSON =
2
SEVERITY_MAP =
{
  DEBUG => 2,
  INFO => 3,
  WARN => 5,
  ERROR => 6,
  FATAL => 7
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(group, level: INFO, format: PLAINTEXT) ⇒ void

Create a new logger instance

Parameters:

  • group

    Name of the group for this logger.

  • level (defaults to: INFO)

    Log level to filter with

Raises:

  • (TypeError)


30
31
32
33
34
35
36
37
# File 'lib/appsignal/logger.rb', line 30

def initialize(group, level: INFO, format: PLAINTEXT)
  raise TypeError, "group must be a string" unless group.is_a? String

  @group = group
  @level = level
  @format = format
  @mutex = Mutex.new
end

Instance Attribute Details

#levelObject (readonly)

Returns the value of attribute level.



23
24
25
# File 'lib/appsignal/logger.rb', line 23

def level
  @level
end

Instance Method Details

#add(severity, message = nil, group = nil) ⇒ Object Also known as: log

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

We support the various methods in the Ruby logger class by supplying this method.



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/appsignal/logger.rb', line 42

def add(severity, message = nil, group = nil)
  severity ||= UNKNOWN
  return true if severity < level

  group = @group if group.nil?
  if message.nil?
    if block_given?
      message = yield
    else
      message = group
      group = @group
    end
  end
  return if message.nil?

  message = formatter.call(severity, Time.now, group, message) if formatter

  unless message.is_a?(String)
    Appsignal.internal_logger.warn(
      "Logger message was ignored, because it was not a String: #{message.inspect}"
    )
    return
  end

  Appsignal::Extension.log(
    group,
    SEVERITY_MAP.fetch(severity, 0),
    @format,
    message,
    Appsignal::Utils::Data.generate(appsignal_attributes)
  )
end

#debug(message = nil, attributes = {}) ⇒ void

This method returns an undefined value.

Log a debug level message

Parameters:

  • message (defaults to: nil)

    Message to log

  • attributes (defaults to: {})

    Attributes to tag the log with



80
81
82
83
84
85
86
87
# File 'lib/appsignal/logger.rb', line 80

def debug(message = nil, attributes = {})
  return if level > DEBUG

  message = yield if message.nil? && block_given?
  return if message.nil?

  add_with_attributes(DEBUG, message, @group, attributes)
end

#error(message = nil, attributes = {}) ⇒ void

This method returns an undefined value.

Log an error level message

Parameters:

  • message (defaults to: nil)

    Message to log

  • attributes (defaults to: {})

    Attributes to tag the log with



119
120
121
122
123
124
125
126
127
128
# File 'lib/appsignal/logger.rb', line 119

def error(message = nil, attributes = {})
  return if level > ERROR

  message = yield if message.nil? && block_given?
  return if message.nil?

  message = "#{message.class}: #{message.message}" if message.is_a?(Exception)

  add_with_attributes(ERROR, message, @group, attributes)
end

#fatal(message = nil, attributes = {}) ⇒ void

This method returns an undefined value.

Log a fatal level message

Parameters:

  • message (defaults to: nil)

    Message to log

  • attributes (defaults to: {})

    Attributes to tag the log with



134
135
136
137
138
139
140
141
# File 'lib/appsignal/logger.rb', line 134

def fatal(message = nil, attributes = {})
  return if level > FATAL

  message = yield if message.nil? && block_given?
  return if message.nil?

  add_with_attributes(FATAL, message, @group, attributes)
end

#info(message = nil, attributes = {}) ⇒ void

This method returns an undefined value.

Log an info level message

Parameters:

  • message (defaults to: nil)

    Message to log

  • attributes (defaults to: {})

    Attributes to tag the log with



93
94
95
96
97
98
99
100
# File 'lib/appsignal/logger.rb', line 93

def info(message = nil, attributes = {})
  return if level > INFO

  message = yield if message.nil? && block_given?
  return if message.nil?

  add_with_attributes(INFO, message, @group, attributes)
end

#silence(_severity = ERROR, &block) ⇒ Object

When using ActiveSupport::TaggedLogging without the broadcast feature, the passed logger is required to respond to the ‘silence` method. In our case it behaves as the broadcast feature of the Rails logger, but we don’t have to check if the parent logger has the ‘silence` method defined as our logger directly inherits from Ruby base logger.

Links:



153
154
155
# File 'lib/appsignal/logger.rb', line 153

def silence(_severity = ERROR, &block)
  block.call
end

#warn(message = nil, attributes = {}) ⇒ void

This method returns an undefined value.

Log a warn level message

Parameters:

  • message (defaults to: nil)

    Message to log

  • attributes (defaults to: {})

    Attributes to tag the log with



106
107
108
109
110
111
112
113
# File 'lib/appsignal/logger.rb', line 106

def warn(message = nil, attributes = {})
  return if level > WARN

  message = yield if message.nil? && block_given?
  return if message.nil?

  add_with_attributes(WARN, message, @group, attributes)
end