本文档风哥主要介绍Podman容器日志管理,包括日志的概念、类型、重要性以及Podman日志配置、ELK Stack部署和Journald集成等内容。风哥教程参考Podman官方文档Logging部分,适合容器管理员和开发人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 日志概念
日志是指系统或应用程序运行过程中产生的记录,包含系统状态、操作信息、错误信息等。Podman容器日志是指容器运行过程中产生的记录,包括容器的启动、运行、停止、错误等信息。更多视频教程www.fgedu.net.cn
- 故障排查:通过日志了解系统运行状态,排查故障
- 性能分析:通过日志分析系统性能问题
- 安全审计:通过日志记录系统操作,进行安全审计
- 合规要求:满足行业和地区的合规要求
- 业务分析:通过日志分析业务运行情况
1.2 日志类型
Podman容器日志的类型主要包括:
- 标准输出日志:容器的标准输出(stdout)和标准错误(stderr)
- 应用日志:应用程序产生的日志,如Nginx、MySQL等
- 系统日志:容器运行时产生的系统日志
- 审计日志:容器操作的审计日志
1.3 日志的重要性
日志的重要性主要体现在:
- 故障排查:通过日志可以快速定位和解决故障
- 性能分析:通过日志可以分析系统性能瓶颈
- 安全审计:通过日志可以追踪和审计系统操作
- 合规要求:通过日志可以满足合规要求
- 业务分析:通过日志可以分析业务运行情况
Part02-生产环境规划与建议
2.1 日志策略
生产环境中Podman的日志策略:
## 日志收集
– 集中收集:将所有容器的日志集中收集到一个地方
– 实时收集:实时收集容器的日志
– 结构化收集:将日志结构化,便于分析
## 日志存储
– 本地存储:将日志存储在本地磁盘
– 远程存储:将日志存储在远程服务器
– 云存储:将日志存储在云服务中
## 日志保留
– 短期保留:保留最近几天的日志
– 中期保留:保留最近几周的日志
– 长期保留:保留最近几个月或几年的日志
## 日志清理
– 自动清理:定期自动清理过期日志
– 手动清理:手动清理过期日志
– 压缩存储:压缩存储过期日志
## 日志安全
– 访问控制:限制日志的访问权限
– 加密存储:加密存储日志数据
– 审计跟踪:记录日志的访问和操作
2.2 日志工具
生产环境中Podman的日志工具:
- Podman Logs:Podman自带的日志查看工具
- ELK Stack:Elasticsearch、Logstash、Kibana的组合,用于日志收集、分析和可视化
- Journald:systemd的日志管理工具
- Fluentd:开源的日志收集和转发工具
- Splunk:商业日志管理平台
2.3 日志存储
生产环境中Podman的日志存储:
## 本地存储
– 文件系统:将日志存储在本地文件系统
– 数据库:将日志存储在本地数据库
– 时间序列数据库:将日志存储在时间序列数据库
## 远程存储
– 网络存储:将日志存储在网络存储设备
– 分布式存储:将日志存储在分布式存储系统
– 云存储:将日志存储在云存储服务
## 存储策略
– 分层存储:根据日志的重要性和访问频率,存储在不同的存储介质
– 备份策略:定期备份日志数据,确保数据安全
– 恢复策略:制定日志数据的恢复策略,确保数据可恢复
## 存储优化
– 压缩存储:压缩存储日志数据,减少存储空间
– 索引优化:优化日志索引,提高查询性能
– 分区存储:根据时间或其他维度分区存储日志数据
Part03-生产环境项目实施方案
3.1 Podman日志配置
3.1.1 配置Podman日志驱动
# 查看当前日志驱动
$ podman info | grep -A 10 “Logging”
# 输出日志
Logging:
Driver: journald
LogOptions:
# 配置日志驱动为json-file
$ podman run -d –name fgedu-nginx \
–log-driver json-file \
–log-opt max-size=10m \
–log-opt max-file=5 \
-p 80:80 \
docker.io/library/nginx
# 配置日志驱动为journald
$ podman run -d –name fgedu-mysql \
–log-driver journald \
-e MYSQL_ROOT_PASSWORD=fgedu123 \
-p 3306:3306 \
docker.io/library/mysql:8.0
# 查看容器日志
$ podman logs fgedu-nginx
# 输出日志
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2026/04/10 10:00:00 [notice] 1#1: using the “epoll” event method
2026/04/10 10:00:00 [notice] 1#1: nginx/1.23.3
2026/04/10 10:00:00 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6)
2026/04/10 10:00:00 [notice] 1#1: OS: Linux 5.14.0-162.6.1.el9_1.x86_64
2026/04/10 10:00:00 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2026/04/10 10:00:00 [notice] 1#1: start worker processes
2026/04/10 10:00:00 [notice] 1#1: start worker process 32
2026/04/10 10:00:00 [notice] 1#1: start worker process 33
3.2 ELK Stack部署
3.2.1 部署ELK Stack
# 运行Elasticsearch容器
$ podman run -d –name fgedu-elasticsearch \
–cpus 4 \
–memory 8g \
-v /Podman/fgdata/elasticsearch/data:/usr/share/elasticsearch/data:z \
-v /Podman/fgdata/elasticsearch/config:/usr/share/elasticsearch/config:z \
-p 9200:9200 \
-p 9300:9300 \
-e “discovery.type=single-node” \
-e “ES_JAVA_OPTS=-Xms4g -Xmx4g” \
docker.io/library/elasticsearch:8.6.0
# 运行Logstash容器
$ podman run -d –name fgedu-logstash \
–cpus 2 \
–memory 4g \
-v /Podman/fgdata/logstash/config:/usr/share/logstash/config:z \
-v /Podman/fgdata/logstash/pipeline:/usr/share/logstash/pipeline:z \
-p 5044:5044 \
docker.io/library/logstash:8.6.0
# 运行Kibana容器
$ podman run -d –name fgedu-kibana \
–cpus 2 \
–memory 4g \
-v /Podman/fgdata/kibana/config:/usr/share/kibana/config:z \
-p 5601:5601 \
-e “ELASTICSEARCH_HOSTS=http://fgedu-elasticsearch:9200” \
docker.io/library/kibana:8.6.0
# 配置Logstash
$ cat > /Podman/fgdata/logstash/pipeline/logstash.conf << EOF
input {
beats {
port => 5044
}
file {
path => “/var/log/containers/*.log”
type => “docker”
start_position => “beginning”
}
}
filter {
if [type] == “docker” {
json {
source => “message”
}
}
}
output {
elasticsearch {
hosts => [“fgedu-elasticsearch:9200”]
index => “podman-logs-%{+YYYY.MM.dd}”
}
}
EOF
# 运行Filebeat容器
$ podman run -d –name fgedu-filebeat \
–cpus 1 \
–memory 2g \
-v /Podman/fgdata/filebeat/config:/usr/share/filebeat/config:z \
-v /var/lib/containers:/var/lib/containers:ro \
-v /var/log:/var/log:ro \
docker.io/library/filebeat:8.6.0
# 配置Filebeat
$ cat > /Podman/fgdata/filebeat/config/filebeat.yml << EOF
filebeat.inputs:
- type: container
paths:
- /var/lib/containers/*/*.log
processors:
- add_docker_metadata: ~
output.logstash:
hosts: ["fgedu-logstash:5044"]
EOF
# 重启容器
$ podman restart fgedu-logstash fgedu-filebeat
# 查看容器状态
$ podman ps
# 输出日志
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7890123456ab docker.io/library/elasticsearch /bin/tini -- /usr/l 5 minutes ago Up 5 minutes ago 0.0.0.0:9200->9200/tcp fgedu-elasticsearch
1234567890ab docker.io/library/logstash /usr/local/bin/logst 5 minutes ago Up 5 minutes ago 0.0.0.0:5044->5044/tcp fgedu-logstash
9876543210ab docker.io/library/kibana /bin/tini — /usr/l 5 minutes ago Up 5 minutes ago 0.0.0.0:5601->5601/tcp fgedu-kibana
5678901234ab docker.io/library/filebeat /usr/local/bin/fileb 5 minutes ago Up 5 minutes ago fgedu-filebeat
3.3 Journald集成
3.3.1 配置Podman与Journald集成
# 运行容器,使用journald日志驱动
$ podman run -d –name fgedu-nginx \
–log-driver journald \
-p 80:80 \
docker.io/library/nginx
# 查看Journald日志
$ journalctl CONTAINER_NAME=fgedu-nginx
# 输出日志
Apr 10 10:00:00 fgedu.net.cn podman[12345]: 2026-04-10 10:00:00.000000000 +0800 CST m=+0.000000000 container create 7890123456ab (image=docker.io/library/nginx:latest, name=fgedu-nginx)
Apr 10 10:00:00 fgedu.net.cn podman[12345]: 2026-04-10 10:00:00.000000000 +0800 CST m=+0.000000000 container start 7890123456ab (image=docker.io/library/nginx:latest, name=fgedu-nginx)
Apr 10 10:00:00 fgedu.net.cn fgedu-nginx[7890123456ab]: /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
Apr 10 10:00:00 fgedu.net.cn fgedu-nginx[7890123456ab]: /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
Apr 10 10:00:00 fgedu.net.cn fgedu-nginx[7890123456ab]: /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
Apr 10 10:00:00 fgedu.net.cn fgedu-nginx[7890123456ab]: 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
Apr 10 10:00:00 fgedu.net.cn fgedu-nginx[7890123456ab]: 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
Apr 10 10:00:00 fgedu.net.cn fgedu-nginx[7890123456ab]: /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
Apr 10 10:00:00 fgedu.net.cn fgedu-nginx[7890123456ab]: /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
Apr 10 10:00:00 fgedu.net.cn fgedu-nginx[7890123456ab]: /docker-entrypoint.sh: Configuration complete; ready for start up
Apr 10 10:00:00 fgedu.net.cn fgedu-nginx[7890123456ab]: 2026/04/10 10:00:00 [notice] 1#1: using the “epoll” event method
Apr 10 10:00:00 fgedu.net.cn fgedu-nginx[7890123456ab]: 2026/04/10 10:00:00 [notice] 1#1: nginx/1.23.3
Apr 10 10:00:00 fgedu.net.cn fgedu-nginx[7890123456ab]: 2026/04/10 10:00:00 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6)
Apr 10 10:00:00 fgedu.net.cn fgedu-nginx[7890123456ab]: 2026/04/10 10:00:00 [notice] 1#1: OS: Linux 5.14.0-162.6.1.el9_1.x86_64
Apr 10 10:00:00 fgedu.net.cn fgedu-nginx[7890123456ab]: 2026/04/10 10:00:00 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
Apr 10 10:00:00 fgedu.net.cn fgedu-nginx[7890123456ab]: 2026/04/10 10:00:00 [notice] 1#1: start worker processes
Apr 10 10:00:00 fgedu.net.cn fgedu-nginx[7890123456ab]: 2026/04/10 10:00:00 [notice] 1#1: start worker process 32
Apr 10 10:00:00 fgedu.net.cn fgedu-nginx[7890123456ab]: 2026/04/10 10:00:00 [notice] 1#1: start worker process 33
# 配置Journald持久化
$ sudo vi /etc/systemd/journald.conf
# 修改以下配置
[Journal]
Storage=persistent
Compress=yes
MaxRetentionSec=1month
# 重启Journald
$ sudo systemctl restart systemd-journald
Part04-生产案例与实战讲解
4.1 容器日志管理
4.1.1 容器日志管理实战
# 运行容器,配置日志驱动
$ podman run -d –name fgedu-nginx \
–log-driver json-file \
–log-opt max-size=10m \
–log-opt max-file=5 \
-p 80:80 \
docker.io/library/nginx
# 查看容器日志
$ podman logs fgedu-nginx
# 查看容器日志的最后10行
$ podman logs –tail 10 fgedu-nginx
# 实时查看容器日志
$ podman logs -f fgedu-nginx
# 查看容器日志的特定时间段
$ podman logs –since “2026-04-10T10:00:00” –until “2026-04-10T10:30:00” fgedu-nginx
# 清理容器日志
$ podman rm -f fgedu-nginx
$ podman run -d –name fgedu-nginx \
–log-driver json-file \
–log-opt max-size=10m \
–log-opt max-file=5 \
-p 80:80 \
docker.io/library/nginx
4.2 Pod日志管理
4.2.1 Pod日志管理实战
# 创建Pod
$ podman pod create –name fgedu-pod -p 80:80 -p 3306:3306
# 运行容器到Pod
$ podman run -d –pod fgedu-pod –name fgedu-nginx docker.io/library/nginx
$ podman run -d –pod fgedu-pod –name fgedu-mysql \
-e MYSQL_ROOT_PASSWORD=fgedu123 \
docker.io/library/mysql:8.0
# 查看Pod中的容器
$ podman ps –pod fgedu-pod
# 查看Nginx容器日志
$ podman logs fgedu-nginx
# 查看MySQL容器日志
$ podman logs fgedu-mysql
# 实时查看Nginx容器日志
$ podman logs -f fgedu-nginx
# 查看Pod的所有容器日志
$ podman pod logs fgedu-pod
4.3 系统日志管理
4.3.1 系统日志管理实战
# 查看系统日志
$ journalctl
# 查看Podman相关日志
$ journalctl -u podman
# 查看特定容器的日志
$ journalctl CONTAINER_NAME=fgedu-nginx
# 查看特定时间范围的日志
$ journalctl –since “2026-04-10” –until “2026-04-11”
# 查看错误日志
$ journalctl -p err
# 实时查看日志
$ journalctl -f
# 清理系统日志
$ sudo journalctl –vacuum-time=7d
# 查看日志磁盘使用情况
$ sudo journalctl –disk-usage
Part05-风哥经验总结与分享
5.1 日志管理最佳实践
Podman容器日志管理的最佳实践:
- 集中收集:将所有容器的日志集中收集到一个地方,便于管理和分析
- 实时收集:实时收集容器的日志,及时发现问题
- 结构化:将日志结构化,便于分析和查询
- 分级存储:根据日志的重要性和访问频率,存储在不同的存储介质
- 定期清理:定期清理过期日志,避免存储空间不足
- 安全管理:限制日志的访问权限,加密存储敏感日志
- 监控告警:监控日志中的错误信息,及时发送告警
- 文档记录:记录日志配置和管理流程,便于维护和追溯
5.2 日志分析
Podman容器日志分析:
## 日志收集
– 使用ELK Stack:收集、分析和可视化日志
– 使用Fluentd:收集和转发日志
– 使用Journald:管理系统和容器的日志
## 日志分析工具
– Kibana:可视化日志数据
– Elasticsearch:存储和索引日志数据
– Logstash:处理和转换日志数据
– Graylog:日志管理平台
## 日志分析方法
– 关键词搜索:搜索日志中的关键词
– 时间范围分析:分析特定时间范围的日志
– 趋势分析:分析日志的趋势变化
– 异常检测:检测日志中的异常信息
– 关联分析:分析不同日志之间的关联关系
## 日志分析场景
– 故障排查:分析故障相关的日志
– 性能分析:分析系统性能相关的日志
– 安全审计:分析安全相关的日志
– 业务分析:分析业务运行相关的日志
5.3 日志故障排查
Podman容器日志故障排查:
## 日志收集问题
– 检查日志驱动配置:podman inspect
– 检查日志工具状态:podman ps | grep logstash
– 检查网络连接:ping
– 检查存储权限:ls -la
## 日志分析问题
– 检查日志索引:curl -X GET “http://localhost:9200/_cat/indices”
– 检查日志查询:在Kibana中执行查询
– 检查日志格式:查看日志的格式是否正确
– 检查日志量:检查日志量是否过大
## 日志存储问题
– 检查存储使用:df -h
– 检查存储权限:chown/chmod
– 检查存储配置:查看日志存储配置
– 清理过期日志:删除过期日志,释放存储空间
## 日志安全问题
– 检查访问权限:ls -la
– 检查加密配置:查看日志加密配置
– 检查审计日志:查看日志的访问和操作记录
– 加强访问控制:限制日志的访问权限
## 日志性能问题
– 检查日志收集性能:监控日志收集工具的资源使用
– 优化日志配置:调整日志收集和存储配置
– 增加存储容量:增加日志存储的容量
– 优化查询性能:优化日志查询语句
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
