lib/gooddata/bricks/middleware/logger_middleware.rb
# encoding: UTF-8
#
# Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
# This source code is licensed under the BSD-style license found in the
# LICENSE file in the root directory of this source tree.
require 'logger'
require 'gooddata/core/splunk_logger_decorator'
require 'gooddata/extensions/true'
require 'gooddata/extensions/false'
require 'gooddata/extensions/integer'
require 'gooddata/extensions/string'
require 'gooddata/extensions/nil'
require 'remote_syslog_logger'
using TrueExtensions
using FalseExtensions
using IntegerExtensions
using StringExtensions
using NilExtensions
require_relative 'base_middleware'
require_relative 'mask_logger_decorator'
require_relative 'context_logger_decorator'
module GoodData
module Bricks
class LoggerMiddleware < Bricks::Middleware
def call(params)
params = params.to_hash
if params['GDC_LOGGING_OFF']
logger = NilLogger.new
elsif params['GDC_LOG_DIRECTORY'] && params['GDC_EXECUTION_ID']
log_directory = params['GDC_LOG_DIRECTORY']
execution_id = params['GDC_EXECUTION_ID']
FileUtils.mkpath log_directory
execution_log_path = params['GDC_EXECUTION_LOG_PATH'].nil? ? "#{log_directory}/#{execution_id}.log" : params['GDC_EXECUTION_LOG_PATH']
logger = Logger.new(execution_log_path)
logger.level = params['GDC_LOG_LEVEL'] || 'info'
values_to_mask = params['values_to_mask'] || []
logger = MaskLoggerDecorator.new(logger, values_to_mask)
else
logger = params[:GDC_LOGGER_FILE].nil? ? Logger.new(STDOUT) : Logger.new(params[:GDC_LOGGER_FILE])
logger.level = params['GDC_LOG_LEVEL'] || 'info'
end
GoodData.logger = logger
request_id = params.include?('GDC_REQUEST_ID') ? ", request_id=#{params['GDC_REQUEST_ID']}" : ''
logger.info("Pipeline starts #{request_id}")
params['GDC_LOGGER'] = logger
GoodData.logging_http_on if params['HTTP_LOGGING'] && params['HTTP_LOGGING'].to_b
unless params['NO_SPLUNK_LOGGING'] && params['NO_SPLUNK_LOGGING'].to_b
GoodData.logger.info "Statistics collecting is turned ON. All the data is anonymous."
# NODE_NAME is set up by k8s execmgr
syslog_node = ENV['NODE_NAME']
splunk_file_logger = syslog_node ? RemoteSyslogLogger.new(syslog_node, 514, program: "lcm_ruby_brick", facility: 'local2') : Logger.new(STDOUT)
splunk_logger = SplunkLoggerDecorator.new splunk_file_logger
splunk_logger.level = params['SPLUNK_LOG_LEVEL'] || GoodData::DEFAULT_SPLUNKLOG_LEVEL
splunk_logger = splunk_logger.extend(ContextLoggerDecorator)
splunk_logger.context_source = GoodData.gd_logger
splunk_logger = MaskLoggerDecorator.new(splunk_logger, params)
GoodData.splunk_logging_on splunk_logger
end
# Initialize context: Execution ID
GoodData.gd_logger.execution_id = params['GDC_EXECUTION_ID'] || SecureRandom.urlsafe_base64(16)
returning(@app.call(params)) do |_result|
logger.info('Pipeline ending')
end
end
end
end
end