Project

General

Profile

« Previous | Next » 

Revision 55583fb3

Added by Dmitri Dolguikh over 7 years ago

Fixes #18115 - Logger is initialized when Syslog isn't available.

View differences:

lib/proxy/log.rb
require 'logger'
require 'proxy/log_buffer/decorator'
begin
require 'syslog/logger'
::Syslog::Logger.class_eval { alias_method :write, :info }
rescue LoadError # rubocop:disable Lint/HandleExceptions
# ignore, syslog isn't available on this platform
end
# rubocop:enable Lint/HandleExceptions
# ::Rack::CommonLogger expects loggers to implement 'write' method
Logger.class_eval { alias_method :write, :info }
......
end
end
class SyslogFormatter < Syslog::Logger::Formatter
Format = "<%s> %s\n".freeze
begin
require 'syslog/logger'
::Syslog::Logger.class_eval { alias_method :write, :info }
def call(severity, time, progname, msg)
request_id.empty? ? clean(msg) : Format % [request_id[0..7], clean(msg)]
end
class SyslogFormatter < Syslog::Logger::Formatter
Format = "<%s> %s\n".freeze
def request_id
Thread.current.thread_variable_get(:request_id).to_s
def call(severity, time, progname, msg)
request_id.empty? ? clean(msg) : Format % [request_id[0..7], clean(msg)]
end
def request_id
Thread.current.thread_variable_get(:request_id).to_s
end
end
@syslog_available = true
rescue LoadError
# ignore, syslog isn't available on this platform
@syslog_available = false
end
def self.logger
if log_file.casecmp('STDOUT').zero?
if SETTINGS.daemon
puts "Settings log_file=STDOUT and daemon=true are incompatible, exiting..."
exit 1
exit(1)
end
logger = ::Logger.new(STDOUT)
logger = stdout_logger
elsif log_file.casecmp('SYSLOG').zero?
begin
logger = ::Syslog::Logger.new 'foreman-proxy'
rescue
logger = default_logger(log_file)
puts "'SYSLOG' logger is not supported on this platform, using file-based logger instead"
unless syslog_available?
puts "'SYSLOG' logger is not supported on this platform, please use STDOUT or a file-based logger. Exiting..."
exit(1)
end
logger = syslog_logger
else
logger = default_logger(log_file)
end
logger.formatter = logger.instance_of?(::Syslog::Logger) ? SyslogFormatter.new : LogFormatter.new
logger.level = ::Logger.const_get(::Proxy::SETTINGS.log_level.upcase)
logger
end
def self.default_logger(log_file)
# We keep the last 6 10MB log files
::Logger.new(log_file, 6, 1024*1024*10)
logger = ::Logger.new(log_file, 6, 1024*1024*10)
logger.formatter = LogFormatter.new
logger
rescue Exception => e
puts "Unable to configure file-based logger: #{e.message}. Exiting..."
exit(1)
end
def self.stdout_logger
logger = ::Logger.new(STDOUT)
logger.formatter = LogFormatter.new
logger
end
def self.syslog_logger
logger = ::Syslog::Logger.new 'foreman-proxy'
logger.formatter = SyslogFormatter.new
logger
end
def self.syslog_available?
!!@syslog_available
end
def self.log_file
test/log_buffer/logger_factory_test.rb
def test_should_configure_syslog
@factory.stubs(:log_file).returns('SYSLOG')
@factory.expects(:syslog_available?).returns(true)
logger = @factory.logger
assert logger.is_a?(::Syslog::Logger)
assert logger.formatter.is_a?(::Proxy::LoggerFactory::SyslogFormatter)
end
def test_should_fallback_logger_when_syslog_is_not_available
@factory.stubs(:log_file).returns('SYSLOG')
::Syslog::Logger.expects(:new).raises(RuntimeError)
logger = @factory.logger
assert logger.is_a?(::Logger)
assert logger.formatter.is_a?(::Proxy::LoggerFactory::LogFormatter)
end
end

Also available in: Unified diff