docker 记录到系统日志的严重性级别

Severity level on docker logging to syslog

我有一个 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 消息视为错误?

我最初关于设置 /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:一个 shell 脚本记录到 stderr 和 stdout

#!/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);
      };

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