class NewRelic::Agent::AgentLogger
Constants
- LOG_LEVELS
Public Class Methods
Source
# File lib/new_relic/agent/agent_logger.rb, line 183 def self.format_fatal_error(message) "** [NewRelic] FATAL : #{message}\n" end
Source
# File lib/new_relic/agent/agent_logger.rb, line 162 def self.log_level_for(level) LOG_LEVELS.fetch(level.to_s.downcase, ::Logger::INFO) end
Source
# File lib/new_relic/agent/agent_logger.rb, line 17 def initialize(root = '', override_logger = nil) @already_logged_lock = Mutex.new clear_already_logged create_log(root, override_logger) set_log_level! set_log_format! disable_log_instrumentation! gather_startup_logs end
Public Instance Methods
Source
# File lib/new_relic/agent/agent_logger.rb, line 44 def debug(*msgs, &blk) format_and_send(:debug, msgs, &blk) end
Source
# File lib/new_relic/agent/agent_logger.rb, line 32 def error(*msgs, &blk) format_and_send(:error, msgs, &blk) end
Source
# File lib/new_relic/agent/agent_logger.rb, line 28 def fatal(*msgs, &blk) format_and_send(:fatal, msgs, &blk) end
Source
# File lib/new_relic/agent/agent_logger.rb, line 40 def info(*msgs, &blk) format_and_send(:info, msgs, &blk) end
Source
# File lib/new_relic/agent/agent_logger.rb, line 48 def is_startup_logger? @log.is_a?(NullLogger) end
Source
# File lib/new_relic/agent/agent_logger.rb, line 56 def log_exception(level, e, backtrace_level = level) @log.send(level, '%p: %s' % [e.class, e.message]) @log.send(backtrace_level) do backtrace = backtrace_from_exception(e) if backtrace "Debugging backtrace:\n" + backtrace.join("\n ") else 'No backtrace available.' end end end
Use this when you want to log an exception with explicit control over the log level that the backtrace is logged at. If you just want the default behavior of backtraces logged at debug, use one of the methods above and pass an Exception as one of the args.
Source
# File lib/new_relic/agent/agent_logger.rb, line 68 def log_formatter=(formatter) @log.formatter = formatter end
Source
# File lib/new_relic/agent/agent_logger.rb, line 36 def warn(*msgs, &blk) format_and_send(:warn, msgs, &blk) end
Private Instance Methods
Source
# File lib/new_relic/agent/agent_logger.rb, line 74 def backtrace_from_exception(e) # We've seen that often the backtrace on a SystemStackError is bunk # so massage the caller instead at a known depth. # # Tests keep us honest about minimum method depth our log calls add. return caller.drop(5) if e.is_a?(SystemStackError) e.backtrace end
Source
# File lib/new_relic/agent/agent_logger.rb, line 101 def create_log(root, override_logger) if !override_logger.nil? @log = override_logger elsif ::NewRelic::Agent.config[:agent_enabled] == false create_null_logger else if wants_stdout? @log = ::Logger.new(STDOUT) else create_log_to_file(root) end end end
Source
# File lib/new_relic/agent/agent_logger.rb, line 115 def create_log_to_file(root) path = find_or_create_file_path(::NewRelic::Agent.config[:log_file_path], root) if path.nil? @log = ::Logger.new(STDOUT) warn("Error creating log directory #{::NewRelic::Agent.config[:log_file_path]}, using standard out for logging.") else file_path = "#{path}/#{::NewRelic::Agent.config[:log_file_name]}" begin @log = ::Logger.new(file_path) rescue => e @log = ::Logger.new(STDOUT) warn("Failed creating logger for file #{file_path}, using standard out for logging.", e) end end end
Source
# File lib/new_relic/agent/agent_logger.rb, line 131 def create_null_logger @log = ::NewRelic::Agent::NullLogger.new end
Source
# File lib/new_relic/agent/agent_logger.rb, line 175 def disable_log_instrumentation! NewRelic::Agent::Instrumentation::Logger.mark_skip_instrumenting(@log) end
Don’t allow agent logs into agent log forwarding for now
Source
# File lib/new_relic/agent/agent_logger.rb, line 140 def find_or_create_file_path(path_setting, root) for abs_path in [File.expand_path(path_setting), File.expand_path(File.join(root, path_setting))] do if File.directory?(abs_path) || (Dir.mkdir(abs_path) rescue nil) return abs_path[%r{^(.*?)/?$}] end end nil end def set_log_level! @log.level = AgentLogger.log_level_for(::NewRelic::Agent.config[:log_level]) end LOG_LEVELS = { 'debug' => ::Logger::DEBUG, 'info' => ::Logger::INFO, 'warn' => ::Logger::WARN, 'error' => ::Logger::ERROR, 'fatal' => ::Logger::FATAL } def self.log_level_for(level) LOG_LEVELS.fetch(level.to_s.downcase, ::Logger::INFO) end def set_log_format! @hostname = NewRelic::Agent::Hostname.get @prefix = wants_stdout? ? '** [NewRelic]' : '' @log.formatter = proc do |severity, timestamp, progname, msg| "#{@prefix}[#{timestamp.strftime('%F %H:%M:%S %z')} #{@hostname} (#{$$})] #{severity} : #{msg}\n" end end # Don't allow agent logs into agent log forwarding for now def disable_log_instrumentation! NewRelic::Agent::Instrumentation::Logger.mark_skip_instrumenting(@log) end def gather_startup_logs StartupLogger.instance.dump(self) end def self.format_fatal_error(message) "** [NewRelic] FATAL : #{message}\n" end end
Source
# File lib/new_relic/agent/agent_logger.rb, line 85 def format_and_send(level, *msgs, &block) if block return unless @log.send("#{level}?") msgs = Array(yield) end msgs.flatten.each do |item| case item when Exception then log_exception(level, item, :debug) else @log.send(level, item) end end nil end
Allows for passing exceptions in explicitly, which format with backtrace
Source
# File lib/new_relic/agent/agent_logger.rb, line 179 def gather_startup_logs StartupLogger.instance.dump(self) end
Source
# File lib/new_relic/agent/agent_logger.rb, line 166 def set_log_format! @hostname = NewRelic::Agent::Hostname.get @prefix = wants_stdout? ? '** [NewRelic]' : '' @log.formatter = proc do |severity, timestamp, progname, msg| "#{@prefix}[#{timestamp.strftime('%F %H:%M:%S %z')} #{@hostname} (#{$$})] #{severity} : #{msg}\n" end end
Source
# File lib/new_relic/agent/agent_logger.rb, line 150 def set_log_level! @log.level = AgentLogger.log_level_for(::NewRelic::Agent.config[:log_level]) end
Source
# File lib/new_relic/agent/agent_logger.rb, line 135 def wants_stdout? ::NewRelic::Agent.config[:log_file_path].casecmp(NewRelic::STANDARD_OUT) == 0 || ::NewRelic::Agent.config[:'serverless_mode.enabled'] end