1

I wrote a very simple test command which has LoggerInterface injected in its constructor.

How am I suppose to change the monolog.yaml configuration to save this logger output to both log file and to output it to console?

monolog:
    handlers:
        main:
            type: fingers_crossed
            action_level: error
            formatter: monolog.line.formatter
            handler: terminal
            excluded_http_codes: [404, 405]
            buffer_size: 50 # How many messages should be saved? Prevent memory leaks
        terminal:
            type: stream
            path: "php://stderr"
            level: debug
        console:
            type: console
            process_psr_3_messages: false
            channels: [ "!event", "!doctrine" ]

3 Answers 3

1

The commands will always stderr by default (if you specify the -vvv option)

If you need to write the logs in a file only on error (with the stack error) you can use the finger_crossed handler :

handlers:
    main:
        # fingers_crossed allow to log only if action_level defined is reach
        type: fingers_crossed
        # minimum level to activate the handler
        # available level (emergency|alert|critical|error|warning|notice|info|debug){1}
        action_level: error
        # wrapped handler's name
        handler: nested

    nested:
        # stream allow to write log in file
        type: stream
        # path to the log file
        path:  "%kernel.logs_dir%/%project_name%_%kernel.environment%.log"
        # available level (emergency|alert|critical|error|warning|notice|info|debug){1}
        level: debug

If you want to filter a bit the logs shown in the stderr you can use the default config for the console :

console:
    type:   console
    process_psr_3_messages: false
    channels: ['!event', '!doctrine', '!console']

I'll allow you to have nicer console logs (and avoid too many "useless" logs such as event or doctrine which are very verbose)

Sign up to request clarification or add additional context in comments.

Comments

1

You can use the "group" handler https://github.com/symfony/monolog-bundle/blob/master/DependencyInjection/Configuration.php#L137

Check an implementation here https://symfony.com/doc/current/logging/monolog_email.html

Comments

1

You can do this like your terminal handler does. copy the terminal handler and set the path to the file. Both handlers will be executed.

monolog:
    handlers:
        main:
            ...
        terminal:
            ...
        terminal_file:
            type: stream
            path: "%kernel.logs_dir%/%kernel.environment%-terminal.log"
            level: debug

You can also do this to log different channels to different files. Sometimes i use this, to log doctrine debug messages to a different file, by adding the doctrine channel.

monolog:
    handlers:
        ...
        doctrine_debug:
            type: stream
            path: "%kernel.logs_dir%/%kernel.environment%-doctrine.log"
            level: debug
            channels: ["doctrine"]

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.