diff --git a/include/aidge/utils/Log.hpp b/include/aidge/utils/Log.hpp
index 005232cd54c361f0ea47b0778d71aef35d6df181..f20a619c21f611fdbff9ce0cd4c912c0fcd54a9d 100644
--- a/include/aidge/utils/Log.hpp
+++ b/include/aidge/utils/Log.hpp
@@ -21,6 +21,12 @@
 #include "aidge/utils/Attributes.hpp"
 
 namespace Aidge {
+/**
+ * Helper to define a context anywhere, hidding the scoped variable name
+ * which has no relevance.
+*/
+#define AIDGE_LOG_CONTEXT(...) const Log::Context logContext_##__LINE__(__VA_ARGS__)
+
 /**
  * Aidge logging class, for displaying and file logging of events.
 */
@@ -35,6 +41,18 @@ public:
         Fatal
     };
 
+    class Context {
+    public:
+        template <typename... Args>
+        Context(Args&&... args) {
+            Log::mContext.push_back(fmt::format(std::forward<Args>(args)...));
+        }
+
+        ~Context() {
+            Log::mContext.pop_back();
+        }
+    };
+
     /**
      * Detailed messages for debugging purposes, providing information helpful 
      * for developers to trace and identify issues.
@@ -144,6 +162,7 @@ private:
     static Level mFileLevel;
     static std::string mFileName;
     static std::unique_ptr<FILE, decltype(&std::fclose)> mFile;
+    static std::vector<std::string> mContext;
 };
 }
 
diff --git a/src/scheduler/Scheduler.cpp b/src/scheduler/Scheduler.cpp
index 5a056ff3a6ab3609b0b5f74ad87a7583a891b4e5..e60103b7fef42536573c70ecd9c15d0868372753 100644
--- a/src/scheduler/Scheduler.cpp
+++ b/src/scheduler/Scheduler.cpp
@@ -139,6 +139,8 @@ std::vector<std::shared_ptr<Aidge::Scheduler::StaticSchedulingElement>> Aidge::S
 
             bool isRunnable = true;
             for (IOIndex_t inputIdx = 0; inputIdx < consumer->nbInputs(); ++inputIdx) {
+                AIDGE_LOG_CONTEXT("Consumer node {} input #{}", namePtrTable.at(consumer), inputIdx);
+
                 if ((consumer->getOperator()->getNbConsumedData(inputIdx) + consumer->getOperator()->getNbRequiredData(inputIdx)) >
                             getNbAvailableData(consumer, inputIdx)) {
                     Log::debug("  not runnable: C{} + R{} > P{} for input #{}",
@@ -205,6 +207,8 @@ std::vector<std::shared_ptr<Aidge::Scheduler::StaticSchedulingElement>> Aidge::S
             // have been exhausted.
             bool isStillConsumer = false;
             for (IOIndex_t inputIdx = 0; inputIdx < consumer->nbInputs(); ++inputIdx) {
+                AIDGE_LOG_CONTEXT("Consumer node {} input #{}", namePtrTable.at(consumer), inputIdx);
+
                 if (consumer->getOperator()->getNbConsumedData(inputIdx) <
                             getNbAvailableData(consumer, inputIdx)) {
                     Log::debug("  still consumer: C{} < P{} for input #{}",
@@ -226,6 +230,9 @@ std::vector<std::shared_ptr<Aidge::Scheduler::StaticSchedulingElement>> Aidge::S
                         IOIndex_t inputIdx = 0;
                         for (const auto& childParent : child->getParents()) {
                             if (childParent == consumer) {
+                                AIDGE_LOG_CONTEXT("Consumer node {} input #{} / Producer node {} output #{}",
+                                    namePtrTable.at(child), inputIdx, namePtrTable.at(consumer), outId);
+
                                 if (child->getOperator()->getNbConsumedData(inputIdx) < consumer->getOperator()->getNbProducedData(outId)) {
                                     isProducer = true;
                                     break;
@@ -645,32 +652,36 @@ Aidge::Scheduler::PriorProducersConsumers Aidge::Scheduler::getPriorProducersCon
 
     IOIndex_t inputIdx = 0;
     for (const auto& parent : node->inputs()) {
-        if (parent.first &&
-            (node->getOperator()->getNbConsumedData(inputIdx) + node->getOperator()->getNbRequiredData(inputIdx)) >
-                    parent.first->getOperator()->getNbProducedData(parent.second))
-        {
-            if (!mGraphView->inView(parent.first)) {
-                // Do not schedule prior outside the current graph!
-                return PriorProducersConsumers();
-            }
-
-            if (parent.first->type() == Producer_Op::Type) {
-                prior.requiredProducers.insert(parent.first);
-                prior.priorConsumers.insert(node);
-            }
-            else if (parent.first->type() == Memorize_Op::Type) {
-                // Break cycles
-                return PriorProducersConsumers();
-            }
-            else {
-                const auto& parentPrior = getPriorProducersConsumers(parent.first);
+        if (parent.first) {
+            AIDGE_LOG_CONTEXT("Producer node {} (of type {}) output #{}",
+                parent.first->name(), parent.first->type(), parent.second);
+
+            if ((node->getOperator()->getNbConsumedData(inputIdx) + node->getOperator()->getNbRequiredData(inputIdx)) >
+                        parent.first->getOperator()->getNbProducedData(parent.second))
+            {
+                if (!mGraphView->inView(parent.first)) {
+                    // Do not schedule prior outside the current graph!
+                    return PriorProducersConsumers();
+                }
 
-                if (!parentPrior.isPrior) {
+                if (parent.first->type() == Producer_Op::Type) {
+                    prior.requiredProducers.insert(parent.first);
+                    prior.priorConsumers.insert(node);
+                }
+                else if (parent.first->type() == Memorize_Op::Type) {
+                    // Break cycles
                     return PriorProducersConsumers();
                 }
                 else {
-                    prior.requiredProducers.insert(parentPrior.requiredProducers.cbegin(), parentPrior.requiredProducers.cend());
-                    prior.priorConsumers.insert(parentPrior.priorConsumers.cbegin(), parentPrior.priorConsumers.cend());
+                    const auto& parentPrior = getPriorProducersConsumers(parent.first);
+
+                    if (!parentPrior.isPrior) {
+                        return PriorProducersConsumers();
+                    }
+                    else {
+                        prior.requiredProducers.insert(parentPrior.requiredProducers.cbegin(), parentPrior.requiredProducers.cend());
+                        prior.priorConsumers.insert(parentPrior.priorConsumers.cbegin(), parentPrior.priorConsumers.cend());
+                    }
                 }
             }
         }
diff --git a/src/utils/Log.cpp b/src/utils/Log.cpp
index 4fd38f67ce250abcaca73c391e50601f4f162621..03ecded8f5a193a8ab00cf9dc7be502b98205de2 100644
--- a/src/utils/Log.cpp
+++ b/src/utils/Log.cpp
@@ -47,6 +47,7 @@ std::string Aidge::Log::mFileName = []() {
     return std::string();
 }();
 std::unique_ptr<FILE, decltype(&std::fclose)> Aidge::Log::mFile {nullptr, nullptr};
+std::vector<std::string> Aidge::Log::mContext;
 
 void Aidge::Log::log(Level level, const std::string& msg) {
     if (level >= mConsoleLevel) {
@@ -61,6 +62,10 @@ void Aidge::Log::log(Level level, const std::string& msg) {
             : (level == Fatal) ? fmt::bg(fmt::color::red)
             : fmt::text_style();
 
+        for (const auto& context : mContext) {
+            fmt::println("Context: {}", context);
+        }
+
         fmt::println("{}", fmt::styled(msg, modifier));
     }
 
@@ -69,6 +74,10 @@ void Aidge::Log::log(Level level, const std::string& msg) {
             initFile(mFileName);
         }
 
+        for (const auto& context : mContext) {
+            fmt::println("Context: {}", context);
+        }
+
         fmt::println(mFile.get(), msg);
     }
 }