Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Making the channel handler more useful by showing it on the prod environment #4604

Merged
merged 3 commits into from
May 25, 2015
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 40 additions & 26 deletions cookbook/logging/channels_handlers.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,37 +4,47 @@
How to Log Messages to different Files
======================================

The Symfony Standard Edition contains a bunch of channels for logging: ``doctrine``,
``event``, ``security`` and ``request``. Each channel corresponds to a logger
service (``monolog.logger.XXX``) in the container and is injected to the
concerned service. The purpose of channels is to be able to organize different
types of log messages.
The Symfony Framework organizes log messages into channels. By default, there
are several channels, including ``doctrine``, ``event``, ``security``, ``request``
and more. The channel is printed in the log message and can also be used
to direct different channels to different places/files.

By default, Symfony logs every message into a single file (regardless of
the channel).

.. note::

Each channel corresponds to a logger service (``monolog.logger.XXX``)
in the container (use the ``container:debug`` command to see a full list)
and those are injected into different services.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

however, when defining your services, the way to ask for a given channel is not to use monolog.logger.XXX directly. It is to inject the logger service and set the appropriate tag on your service.
this is necessary because the compiler pass reading these tags is also the place creating these services.

I'm not sure documenting the monolog.logger.XXX naming convention is actually worth it.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 for documenting it as an monolog implementation detail. we should warn to rely on this naming convention

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, I think the specific monolog.logger.XXX service names are guaranteed in a sense, due to this feature: http://symfony.com/doc/current/cookbook/logging/channels_handlers.html#configure-additional-channels-without-tagged-services. And for me, this has always seems a lot more clear - using a tag to change how a logger is injected (in reality, which logger is injected) always seemed obtuse to me. I wonder if we should tell end-users to use the specific services, and leave the tag-usage primarily for third-party code (where you can't create a channel via config).


.. _logging-channel-handler:

Switching a Channel to a different Handler
------------------------------------------

Now, suppose you want to log the ``doctrine`` channel to a different file.

To do so, just create a new handler and configure it like this:
Now, suppose you want to log the ``security`` channel to a different file
in the ``prod`` environment. To do this, just create a new handler and configure
it to log only messages from the ``security`` channel:

.. configuration-block::

.. code-block:: yaml

# app/config/config.yml
# app/config/config_prod.yml
monolog:
handlers:
main:
security:
# log all messages (since debug is the lowest level)
level: debug
type: stream
path: /var/log/symfony.log
channels: ["!doctrine"]
doctrine:
type: stream
path: /var/log/doctrine.log
channels: [doctrine]
path: "%kernel.logs_dir%/security.log"
channels: [security]

# an example of *not* logging security channel messages
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

strictly speaking, they are still logged. Just not by this handler. Maybe something like "to match all channels except from security"

main:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why didn't you add a comment for this line?

# ...
# channels: ["!security"]

.. code-block:: xml

Expand All @@ -48,16 +58,18 @@ To do so, just create a new handler and configure it like this:
http://symfony.com/schema/dic/monolog/monolog-1.0.xsd"
>
<monolog:config>
<monolog:handler name="main" type="stream" path="/var/log/symfony.log">
<monolog:handler name="security" type="stream" path="%kernel.logs_dir%/security.log">
<monolog:channels>
<monolog:channel>!doctrine</monolog:channel>
<monolog:channel>security</monolog:channel>
</monolog:channels>
</monolog:handler>

<monolog:handler name="doctrine" type="stream" path="/var/log/doctrine.log">
<monolog:handler name="main" type="stream" path="%kernel.logs_dir%/security.log">
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

in the yaml config you omitted this. It also looks quite strange to configure a path security.log for a handler not handling security logs :)

(btw, you're also missing the describing comments)

<!--
<monolog:channels>
<monolog:channel>doctrine</monolog:channel>
<monolog:channel>!security</monolog:channel>
</monolog:channels>
-->
</monolog:handler>
</monolog:config>
</container>
Expand All @@ -67,19 +79,21 @@ To do so, just create a new handler and configure it like this:
// app/config/config.php
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

needs file name update too (I couldn't comment on the XML filename, but that should be changed as well)

$container->loadFromExtension('monolog', array(
'handlers' => array(
'main' => array(
'security' => array(
'type' => 'stream',
'path' => '/var/log/symfony.log',
'path' => '%kernel.logs_dir%/security.log',
'channels' => array(
'!doctrine',
'security',
),
),
'doctrine' => array(
'main' => array(
'type' => 'stream',
'path' => '/var/log/doctrine.log',
'path' => '%kernel.logs_dir%/security.log',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here (also on the comments)

/*
'channels' => array(
'doctrine',
'!security',
),
*/
),
),
));
Expand Down