diff --git a/src/main/jastadd/backend/Configuration.jadd b/src/main/jastadd/backend/Configuration.jadd
new file mode 100644
index 0000000000000000000000000000000000000000..711ba2511d1e0c8535007cacccac99872128e58f
--- /dev/null
+++ b/src/main/jastadd/backend/Configuration.jadd
@@ -0,0 +1,4 @@
+aspect Configuration {
+  public static boolean ASTNode.loggingEnabledForReads = false;
+  public static boolean ASTNode.loggingEnabledForWrites = false;
+}
diff --git a/src/main/jastadd/backend/Generation.jadd b/src/main/jastadd/backend/Generation.jadd
index e827c68c947baf50b43bf8abfc2651dfc7bced2c..7a134eceef421988a9de954ffa86c3778a891069 100644
--- a/src/main/jastadd/backend/Generation.jadd
+++ b/src/main/jastadd/backend/Generation.jadd
@@ -162,6 +162,11 @@ aspect AspectGeneration {
       .append(connectMethod()).append("(String topic) {\n");
     sb.append(ind(2)).append(mqttUpdaterAttribute()).append("().newConnection(topic, message -> {\n");
     String lastResult = generateMappingApplication(sb, 3, "message");
+    if (loggingEnabledForReads) {
+      sb.append(ind(3)).append("System.out.println(\"[Read] \" + topic + \" -> ")
+        .append(getToken().getName()).append(" = \" + ").append(lastResult)
+        .append(");\n");
+    }
     sb.append(ind(3)).append("set").append(getToken().getName()).append("(").append(lastResult).append(");\n");
     sb.append(ind(2)).append("});\n");
     sb.append(ind(1)).append("}\n\n");
@@ -198,6 +203,10 @@ aspect AspectGeneration {
     // write method
     sb.append(ind(1)).append("protected void ").append(parentTypeName).append(".")
       .append(writeMethod()).append("() {\n");
+    if (loggingEnabledForWrites) {
+      sb.append(ind(2)).append("System.out.println(\"[Write] ").append(getToken().getName())
+        .append(" = \" + ").append(lastValue()).append(" + \" -> ").append(writeTopic()).append("\");\n");
+    }
     // _mqttUpdater().publish(${writeTopic()}, ${lastValue()});
     sb.append(ind(2)).append(mqttUpdaterAttribute()).append("().publish(")
       .append(writeTopic()).append(", ").append(lastValue()).append(");\n");
diff --git a/src/main/java/org/jastadd/ros2rag/compiler/Compiler.java b/src/main/java/org/jastadd/ros2rag/compiler/Compiler.java
index af1076eb7ff423f9e6e4e2ac7715bb8668332d2a..ad4298dbd873ca42b66d85793685b78c91f01e4d 100644
--- a/src/main/java/org/jastadd/ros2rag/compiler/Compiler.java
+++ b/src/main/java/org/jastadd/ros2rag/compiler/Compiler.java
@@ -25,6 +25,8 @@ public class Compiler {
   private StringOption optionInputRos2Rag;
   private FlagOption optionHelp;
   private FlagOption optionVerbose;
+  private FlagOption optionLogReads;
+  private FlagOption optionLogWrites;
 
   private ArrayList<Option<?>> options;
   private CommandLine commandLine;
@@ -143,7 +145,9 @@ public class Compiler {
     optionRootNode = addOption(new StringOption("rootNode", "root node in the base grammar."));
     optionInputRos2Rag = addOption(new StringOption("inputRos2Rag", "ros2rag definition file."));
     optionHelp = addOption(new FlagOption("help", "Print usage and exit."));
-    optionVerbose = addOption(new FlagOption("verbose", "Print more messages."));
+    optionVerbose = addOption(new FlagOption("verbose", "Print more messages while compiling."));
+    optionLogReads = addOption(new FlagOption("logReads", "Enable logging for every read."));
+    optionLogWrites = addOption(new FlagOption("logWrites", "Enable logging for every write."));
   }
 
   private <OptionType extends Option<?>> OptionType addOption(OptionType option) {
@@ -179,6 +183,8 @@ public class Compiler {
     }
     ros2Rag.treeResolveAll();
     ros2Rag.additionalRelations().forEach(inputGrammar::addDeclaration);
+    ASTNode.loggingEnabledForReads = optionLogReads.isSet();
+    ASTNode.loggingEnabledForWrites = optionLogWrites.isSet();
     return ros2Rag;
   }