【问题标题】:Saving command logger output to log file and console将命令记录器输出保存到日志文件和控制台
【发布时间】:2021-01-28 20:05:32
【问题描述】:

我写了一个非常简单的测试命令,在它的构造函数中注入了LoggerInterface

我想如何更改monolog.yaml 配置以将此记录器输出保存到日志文件并将其输出到控制台?

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" ]

【问题讨论】:

    标签: php symfony monolog symfony-console


    【解决方案1】:

    默认情况下,这些命令将始终 stderr(如果您指定 -vvv 选项)

    如果您只需要在错误(堆栈错误)时将日志写入文件,您可以使用 finger_crossed 处理程序:

    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
    

    如果您想稍微过滤一下标准错误中显示的日志,您可以使用控制台的默认配置:

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

    我会让你有更好的控制台日志(并避免太多“无用”的日志,例如非常冗长的事件或教义)

    【讨论】:

      【解决方案2】:
      【解决方案3】:

      您可以像终端处理程序一样执行此操作。复制终端处理程序并设置文件的路径。两个处理程序都将被执行。

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

      您也可以这样做以将不同的频道记录到不同的文件中。 有时我使用它,通过添加原则通道将原则调试消息记录到不同的文件中。

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

      【讨论】: