Skip to content

Commit

Permalink
Refs #26561 - fixed log stack shutdown
Browse files Browse the repository at this point in the history
  • Loading branch information
lzap committed Sep 24, 2020
1 parent 7818e31 commit 6d8bd08
Show file tree
Hide file tree
Showing 10 changed files with 50 additions and 46 deletions.
1 change: 0 additions & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ else
gem 'rack', '>= 1.1'
gem 'sinatra'
end
gem 'logging-journald', '~> 2.0', :platforms => [:ruby]

# load bundler.d
Dir["#{File.dirname(__FILE__)}/bundler.d/*.rb"].each do |bundle|
Expand Down
5 changes: 3 additions & 2 deletions config/settings.yml.example
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,9 @@
# Log level, one of UNKNOWN, FATAL, ERROR, WARN, INFO, DEBUG
#:log_level: ERROR

# The maximum size of a log file before it's rolled (in MiB)
#:file_rolling_size: 100
# The maximum size of a log file before it's rolled (in MiB) or zero to disable file rolling
# and rely on logrotate or similar tool
#:file_rolling_size: 0

# The maximum age of a log file before it's rolled (in seconds). Also accepts 'daily', 'weekly', or 'monthly'.
#:file_rolling_age: weekly
Expand Down
8 changes: 5 additions & 3 deletions lib/smart_proxy_dynflow_core/api.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@ class Api < ::Sinatra::Base
helpers Helpers

configure do
::Sinatra::Base.set :logging, false
::Sinatra::Base.use ::SmartProxyDynflowCore::RequestIdMiddleware
::Sinatra::Base.use ::SmartProxyDynflowCore::LoggerMiddleware
if Settings.instance.standalone
::Sinatra::Base.set :logging, false
::Sinatra::Base.use ::SmartProxyDynflowCore::RequestIdMiddleware
::Sinatra::Base.use ::SmartProxyDynflowCore::LoggerMiddleware
end
end

before do
Expand Down
4 changes: 3 additions & 1 deletion lib/smart_proxy_dynflow_core/launcher.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,15 @@ def self.launch!(options)
end

def start(options)
load_settings!(options)
Settings.instance.standalone = true
load_settings!(options)
install_usr1_trap
Rack::Server.new(rack_settings).start do |_server|
SmartProxyDynflowCore::Core.ensure_initialized
::SdNotify.ready
end
Log.instance.info "Finished shutting down"
Logging.shutdown
end

def load_settings!(options = {})
Expand Down
46 changes: 30 additions & 16 deletions lib/smart_proxy_dynflow_core/log.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,25 @@
require 'logging'

module SmartProxyDynflowCore
class ReopenAppender < ::Logging::Appender
def initialize(name, logger, opts = {})
@reopen = false
@logger = logger
super(name, opts)
end

def set(status = true)
@reopen = status
end

def append(_event)
if @reopen
Logging.reopen
@reopen = false
end
end
end

class Log
BASE_LOG_SIZE = 1024 * 1024 # 1 MiB
LOGGER_NAME = 'dynflow-core'.freeze
Expand All @@ -11,7 +30,6 @@ class Log
rescue LoadError
@syslog_available = false
end
@reopen = false

class << self
def reload!
Expand All @@ -22,29 +40,21 @@ def reload!
end

def reopen
return if @logger.nil?
return if @logger.nil? || @reopen.nil?
if Settings.instance.log_file !~ /^(STDOUT|SYSLOG|JOURNALD?)$/i
@logger.warn "Scheduled log file reopen"
@reopen = true
else
@logger.debug "Not scheduling log file reopen (no file appender)"
@reopen.set
end
end

def handle_reopen
@logger.warn "Performing log file reopen"
@reopen = false
@logger.appenders.each(&:reopen)
@logger.warn "Finished log file reopen"
end

def instance
handle_reopen if @reopen
return ::Proxy::LogBuffer::Decorator.instance unless Settings.instance.standalone
return @logger if @logger
layout = Logging::Layouts.pattern(pattern: Settings.instance.file_logging_pattern + "\n")
notime_layout = Logging::Layouts.pattern(pattern: Settings.instance.system_logging_pattern + "\n")
log_file = Settings.instance.log_file
log_file = Settings.instance.log_file || ''
@logger = Logging.logger[LOGGER_NAME]
@reopen = ReopenAppender.new("Reopen dummy appender", @logger)
@logger.add_appenders(@reopen)
if !Settings.instance.loaded || log_file.casecmp('STDOUT').zero?
@logger.add_appenders(Logging.appenders.stdout(LOGGER_NAME, layout: layout))
elsif log_file.casecmp('SYSLOG').zero?
Expand All @@ -65,7 +75,11 @@ def instance
keep = Settings.instance.file_rolling_keep
size = BASE_LOG_SIZE * Settings.instance.file_rolling_size
age = Settings.instance.file_rolling_age
@logger.add_appenders(Logging.appenders.rolling_file(LOGGER_NAME, layout: layout, filename: log_file, keep: keep, size: size, age: age, roll_by: 'date'))
if size > 0
@logger.add_appenders(Logging.appenders.rolling_file(LOGGER_NAME, layout: layout, filename: log_file, keep: keep, size: size, age: age, roll_by: 'number'))
else
@logger.add_appenders(Logging.appenders.file(LOGGER_NAME, layout: layout, filename: log_file))
end
rescue ArgumentError => ae
@logger.add_appenders(Logging.appenders.stdout(LOGGER_NAME, layout: layout))
@logger.warn "Log file #{log_file} cannot be opened. Falling back to STDOUT: #{ae}"
Expand Down
2 changes: 1 addition & 1 deletion lib/smart_proxy_dynflow_core/logger_middleware.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ def call(env)
@logger.debug { 'Headers: ' + env.select { |k, v| k.start_with? 'HTTP_' }.inspect }
if @logger.debug? && env['rack.input']
body = env['rack.input'].read
@logger.debug body.empty? ? '' : 'Body: ' + body
@logger.debug('Body: ' + body) unless body.empty?
env['rack.input'].rewind
end
status, = @app.call(env)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ def restore_current_request_id
unless (restored_id = action.input[:current_request_id]).nil?
old_id = ::Logging.mdc['request']
if !old_id.nil? && old_id != restored_id
action.action_logger.warn(_('Changing request id %{request_id} to saved id %{saved_id}') % { :saved_id => restored_id, :request_id => old_id })
action.action_logger.warn('Changing request id %{request_id} to saved id %{saved_id}' % { :saved_id => restored_id, :request_id => old_id })
end
::Logging.mdc['request'] = restored_id
end
Expand Down
2 changes: 1 addition & 1 deletion lib/smart_proxy_dynflow_core/settings.rb
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ class Settings < OpenStruct
:file_logging_pattern => '%d %.8X{request} [%.1l] %m',
:system_logging_pattern => '%.8X{request} [%.1l] %m',
:file_rolling_keep => 6,
:file_rolling_size => 100,
:file_rolling_size => 0,
:file_rolling_age => 'weekly'
}.freeze

Expand Down
16 changes: 0 additions & 16 deletions lib/smart_proxy_dynflow_core/test_action.rb

This file was deleted.

10 changes: 6 additions & 4 deletions smart_proxy_dynflow.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,12 @@ Gem::Specification.new do |gem|
gem.require_paths = ["lib"]
gem.license = 'GPL-3.0'

gem.add_runtime_dependency "logging"

gem.add_development_dependency "bundler", ">= 1.7"
gem.add_development_dependency('minitest')
gem.add_development_dependency('mocha', '~> 1')
gem.add_development_dependency('rack-test', '~> 0')
gem.add_development_dependency 'minitest'
gem.add_development_dependency 'mocha', '~> 1'
gem.add_development_dependency 'rack-test', '~> 0'
gem.add_development_dependency "rake", "~> 10.0"
gem.add_development_dependency('webmock', '~> 1')
gem.add_development_dependency 'webmock', '~> 1'
end

0 comments on commit 6d8bd08

Please sign in to comment.