在Symfony 4中将Monolog配置为通过TCP发送GELF

时间:2019-06-24 14:38:38

标签: php symfony graylog gelf

我的monolog.yaml文件中具有以下配置:

monolog:
    handlers:
        main:
            type: stream
            path: "php://stdout"
            level: debug
            channels: ["!event"]
        gelf:
            type: gelf
            publisher:
                hostname: mygelfhost.com
                port: 12201
        console:
            type: console
            process_psr_3_messages: false
            channels: ["!event", "!doctrine", "!console"]

但是它仅使用UDP将消息发送到mygelfhost.com。当我尝试放置时:

hostname: tcp://mygelfhost.com

我收到以下错误:

  Failed to create socket-client for udp://tcp://log-dev.hpa.lis-dev.net:12201: php_network_getaddresses: getaddrinfo failed: Name or service not known (0)  

我的目标是通过TCP将日志发送到同一主机,我已经在此处检查配置:https://github.com/symfony/monolog-bundle/blob/master/DependencyInjection/Configuration.php#L25,没有可能的解决方案。

2 个答案:

答案 0 :(得分:0)

您需要指定Gelf的运输方式。默认情况下,它使用UDP。

monolog:
    handlers:
        gelf:
            type: gelf
            id: my_tcp_gelf_publisher 

在您的服务中:

services:
    my_tcp_gelf_publisher:
        class: Gelf\Publisher
        arguments: [@gelf.tcp_transport]
    gelf.tcp_transport:
        class: Gelf\Transport\TcpTransport
        arguments:
            - "mygelfhost.com" # Hostname
            - 12201 #port                  

类似的东西应该可以工作,尽管我还没有测试代码。基于定义发布者和来自https://github.com/bzikarsky/gelf-php

的配置示例

答案 1 :(得分:0)

以@Chase的答案为基础:

monolog:
    handlers:
        gelf:
            type: gelf
            publisher: my_tcp_gelf_publisher 

上面的区别是my_tcp_gelf_publisher是Publisher对象,而不是Handler对象。您想告诉处理程序,哪个发布者使用“ my_tcp_gelf_publisher”,因为这是在services.yaml中定义的

在services.yaml中:

services:
    my_tcp_gelf_publisher:
        class: Gelf\Publisher
        arguments: ["@gelf.tcp_transport"]
    gelf.tcp_transport:
        class: Gelf\Transport\TcpTransport
        arguments:
            - "mygelfhost.com" # Hostname
            - 12201 #port  

这几乎是相同的,除了需要将@ gelf.tcp_transport服务引用放在引号中,否则会出现缩放器错误。

一个额外的提示,如果您偶然决定将传输配置为使用端口12202(Gelf \ Transport \ TcpTransport的SSL端口),请确保确保端点支持ssl并提供正确配置的SslOptions对象,否则请使用标准端口12201(或任何其他端口)。