Skip to content

Conversation

philbates35
Copy link

@philbates35 philbates35 commented Sep 30, 2025

Q A
License MIT
Doc issue/PR N/A

In a fresh Symfony app using monolog-bundle default configuration, if a deprecation occurs in the same request as an uncaught exception in prod environment, that deprecation is logged twice. This is why:

  1. A request comes in and causes a deprecation to be logged at info level on the deprecation channel
  2. The main (fingers_crossed) handler is not activated so the deprecation is buffered (not logged)
  3. The remaining handlers are evaluated, the deprecation handler listening to the deprecation channel matches and the deprecation is logged immediately (this is the first time the deprecation is logged)
  4. On that same request there is an uncaught exception
  5. This causes a critical level log on the request channel which is higher than main handler's action_level: error. No channels are explicitly defined on main handler therefore main handler activates
  6. When main activates all buffered messages are logged immediately, including the deprecation from step 2 (this is the second time the deprecation is logged)

Adding channels: [!deprecation] to the main handler stops any deprecation channel logs from ever being logged by the main/nested handlers, fully relying on the deprecation handler to log deprecations - meaning they only appear a maximum of once.

@symfony-recipes-bot symfony-recipes-bot enabled auto-merge (squash) September 30, 2025 13:59
Copy link

Thanks for the PR 😍

How to test these changes in your application

  1. Define the SYMFONY_ENDPOINT environment variable:

    # On Unix-like (BSD, Linux and macOS)
    export SYMFONY_ENDPOINT=https://raw.githubusercontent.com/symfony/recipes/flex/pull-1454/index.json
    # On Windows
    SET SYMFONY_ENDPOINT=https://raw.githubusercontent.com/symfony/recipes/flex/pull-1454/index.json
  2. Install the package(s) related to this recipe:

    composer req symfony/flex
    composer req 'symfony/monolog-bundle:^3.7'
  3. Don't forget to unset the SYMFONY_ENDPOINT environment variable when done:

    # On Unix-like (BSD, Linux and macOS)
    unset SYMFONY_ENDPOINT
    # On Windows
    SET SYMFONY_ENDPOINT=

Diff between recipe versions

In order to help with the review stage, I'm in charge of computing the diff between the various versions of patched recipes.
I'm going keep this comment up to date with any updates of the attached patch.

symfony/monolog-bundle

3.1 vs 3.3
diff --git a/symfony/monolog-bundle/3.1/config/packages/prod/monolog.yaml b/symfony/monolog-bundle/3.3/config/packages/prod/monolog.yaml
index 4aa906d4..bfe69c01 100644
--- a/symfony/monolog-bundle/3.1/config/packages/prod/monolog.yaml
+++ b/symfony/monolog-bundle/3.3/config/packages/prod/monolog.yaml
@@ -4,10 +4,8 @@ monolog:
             type: fingers_crossed
             action_level: error
             handler: nested
+            excluded_http_codes: [404, 405]
             buffer_size: 50 # How many messages should be saved? Prevent memory leaks
-            excluded_404s:
-                # regex: exclude all 404 errors from the logs
-                - ^/
         nested:
             type: stream
             path: "%kernel.logs_dir%/%kernel.environment%.log"
diff --git a/symfony/monolog-bundle/3.1/config/packages/test/monolog.yaml b/symfony/monolog-bundle/3.3/config/packages/test/monolog.yaml
index 2762653c..fc40641d 100644
--- a/symfony/monolog-bundle/3.1/config/packages/test/monolog.yaml
+++ b/symfony/monolog-bundle/3.3/config/packages/test/monolog.yaml
@@ -1,7 +1,12 @@
 monolog:
     handlers:
         main:
+            type: fingers_crossed
+            action_level: error
+            handler: nested
+            excluded_http_codes: [404, 405]
+            channels: ["!event"]
+        nested:
             type: stream
             path: "%kernel.logs_dir%/%kernel.environment%.log"
             level: debug
-            channels: ["!event"]
3.3 vs 3.7
diff --git a/symfony/monolog-bundle/3.3/config/packages/dev/monolog.yaml b/symfony/monolog-bundle/3.3/config/packages/dev/monolog.yaml
deleted file mode 100644
index b1998da1..00000000
--- a/symfony/monolog-bundle/3.3/config/packages/dev/monolog.yaml
+++ /dev/null
@@ -1,19 +0,0 @@
-monolog:
-    handlers:
-        main:
-            type: stream
-            path: "%kernel.logs_dir%/%kernel.environment%.log"
-            level: debug
-            channels: ["!event"]
-        # uncomment to get logging in your browser
-        # you may have to allow bigger header sizes in your Web server configuration
-        #firephp:
-        #    type: firephp
-        #    level: info
-        #chromephp:
-        #    type: chromephp
-        #    level: info
-        console:
-            type: console
-            process_psr_3_messages: false
-            channels: ["!event", "!doctrine", "!console"]
diff --git a/symfony/monolog-bundle/3.7/config/packages/monolog.yaml b/symfony/monolog-bundle/3.7/config/packages/monolog.yaml
new file mode 100644
index 00000000..269f2818
--- /dev/null
+++ b/symfony/monolog-bundle/3.7/config/packages/monolog.yaml
@@ -0,0 +1,63 @@
+monolog:
+    channels:
+        - deprecation # Deprecations are logged in the dedicated "deprecation" channel when it exists
+
+when@dev:
+    monolog:
+        handlers:
+            main:
+                type: stream
+                path: "%kernel.logs_dir%/%kernel.environment%.log"
+                level: debug
+                channels: ["!event"]
+            # uncomment to get logging in your browser
+            # you may have to allow bigger header sizes in your Web server configuration
+            #firephp:
+            #    type: firephp
+            #    level: info
+            #chromephp:
+            #    type: chromephp
+            #    level: info
+            console:
+                type: console
+                process_psr_3_messages: false
+                channels: ["!event", "!doctrine", "!console"]
+
+when@test:
+    monolog:
+        handlers:
+            main:
+                type: fingers_crossed
+                action_level: error
+                handler: nested
+                excluded_http_codes: [404, 405]
+                channels: ["!event"]
+            nested:
+                type: stream
+                path: "%kernel.logs_dir%/%kernel.environment%.log"
+                level: debug
+
+when@prod:
+    monolog:
+        handlers:
+            main:
+                type: fingers_crossed
+                action_level: error
+                handler: nested
+                excluded_http_codes: [404, 405]
+                channels: ["!deprecation"]
+                buffer_size: 50 # How many messages should be saved? Prevent memory leaks
+            nested:
+                type: stream
+                path: php://stderr
+                level: debug
+                formatter: monolog.formatter.json
+            console:
+                type: console
+                process_psr_3_messages: false
+                channels: ["!event", "!doctrine"]
+            deprecation:
+                type: stream
+                channels: [deprecation]
+                path: php://stderr
+                formatter: monolog.formatter.json
diff --git a/symfony/monolog-bundle/3.3/config/packages/prod/deprecations.yaml b/symfony/monolog-bundle/3.3/config/packages/prod/deprecations.yaml
deleted file mode 100644
index 920a0619..00000000
--- a/symfony/monolog-bundle/3.3/config/packages/prod/deprecations.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-# As of Symfony 5.1, deprecations are logged in the dedicated "deprecation" channel when it exists
-#monolog:
-#    channels: [deprecation]
-#    handlers:
-#        deprecation:
-#            type: stream
-#            channels: [deprecation]
-#            path: "%kernel.logs_dir%/%kernel.environment%.deprecations.log"
diff --git a/symfony/monolog-bundle/3.3/config/packages/prod/monolog.yaml b/symfony/monolog-bundle/3.3/config/packages/prod/monolog.yaml
deleted file mode 100644
index bfe69c01..00000000
--- a/symfony/monolog-bundle/3.3/config/packages/prod/monolog.yaml
+++ /dev/null
@@ -1,16 +0,0 @@
-monolog:
-    handlers:
-        main:
-            type: fingers_crossed
-            action_level: error
-            handler: nested
-            excluded_http_codes: [404, 405]
-            buffer_size: 50 # How many messages should be saved? Prevent memory leaks
-        nested:
-            type: stream
-            path: "%kernel.logs_dir%/%kernel.environment%.log"
-            level: debug
-        console:
-            type: console
-            process_psr_3_messages: false
-            channels: ["!event", "!doctrine"]
diff --git a/symfony/monolog-bundle/3.3/config/packages/test/monolog.yaml b/symfony/monolog-bundle/3.3/config/packages/test/monolog.yaml
deleted file mode 100644
index fc40641d..00000000
--- a/symfony/monolog-bundle/3.3/config/packages/test/monolog.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-monolog:
-    handlers:
-        main:
-            type: fingers_crossed
-            action_level: error
-            handler: nested
-            excluded_http_codes: [404, 405]
-            channels: ["!event"]
-        nested:
-            type: stream
-            path: "%kernel.logs_dir%/%kernel.environment%.log"
-            level: debug
diff --git a/symfony/monolog-bundle/3.3/manifest.json b/symfony/monolog-bundle/3.7/manifest.json
index 1dc6c694..ed73c591 100644
--- a/symfony/monolog-bundle/3.3/manifest.json
+++ b/symfony/monolog-bundle/3.7/manifest.json
@@ -5,5 +5,8 @@
     "copy-from-recipe": {
         "config/": "%CONFIG_DIR%/"
     },
-    "aliases": ["log", "logger", "logging", "logs", "monolog"]
+    "aliases": ["log", "logger", "logging", "logs", "monolog"],
+    "conflict": {
+        "symfony/framework-bundle": "<5.3"
+    }
 }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant