【问题标题】:Severity level on docker logging to syslogdocker 日志记录到 syslog 的严重级别
【发布时间】:2020-10-20 11:54:51
【问题描述】:

我有一个syslog-ng 容器,它从在同一应用程序上运行的其他容器收集日志,并且正常的日志记录按预期工作:每个容器发送其日志,syslog-ng 将它们保存在单独的文件中,如syslog-ng.conf 中所定义.

我也在尝试将错误日志保存在不同的文件中。我假设从另一个容器内抛出到 STDERR 的所有内容都应该被 syslog-ng 视为错误,所以当我启动这样的容器时:

docker run -dit --log-driver syslog --log-opt syslog-address=tcp://my_syslog:601 alpine echo "boom" > /dev/stderr

然后我希望 syslog-ng 将其理解为错误,但事实并非如此。

这是我在 syslog-ng 容器中的syslog-ng.conf 的摘录:

@version: 3.25
source s_net {
  network(transport(tcp) port(601));
  network(transport(udp) port(514));
};
destination d_error_file {
  file("/tmp/errors");
};
filter f_errors {
  level(err .. emerg);
};
log {
  source(s_net);
  filter(f_errors);
  destination(d_error_file);
};

如何告诉 syslog-ng 将 STDERR 消息视为错误?

【问题讨论】:

    标签: docker logging syslog-ng


    【解决方案1】:

    我最初设置/dev/stderr 来源的回复被误导了。我以为syslog-ng 是在主机中运行的。

    syslog-ng 在容器中运行时,docker 守护进程正在从运行的容器中收集日志并通过网络将其发送到系统日志服务器。

    这就是为什么必须像您所做的那样对网络源执行过滤的原因。

    我设置了以下项目来演示一个示例。

    .
    ├── data
    │   └── syslog-ng
    │       ├── conf
    │       │   └── syslog-ng.conf
    │       └── logs
    │           ├── errors
    │           └── syslog
    ├── docker-compose.yml
    └── hack.sh
    

    docker-compose.yml

    version: '3.8'
    
    services:
      hack:
        image: alpine
        command: /hack.sh
        logging:
          driver: syslog
          options:
            syslog-address: "tcp://host.docker.internal:601"
        depends_on:
          - syslog
        volumes:
          - '$PWD/hack.sh:/hack.sh'
      syslog:
        container_name: syslog-ng
        image: balabit/syslog-ng:latest
        volumes:
          - '$PWD/data/syslog-ng/conf/syslog-ng.conf:/etc/syslog-ng/syslog-ng.conf'
          - '$PWD/data/syslog-ng/logs:/var/log'
        ports:
          - 514:514
          - 601:601
    

    hack.sh:记录到 stderr 和 stdout 的 shell 脚本

    #!/bin/sh
    
    while :
    do
        echo "boom" >/dev/stderr;
        echo "no boom";
        sleep 2;
    done
    

    ./data/syslog-ng/conf/syslog-ng.conf:过滤info/var/log/syslogerror/var/log/error

    @version: 3.29
    @include "scl.conf"
    
    source s_net {
       udp(
         ip("0.0.0.0")
       );
    
      network(
        ip("0.0.0.0")
        transport(tcp) 
        port(601)
      );
    
     };
      
      filter f_errors {
        level(err .. emerg);
      };
      filter f_info {
        level(info);
      };
    
        destination d_file {
          file("/var/log/syslog");
        };
        destination d_error_file {
          file("/var/log/errors");
        };
    
          log {
            source(s_net);
            filter(f_info);
            destination(d_file); 
          };
          log {
            source(s_net);
            filter(f_errors);
            destination(d_error_file);
          };
    

    除了为非错误消息创建不同的过滤器之外,上述syslog-ng 配置与您提供的配置几乎没有区别。

    【讨论】:

    • 我已经用上面的docker run 测试了您的示例,但它似乎不起作用。我也尝试了不同的组合,但错误文件中没有任何内容。如果您有一个适用于我的docker run 行的示例(用于 syslog-ng 和 syslog-ng.conf 的 Dockerfile),您可以发布吗?
    • @AlessandroCappello 您的日志过滤器设置正确。
    • 有效!我会进一步检查我的配置有什么问题,但我可以很快看到你的配置很好。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    相关资源
    最近更新 更多