class SemanticLogger::Base
Attributes
Class name to be logged
Class name to be logged
Public Instance Methods
Log
a thread backtrace
# File lib/semantic_logger/base.rb, line 127 def backtrace(thread: Thread.current, level: :warn, message: "Backtrace:", payload: nil, metric: nil, metric_amount: nil) log = Log.new(name, level) return false unless meets_log_level?(log) backtrace = if thread == Thread.current Utils.extract_backtrace(caller) else log.thread_name = thread.name log.tags = (thread[:semantic_logger_tags] || []).clone log.named_tags = (thread[:semantic_logger_named_tags] || {}).clone thread.backtrace end # TODO: Keep backtrace instead of transforming into a text message at this point # Maybe log_backtrace: true if backtrace message += "\n" message << backtrace.join("\n") end if log.assign(message: message, backtrace: backtrace, payload: payload, metric: metric, metric_amount: metric_amount) && !filtered?(log) self.log(log) else false end end
Returns the current log level if set, otherwise it returns the global default log level
# File lib/semantic_logger/base.rb, line 33 def level @level || SemanticLogger.default_level end
Set the logging level for this logger
Note: This level is only for this particular instance. It does not override
the log level in any logging instance or the default log level SemanticLogger.default_level
Must be one of the values in SemanticLogger::LEVELS, or nil if this logger instance should use the global default level
# File lib/semantic_logger/base.rb, line 20 def level=(level) if level.nil? # Use the global default level for this logger @level_index = nil @level = nil else @level_index = Levels.index(level) @level = Levels.level(@level_index) end end
Dynamically supply the log level with every measurement call
# File lib/semantic_logger/base.rb, line 114 def measure(level, message, params = {}, &block) index = Levels.index(level) if level_index <= index measure_internal(level, index, message, params, &block) elsif block yield(params) end end
Add the tags or named tags to the list of tags to log for this thread whilst the supplied block is active.
Returns result of block.
Tagged example:
SemanticLogger.tagged(12345, 'jack') do logger.debug('Hello World') end
Named Tags (Hash) example:
SemanticLogger.tagged(tracking_number: 12345) do logger.debug('Hello World') end
Notes:
-
Named tags are the recommended approach since the tag consists of a name value pair this is more useful than just a string value in the logs, or centralized logging system.
-
This method is slow when using multiple text tags since it needs to flatten the tags and remove empty elements to support Rails 4.
-
It is recommended to keep tags as a list without any empty values, or contain any child arrays. However, this api will convert:
`logger.tagged([['first', nil], nil, ['more'], 'other'])`
to:
`logger.tagged('first', 'more', 'other')`
-
For better performance with clean tags, see `SemanticLogger.tagged`.
# File lib/semantic_logger/base.rb, line 189 def tagged(*tags, &block) # Allow named tags to be passed into the logger if tags.size == 1 tag = tags[0] return yield if tag.nil? || tag == "" return tag.is_a?(Hash) ? SemanticLogger.named_tagged(tag, &block) : SemanticLogger.fast_tag(tag.to_s, &block) end # Need to flatten and reject empties to support calls from Rails 4 new_tags = tags.flatten.collect(&:to_s).reject(&:empty?) SemanticLogger.tagged(*new_tags, &block) end