diff --git a/python/dune/perftool/compile.py b/python/dune/perftool/compile.py
index b033ea3efca29472167a61acdaef8754239abdfc..1cfc540a42e72ae64b1d47178c1e8cc34bc28d66 100644
--- a/python/dune/perftool/compile.py
+++ b/python/dune/perftool/compile.py
@@ -5,6 +5,14 @@ Should also contain the entrypoint methods.
 """
 from __future__ import absolute_import
 
+
+# Configure loggers
+import logging.config
+from os import path
+log_file_path = path.join(path.dirname(path.abspath(__file__)), 'logging.conf')
+logging.config.fileConfig(log_file_path)
+
+
 import loopy
 
 from ufl.algorithms import compute_form_data, read_ufl_file
diff --git a/python/dune/perftool/pdelab/localoperator.py b/python/dune/perftool/pdelab/localoperator.py
index 215fe5cb2e159a106e8a1c81f90a5068cee1af19..ae938f900f070abde562e6453211baa45bd76fb6 100644
--- a/python/dune/perftool/pdelab/localoperator.py
+++ b/python/dune/perftool/pdelab/localoperator.py
@@ -1,6 +1,8 @@
 from __future__ import absolute_import
 from os.path import splitext
 
+import logging
+
 from dune.perftool.options import get_option
 from dune.perftool.generation import (backend,
                                       base_class,
@@ -411,15 +413,20 @@ def visit_integrals(integrals):
 
 
 def generate_kernel(integrals):
+    logger = logging.getLogger(__name__)
+
     # Visit all integrals once to collect information (dry-run)!
+    logger.debug('generate_kernel: visit_integrals (dry run)')
     with global_context(dry_run=True):
         visit_integrals(integrals)
 
     # Now perform some checks on what should be done
     from dune.perftool.sumfact.vectorization import decide_vectorization_strategy
+    logger.debug('generate_kernel: decide_vectorization_strategy')
     decide_vectorization_strategy()
 
     # Delete the cache contents and do the real thing!
+    logger.debug('generate_kernel: visit_integrals (no dry run)')
     from dune.perftool.generation import delete_cache_items
     delete_cache_items("kernel_default")
     visit_integrals(integrals)
@@ -645,6 +652,8 @@ def cgen_class_from_cache(tag, members=[]):
 
 
 def generate_localoperator_kernels(formdata, data):
+    logger = logging.getLogger(__name__)
+
     # Extract the relevant attributes of the form data
     form = formdata.preprocessed_form
 
@@ -688,9 +697,11 @@ def generate_localoperator_kernels(formdata, data):
     # Have a data structure collect the generated kernels
     operator_kernels = {}
 
+    logger.info("generate_localoperator_kernels: create residual methods")
     with global_context(form_type='residual'):
         # Generate the necessary residual methods
         for measure in set(i.integral_type() for i in form.integrals()):
+            logger.info("generate_localoperator_kernels: measure {}".format(measure))
             with global_context(integral_type=measure):
                 enum_pattern()
                 pattern_baseclass()
@@ -743,6 +754,7 @@ def generate_localoperator_kernels(formdata, data):
 
                 operator_kernels[(measure, 'residual')] = kernel
 
+    logger.info("generate_localoperator_kernels: create jacobian methods")
     # Generate the necessary jacobian methods
     if not get_option("numerical_jacobian"):
         from ufl import derivative