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/syslog
和 error
到 /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
配置与您提供的配置几乎没有区别。
我有一个 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/syslog
和 error
到 /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
配置与您提供的配置几乎没有区别。