1. 项目概述作为一名Linux系统管理员日志管理是日常工作中最基础也最重要的技能之一。在Ubuntu系统中rsyslog、journald和logrotate这三个工具构成了完整的日志管理体系。它们各司其职又相互配合共同确保系统日志的完整性和可用性。我在管理生产环境服务器时曾遇到过因为日志配置不当导致的磁盘爆满、关键日志丢失等问题。这些问题促使我深入研究了Ubuntu的日志管理机制并总结出一套行之有效的配置方案。本文将分享我在Ubuntu 22.04 LTS环境下使用这三个工具的实际经验。2. 核心组件解析2.1 rsyslog传统日志系统的现代化继承者rsyslog是syslog协议的增强实现在Ubuntu中默认作为系统日志服务运行。与传统的syslog相比它支持更丰富的功能模块化设计可通过加载不同模块实现TCP传输、数据库存储等高级功能高性能支持多线程处理每秒可处理百万级日志消息灵活的过滤条件可按优先级、程序名、消息内容等多种条件过滤日志在Ubuntu 22.04中rsyslog的主配置文件位于/etc/rsyslog.conf同时会加载/etc/rsyslog.d/目录下的所有.conf文件。这种设计使得我们可以保持主配置文件不变只在子目录中添加自定义配置。提示修改rsyslog配置后需要用sudo systemctl restart rsyslog使更改生效。建议先使用sudo rsyslogd -N1测试配置文件语法是否正确。2.2 journald新一代系统日志守护进程systemd-journald是systemd套件的一部分它采用二进制格式存储日志相比传统文本日志有以下优势结构化存储每条日志都包含丰富的元数据时间戳、用户、PID等高效的查询能力可以使用journalctl命令进行复杂的日志过滤即时访问新日志立即可查无需等待轮转journald默认将日志存储在/run/log/journal/临时和/var/log/journal/持久化目录中。在内存不足的系统上可能只配置了临时存储这会导致重启后日志丢失。2.3 logrotate日志轮转的专业工具logrotate通过定期重命名、压缩和删除旧日志文件来防止日志占用过多磁盘空间。它的核心特性包括基于时间或大小的轮转触发条件支持预执行和后执行脚本灵活的保留策略按时间、数量等压缩选项可节省磁盘空间Ubuntu系统中的logrotate配置主要存放在/etc/logrotate.conf和/etc/logrotate.d/目录下。系统服务通常会在各自的软件包中提供logrotate配置片段。3. 详细配置指南3.1 rsyslog高级配置实战3.1.1 自定义日志存储路径在/etc/rsyslog.d/目录下新建一个配置文件如myapp.conf添加以下内容# 将mail日志单独存储 mail.* /var/log/mail.log # 根据程序名分离日志 if $programname nginx then /var/log/nginx/nginx.log stop # 使用模板定义动态日志文件名 template(nameDynFile typestring string/var/log/%programname%.log) *.* ?DynFile3.1.2 远程日志收集配置要配置rsyslog作为日志服务器接收远程日志在/etc/rsyslog.conf中取消注释以下行module(loadimudp) input(typeimudp port514) module(loadimtcp) input(typeimtcp port514)添加防火墙规则允许514端口sudo ufw allow 514/tcp sudo ufw allow 514/udp在客户端配置发送日志到服务器*.* 192.168.1.100:514 # UDP方式 *.* 192.168.1.100:514 # TCP方式3.2 journalctl实用技巧journalctl提供了强大的日志查询功能以下是一些常用命令示例查看最近日志journalctl -e跟踪最新日志journalctl -f按时间筛选journalctl --since 2023-01-01 00:00:00 --until 2023-01-02 12:00:00按服务筛选journalctl -u nginx.service按优先级筛选journalctl -p err显示内核日志journalctl -k以JSON格式输出journalctl -o json注意如果journal日志占用空间过大可以使用journalctl --vacuum-size200M将其限制在200MB以内。3.3 logrotate配置详解一个完整的logrotate配置通常包含以下参数/var/log/nginx/*.log { daily missingok rotate 14 compress delaycompress notifempty create 0640 www-data adm sharedscripts postrotate /usr/lib/nginx/modules/nginx -s reopen /dev/null 21 || true endscript }各参数含义daily每天轮转一次还可用weekly、monthlymissingok日志文件不存在时不报错rotate 14保留14个旧日志文件compress使用gzip压缩旧日志delaycompress延迟压缩前一个日志文件create创建新日志文件时设置权限和属主postrotate轮转后执行的脚本4. 集成与协同工作4.1 rsyslog与journald的协作在Ubuntu系统中rsyslog默认会从journald接收日志。这是通过imjournal模块实现的相关配置在/etc/rsyslog.conf中module(loadimjournal StateFileimjournal.state)这种设计使得应用程序可以直接输出到journaldjournald将日志转发给rsyslog进行进一步处理rsyslog可以将日志写入文件或发送到远程服务器4.2 确保关键日志不丢失为了防止系统崩溃时丢失journald中的日志需要启用持久化存储创建存储目录sudo mkdir -p /var/log/journal设置正确的权限sudo chown root:systemd-journal /var/log/journal sudo chmod 2755 /var/log/journal重启journald服务sudo systemctl restart systemd-journald5. 常见问题排查5.1 日志文件不轮转可能原因及解决方案logrotate未正确执行检查cron任务sudo cat /etc/cron.daily/logrotate手动测试sudo logrotate -vf /etc/logrotate.conf文件权限问题确保logrotate有权限读取和重命名日志文件检查create指令中的权限设置日志文件被进程保持打开使用lsof | grep deleted查找已删除但仍被打开的文件考虑使用copytruncate选项替代create5.2 journald占用过多空间解决方法限制journal大小sudo vim /etc/systemd/journald.conf修改或添加SystemMaxUse200M RuntimeMaxUse100M立即清理旧日志sudo journalctl --vacuum-size100M5.3 远程日志传输失败排查步骤检查网络连通性telnet 日志服务器IP 514检查rsyslog服务状态sudo systemctl status rsyslog查看rsyslog调试信息sudo rsyslogd -dn检查防火墙设置sudo ufw status6. 性能优化建议6.1 rsyslog性能调优启用多线程处理module(loadomptcp threads4) module(loadompfile threads4)使用内存队列减轻磁盘I/O压力module(loadimuxsock SysSock.Useoff) module(loadimuxsock SysSock.Name/dev/log SysSock.Useon SysSock.FlowControlon SysSock.Annotateon SysSock.ParseTrustedon)批量写入磁盘$ActionQueueType LinkedList $ActionQueueFileName nginx_q $ActionQueueMaxDiskSpace 1g $ActionQueueSaveOnShutdown on $ActionQueueTimeoutEnqueue 100 $ActionQueueDiscardMark 50000 $ActionQueueDiscardSeverity 06.2 journald存储优化限制字段大小MaxLevelStoredebug MaxLevelSyslogdebug MaxLevelKMsgnotice MaxLevelConsoleinfo MaxLevelWallemerg禁用不必要的元数据Storagepersistent Compressyes Sealyes SplitModeuid SyncIntervalSec5m RateLimitInterval30s RateLimitBurst10007. 安全最佳实践7.1 日志文件权限管理确保日志文件不被未授权访问sudo chmod 640 /var/log/*.log sudo chown root:adm /var/log/*.log对于敏感日志如auth.log可以设置更严格的权限sudo chmod 600 /var/log/auth.log sudo chown root:root /var/log/auth.log7.2 日志完整性保护使用logsigner为日志添加数字签名sudo apt install rsyslog-gnutls logsigner --cert/etc/rsyslog.d/cert.pem \ --key/etc/rsyslog.d/key.pem \ --input/var/log/syslog \ --output/var/log/syslog.signed配置syslog传输加密module(loadgtls) input(typeimtcp port6514 rulesetremote StreamDriver.Namegtls StreamDriver.Mode1 StreamDriver.AuthModex509/name StreamDriver.PermittedPeers*.example.com)7.3 集中式日志管理架构对于多服务器环境建议建立集中式日志管理系统日志收集层各服务器配置rsyslog转发日志到中央服务器存储层使用Elasticsearch集群存储日志处理层Logstash或Fluentd进行日志处理展示层Kibana提供可视化界面示例rsyslog客户端配置module(loadomelasticsearch) template(namejson-template typelist) { constant(value{) constant(value\timestamp\:\) property(nametimereported dateFormatrfc3339) constant(value\,\host\:\) property(namehostname) constant(value\,\severity\:\) property(namesyslogseverity-text) constant(value\,\program\:\) property(nameprogramname) constant(value\,\message\:\) property(namemsg formatjson) constant(value\}) } action(typeomelasticsearch serverelasticsearch.example.com serverport9200 templatejson-template searchIndexsyslog bulkmodeon queue.dequeuebatchsize1000 action.resumeretrycount-1)