lib/addy_lambda/common.rb in addy_lambda-0.1.4 vs lib/addy_lambda/common.rb in addy_lambda-0.1.5

- old
+ new

@@ -1,17 +1,61 @@ require 'json' +require 'logger' module AddyLambda # Generic methods such as logging, error handling HTTP requests etc. class Common VARIABLE_DIRECT = 'direct'.freeze VARIABLE_QUERYSTRING = 'querystring'.freeze - def self.generic_log(logger, event, context) + def self.generic_log(logger, event, context, safe_to_log_override = {}) + # Dictionary to allow certain keys to be logged + # safe_to_log["key"] = True + + safe_to_log = {} + + # Override the dictionar (add or change allowed items) + safe_to_log.update(safe_to_log_override) + + # logger.info('## ENVIRONMENT VARIABLES\r' + + # jsonpickle.encode(dict(**os.environ))) + # + # logger = self.logger + logged_event = recoursive_clean(event, nil, safe_to_log) logger.debug('## EVENT') - logger.debug(event.inspect) + logger.debug(logged_event.to_json) logger.debug('## CONTEXT') - logger.debug(context.inspect) + logger.debug(context.inspect.to_json) + # logger.info("## EVENT\r#{logged_event.to_json}") + # logger.info("## CONTEXT\r#{context.to_json}") + end + + def self.recoursive_clean(obj, key, safe_to_log) + if obj.is_a?(Hash) + # Recoursively run for dictionary objects + # return {k: recoursive_clean(v, k, safe_to_log) for k, v in obj.items()} + obj.map { |k, v| { k => recoursive_clean(v, k, safe_to_log) } } + elsif obj.is_a?(Array) + # Recoursively run for arrays + # return [recoursive_clean(v, None, safe_to_log) for v in obj] + obj.map { |v| [recoursive_clean(v, key, safe_to_log)] } + elsif !!safe_to_log[key] || (key.to_s.strip.downcase.end_with?('id') && !safe_to_log.key?(key)) + # If the key is safe to log, and is specified as True, or if it's not specified but ends with "id" + obj + elsif !obj.nil? && (!!obj == obj || obj.is_a?(String) && %w[yes no].include?(obj.strip.downcase)) + # If it's "yes" / "no" or a boolean, it's safe to log. + obj + elsif obj.nil? + # Null can be logged + nil + elsif obj.is_a?(String) && obj.strip.empty? + # An empty string can be logged + '' + else + # Anything else becomes a "?" + # Note: This means that a number will become a "?" string. + '?' + end end def self.get_body_as_object(event) if event.key?('body') and event['body'].is_a? String JSON.parse(event['body'])