diff --git a/inventory_provider/tasks/worker.py b/inventory_provider/tasks/worker.py
index dcf1c2a8f8b9bacd9c5d3d11a64da1ec2d7a28de..575dcc2d5e994bcc95e121b44e4783f0df10c3a7 100644
--- a/inventory_provider/tasks/worker.py
+++ b/inventory_provider/tasks/worker.py
@@ -30,6 +30,15 @@ environment.setup_logging()
 logger = logging.getLogger(__name__)
 
 
+def log_entry_and_exit(f):
+    def _w(*args, **kwargs):
+        logger.debug(f'>>> {f.__name__}{args}')
+        try:
+            return f(*args, *kwargs)
+        finally:
+            logger.debug(f'<<< {f.__name__}{args}')
+    return _w
+
 class InventoryTaskError(Exception):
     pass
 
@@ -67,36 +76,25 @@ class InventoryTask(Task):
 
 
 @app.task(base=InventoryTask, bind=True)
+@log_entry_and_exit
 def snmp_refresh_interfaces(self, hostname, community):
-    logger.debug(
-        '>>> snmp_refresh_interfaces(%r, %r)' % (hostname, community))
-
     value = list(snmp.get_router_snmp_indexes(hostname, community))
-
     r = get_next_redis(InventoryTask.config)
     r.set('snmp-interfaces:' + hostname, json.dumps(value))
 
-    logger.debug(
-        '<<< snmp_refresh_interfaces(%r, %r)' % (hostname, community))
-
 
 @app.task(base=InventoryTask, bind=True)
+@log_entry_and_exit
 def netconf_refresh_config(self, hostname):
-    logger.debug('>>> netconf_refresh_config(%r)' % hostname)
-
     netconf_doc = juniper.load_config(hostname, InventoryTask.config["ssh"])
     netconf_str = etree.tostring(netconf_doc, encoding='unicode')
-
     r = get_next_redis(InventoryTask.config)
     r.set('netconf:' + hostname, netconf_str)
 
-    logger.debug('<<< netconf_refresh_config(%r)' % hostname)
-
 
 @app.task(base=InventoryTask, bind=True)
+@log_entry_and_exit
 def update_interfaces_to_services(self):
-    logger.debug('>>> update_interfaces_to_services')
-
     interface_services = defaultdict(list)
     with db.connection(InventoryTask.config["ops-db"]) as cx:
         for service in opsdb.get_circuits(cx):
@@ -117,12 +115,10 @@ def update_interfaces_to_services(self):
             json.dumps(services))
     rp.execute()
 
-    logger.debug('<<< update_interfaces_to_services')
-
 
 @app.task(base=InventoryTask, bind=True)
+@log_entry_and_exit
 def import_unmanaged_interfaces(self):
-    logger.debug('>>> import_unmanaged_interfaces')
 
     def _convert(d):
         # the config file keys are more readable than
@@ -151,12 +147,10 @@ def import_unmanaged_interfaces(self):
                 json.dumps([ifc]))
         rp.execute()
 
-    logger.debug('<<< import_unmanaged_interfaces')
-
 
 @app.task(base=InventoryTask, bind=True)
+@log_entry_and_exit
 def update_access_services(self):
-    logger.debug('>>> update_access_services')
 
     access_services = {}
     with db.connection(InventoryTask.config["ops-db"]) as cx:
@@ -182,12 +176,10 @@ def update_access_services(self):
             json.dumps(service))
     rp.execute()
 
-    logger.debug('<<< update_access_services')
-
 
 @app.task(base=InventoryTask, bind=True)
+@log_entry_and_exit
 def update_lg_routers(self):
-    logger.debug('>>> update_lg_routers')
 
     r = get_next_redis(InventoryTask.config)
     rp = r.pipeline()
@@ -201,13 +193,10 @@ def update_lg_routers(self):
             rp.set(f'opsdb:lg:{router["equipment name"]}', json.dumps(router))
         rp.execute()
 
-    logger.debug('<<< update_lg_routers')
-
 
 @app.task(base=InventoryTask, bind=True)
+@log_entry_and_exit
 def update_equipment_locations(self):
-    logger.debug('>>> update_equipment_locations')
-
     r = get_next_redis(InventoryTask.config)
     rp = r.pipeline()
     for k in r.scan_iter('opsdb:location:*'):
@@ -223,12 +212,10 @@ def update_equipment_locations(self):
             rp.set('opsdb:location:%s' % h, json.dumps(locations))
         rp.execute()
 
-    logger.debug('<<< update_equipment_locations')
-
 
 @app.task(base=InventoryTask, bind=True)
+@log_entry_and_exit
 def update_circuit_hierarchy(self):
-    logger.debug('>>> update_circuit_hierarchy')
 
     # TODO: integers are not JSON keys
     with db.connection(InventoryTask.config["ops-db"]) as cx:
@@ -255,12 +242,10 @@ def update_circuit_hierarchy(self):
             rp.set('opsdb:services:children:%d' % cid, json.dumps(children))
         rp.execute()
 
-    logger.debug('<<< update_circuit_hierarchy')
-
 
 @app.task(base=InventoryTask, bind=True)
+@log_entry_and_exit
 def update_geant_lambdas(self):
-    logger.debug('>>> update_geant_lambdas')
 
     r = get_next_redis(InventoryTask.config)
     rp = r.pipeline()
@@ -276,13 +261,10 @@ def update_geant_lambdas(self):
                 json.dumps(ld))
         rp.execute()
 
-    logger.debug('<<< geant_lambdas')
-
 
 @app.task(base=InventoryTask, bind=True)
-def update_junosspace_device_list(self):
-    logger.debug('>>> update_junosspace_device_list')
-
+@log_entry_and_exit
+def update_neteng_managed_device_list(self):
     self.update_state(
         state=states.STARTED,
         meta={
@@ -314,8 +296,6 @@ def update_junosspace_device_list(self):
         rp.set(k, v)
     rp.execute()
 
-    logger.debug('<<< update_junosspace_device_list')
-
     return {
         'task': 'update_junosspace_device_list',
         'message': 'saved %d managed routers' % len(routers)
@@ -448,9 +428,8 @@ def refresh_juniper_interface_list(hostname, netconf):
 
 
 @app.task(base=InventoryTask, bind=True)
+@log_entry_and_exit
 def reload_router_config(self, hostname):
-    logger.debug('>>> reload_router_config')
-
     self.update_state(
         state=states.STARTED,
         meta={
@@ -520,8 +499,6 @@ def reload_router_config(self, hostname):
 
     clear_cached_classifier_responses(None)
 
-    logger.debug('<<< reload_router_config')
-
     return {
         'task': 'reload_router_config',
         'hostname': hostname,
@@ -559,7 +536,7 @@ def launch_refresh_cache_all(config):
 
     # first batch of subtasks: refresh cached opsdb data
     subtasks = [
-        update_junosspace_device_list.apply_async(),
+        update_neteng_managed_device_list.apply_async(),
         update_interfaces_to_services.apply_async(),
         update_geant_lambdas.apply_async(),
         update_circuit_hierarchy.apply_async()
@@ -619,9 +596,8 @@ def _wait_for_tasks(task_ids, update_callback=lambda s: None):
 
 
 @app.task(base=InventoryTask, bind=True)
+@log_entry_and_exit
 def refresh_finalizer(self, pending_task_ids_json):
-    logger.debug('>>> refresh_finalizer')
-    logger.debug('task_ids: %r' % pending_task_ids_json)
 
     input_schema = {
         "$schema": "http://json-schema.org/draft-07/schema#",
@@ -656,11 +632,9 @@ def refresh_finalizer(self, pending_task_ids_json):
     latch_db(InventoryTask.config)
     _update('latched current/next dbs')
 
-    logger.debug('<<< refresh_finalizer')
-
 
+@log_entry_and_exit
 def _build_service_category_interface_list(update_callback=lambda s: None):
-    logger.debug('>>> _build_interface_services')
 
     def _classify(ifc):
         if ifc['description'].startswith('SRV_MDVPN'):
@@ -688,7 +662,6 @@ def _build_service_category_interface_list(update_callback=lambda s: None):
             json.dumps(ifc))
 
     rp.execute()
-    logger.debug('<<< _build_interface_services')
 
 
 def _build_subnet_db(update_callback=lambda s: None):