Revision 55583fb3
Added by Dmitri Dolguikh over 7 years ago
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
Fixes #18115 - Logger is initialized when Syslog isn't available.