0

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" ]
yivi
  • 42,438
  • 18
  • 116
  • 138
sebastian_t
  • 2,241
  • 6
  • 23
  • 39

3 Answers3

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"]
SubCore
  • 373
  • 2
  • 7
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)

Snroki
  • 2,424
  • 1
  • 20
  • 28