This NodeLogger implementation is backed
by the Ruby stdlib logger
class, and uses a separate logger
instance for trace
logging in order to physically segregate
messages at the trace
level.
The logger uses the following config keys:
PLATFORM_LOG_FILE - The absolute path to the primary log file (default: /var/log/openshift/node/platform.log) PLATFORM_LOG_LEVEL - The log level for the primary logger (default: DEBUG) PLATFORM_TRACE_LOG_FILE - The absolute path to the trace log file (default: /var/log/openshift/node/platform-trace.log) PLATFORM_TRACE_LOG_LEVEL - The log level for the trace logger (default: INFO)
Note: File IO for the underlying loggers is synchronous.
# File lib/openshift-origin-node/utils/logger/split_trace_logger.rb, line 53 def initialize(config, context, profiles = nil) @config = config @context = context @profiles = profiles || @@DEFAULT_PROFILES reinitialize end
# File lib/openshift-origin-node/utils/logger/split_trace_logger.rb, line 70 def debug(*args, &block) @logger.info(*args, &block) end
# File lib/openshift-origin-node/utils/logger/split_trace_logger.rb, line 78 def error(*args, &block) @logger.error(*args, &block) end
# File lib/openshift-origin-node/utils/logger/split_trace_logger.rb, line 82 def fatal(*args, &block) @logger.fatal(*args, &block) end
# File lib/openshift-origin-node/utils/logger/split_trace_logger.rb, line 66 def info(*args, &block) @logger.info(*args, &block) end
# File lib/openshift-origin-node/utils/logger/split_trace_logger.rb, line 61 def reinitialize @logger = build_logger(@profiles[:standard]) @trace_logger = build_logger(@profiles[:trace]) end
# File lib/openshift-origin-node/utils/logger/split_trace_logger.rb, line 86 def trace(*args, &block) @trace_logger.info(*args, &block) end
# File lib/openshift-origin-node/utils/logger/split_trace_logger.rb, line 74 def warn(*args, &block) @logger.warn(*args, &block) end
# File lib/openshift-origin-node/utils/logger/split_trace_logger.rb, line 93 def build_logger(profile) begin # Use defaults log_file = profile[:default_file] log_level = profile[:default_level] # Override defaults with configs if possible begin config_log_file = @config.get(profile[:file_config]) config_log_level = @config.get(profile[:level_config]) if config_log_level && Logger::Severity.const_defined?(config_log_level) log_level = Logger::Severity.const_get(config_log_level) end if config_log_file log_file = config_log_file end rescue => e # just use the defaults Logger.new(STDERR).error { "Failed to apply logging configuration #{profile}: #{e.message}" } end FileUtils.mkpath(File.dirname(log_file)) unless File.exist? File.dirname(log_file) orig_umask = File.umask(0) file = File.open(log_file, File::WRONLY | File::APPEND| File::CREAT, 0660) File.umask(orig_umask) file.sync = true logger = Logger.new(file, 5, 10 * 1024 * 1024) logger.level = log_level logger.formatter = proc do |severity, datetime, progname, msg| "#{datetime.strftime("%B %d %H:%M:%S")} #{severity} #{msg}\n" end logger rescue Exception => e # If all else fails, use a STDOUT logger Logger.new(STDERR).error { "Failed to create logger; falling back to STDOUT: #{e.message}" } Logger.new(STDOUT) end end