diff --git a/inventory_provider/__init__.py b/inventory_provider/__init__.py
index 024fac841eb30cde1e859612856db2bc2b1e1293..069799fe18f8a1c53337cdf3acb54e1e172cf939 100644
--- a/inventory_provider/__init__.py
+++ b/inventory_provider/__init__.py
@@ -5,6 +5,7 @@ import logging
 import os
 from flask import Flask
 
+from inventory_provider import environment
 
 def create_app():
     """
@@ -21,6 +22,8 @@ def create_app():
     app = Flask(__name__)
     app.secret_key = "super secret session key"
 
+    environment.setup_logging()
+
     from inventory_provider.routes import default
     app.register_blueprint(default.routes, url_prefix='/')
 
diff --git a/inventory_provider/logging_default_config.json b/inventory_provider/logging_default_config.json
index ba3f1eb38510e597063d1d27ceddbea4c0286f10..38f4e61c5e489ccbac2d3a76d4d7354b33fea4ed 100644
--- a/inventory_provider/logging_default_config.json
+++ b/inventory_provider/logging_default_config.json
@@ -56,7 +56,7 @@
     },
 
     "root": {
-        "level": "WARNING",
+        "level": "DEBUG",
         "handlers": ["console", "syslog_handler"]
     }
 }
\ No newline at end of file
diff --git a/inventory_provider/routes/classifier.py b/inventory_provider/routes/classifier.py
index 90b8d9da37648f7af1c3455221d274efaa842e8e..ccf3a0163a8a67373604b5605f97819acf27a2f8 100644
--- a/inventory_provider/routes/classifier.py
+++ b/inventory_provider/routes/classifier.py
@@ -38,6 +38,11 @@ def handle_request_error(error):
         status=error.status_code)
 
 
+@routes.after_request
+def after_request(resp):
+    return common.after_request(resp)
+
+
 def base_interface_name(interface):
     m = re.match(r'(.*?)(\.\d+)?$', interface)
     assert m  # sanity: anything should match
diff --git a/inventory_provider/routes/common.py b/inventory_provider/routes/common.py
index c51ac11776ddb891a30b865b30f8176e5cf799c0..9e99eb348be42952cb508aa99cba389ef9f8839c 100644
--- a/inventory_provider/routes/common.py
+++ b/inventory_provider/routes/common.py
@@ -1,8 +1,11 @@
 import functools
+import logging
 
 from flask import request, Response, current_app, g
 import redis
 
+logger = logging.getLogger(__name__)
+
 
 def get_redis():
     if 'redis_db' not in g:
@@ -31,3 +34,26 @@ def require_accepts_json(f):
                 mimetype="text/html")
         return f(*args, **kwargs)
     return decorated_function
+
+
+def after_request(response):
+    """
+    generic function to do additional logging of requests & responses
+    :param response:
+    :return:
+    """
+    if response.status_code != 200:
+
+        try:
+            data = response.data.decode('utf-8')
+        except Exception:
+            # never expected to happen, but we don't want any failures here
+            logging.exception('INTERNAL DECODING ERROR')
+            data = 'decoding error (see logs)'
+
+        logger.warning('"%s %s" "%s" %s' % (
+            request.method,
+            request.path,
+            data,
+            str(response.status_code)))
+    return response
diff --git a/inventory_provider/routes/data.py b/inventory_provider/routes/data.py
index 258f05ea1352c3e4b73c79c2ad3f4caceb935b5f..905b2cdedf9895494399183a1a2da052e0074d11 100644
--- a/inventory_provider/routes/data.py
+++ b/inventory_provider/routes/data.py
@@ -10,6 +10,11 @@ from inventory_provider.db import opsdb
 routes = Blueprint("inventory-data-query-routes", __name__)
 
 
+@routes.after_request
+def after_request(resp):
+    return common.after_request(resp)
+
+
 @routes.route("/routers", methods=['GET', 'POST'])
 @common.require_accepts_json
 def routers():
diff --git a/inventory_provider/routes/default.py b/inventory_provider/routes/default.py
index fd480bac9c3f76db58d4cc5e854bc9459d343c80..5b4c6b92c4d1b6a87d97b175beb40cee4932612b 100644
--- a/inventory_provider/routes/default.py
+++ b/inventory_provider/routes/default.py
@@ -8,6 +8,11 @@ routes = Blueprint("inventory-data-default-routes", __name__)
 API_VERSION = '0.1'
 
 
+@routes.after_request
+def after_request(resp):
+    return common.after_request(resp)
+
+
 @routes.route("/version", methods=['GET', 'POST'])
 @common.require_accepts_json
 def version():
diff --git a/inventory_provider/routes/jobs.py b/inventory_provider/routes/jobs.py
index a02ddea1582347b1296deb1aac797054e5694aca..dc90269f868c22b2fdc5a80e513dd55acdb4c610 100644
--- a/inventory_provider/routes/jobs.py
+++ b/inventory_provider/routes/jobs.py
@@ -5,6 +5,11 @@ from inventory_provider.routes import common
 routes = Blueprint("inventory-data-job-routes", __name__)
 
 
+@routes.after_request
+def after_request(resp):
+    return common.after_request(resp)
+
+
 @routes.route("/update", methods=['GET', 'POST'])
 @common.require_accepts_json
 def update():
diff --git a/inventory_provider/routes/poller.py b/inventory_provider/routes/poller.py
index d644272fde99d988c445e0604eb6e1105c3d15ab..93179717b4ce524fac454964bacf2016e40d0ebd 100644
--- a/inventory_provider/routes/poller.py
+++ b/inventory_provider/routes/poller.py
@@ -8,6 +8,11 @@ from inventory_provider.routes import common
 routes = Blueprint('poller-support-routes', __name__)
 
 
+@routes.after_request
+def after_request(resp):
+    return common.after_request(resp)
+
+
 @routes.route('/interfaces/<hostname>', methods=['GET', 'POST'])
 @common.require_accepts_json
 def poller_interface_oids(hostname):