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'])