📋 日志服务与文件共享
一句话总结:学了 Linux 日志怎么收(rsyslog)、怎么看(journalctl)、怎么切(logrotate),以及怎么给多台机器共享文件(NFS)和实时同步数据(inotify+rsync / sersync)。
一、日志服务
1. 日志是干什么的?
日志就是系统的黑匣子,记录着"什么时间、谁、干了什么事、结果如何"。
| 级别 | 适用场景 |
|---|---|
| 主机级别 | 单机排查问题 →rsyslog |
| 集群级别 | 多台机器统一收日志 →ELK(Elasticsearch + Logstash + Kibana)或Spark |
类比:rsyslog 就像你家里的日记本,ELK 就像公司的档案室,把所有人的日记统一归档方便检索。
2. rsyslog 基础
rsyslog= Rocket-fast SYStem for LOG processing(极速日志处理系统)
CentOS 6+ / Rocky / openEuler 默认安装,Ubuntu Server 需手动安装:
apt install rsyslog -y
核心文件:
/usr/sbin/rsyslogd # 主程序 /etc/rsyslog.conf # 主配置文件 /etc/rsyslog.d/*.conf # 子配置文件目录 /var/log/messages # Rocky 默认日志(Ubuntu 是 /var/log/syslog)
3. rsyslog 核心概念:设施 + 优先级
设施(Facility)— 数据来源分类
设施可以理解为"消息从哪来的"——就像快递上的寄件地址标签。 LOG_KERN → 内核产生的消息(硬件驱动、内核错误) LOG_MAIL → 邮件服务 LOG_CRON → 定时任务(crontab / at) LOG_AUTH → 安全和认证 LOG_AUTHPRIV → 安全和认证(私有) LOG_DAEMON → 各守护进程 LOG_FTP → FTP 服务 LOG_LOCAL0~7 → 自定义分类(给第三方应用用) * → 所有设施
优先级(Priority)— 消息紧急程度
优先级可以理解为"这条消息有多急"——就像快递上的"加急"标签。 从高到低: LOG_EMERG 💀 紧急,系统要挂了 → 最高 LOG_ALERT ⚠️ 告警,必须立即处理 LOG_CRIT 🔴 关键,硬件故障等 LOG_ERR 🟠 错误 LOG_WARNING 🟡 警告 LOG_NOTICE 🔵 通知 LOG_INFO 🟢 一般信息 LOG_DEBUG ⚪ 调试信息 → 最低
重要规则:设置了某个优先级,会记录该级别及以上所有级别的日志。比如设
err,则err+crit+alert+emerg都会记。
4. rsyslog 配置规则
配置格式就是一个三段式:
设施.优先级 动作(去哪里) ↓ ↓ 来源 筛选 重定向
经典配置解读(Rocky)
# 查看主配置中生效的规则 grep -Ev "^#|^$" /etc/rsyslog.conf
*.info;mail.none;authpriv.none;cron.none /var/log/messages # 除了 mail、authpriv、cron 之外的 info 及以上日志 → 写到 messages authpriv.* /var/log/secure # 安全认证相关的所有日志 → 写到 secure mail.* -/var/log/maillog # 邮件相关所有日志 → 写到 maillog(- 表示异步写入) cron.* /var/log/cron # 定时任务相关日志 → 写到 cron *.emerg :omusrmsg:* # 所有设施的紧急日志 → 发给所有登录用户(终端弹窗警告) local7.* /var/log/boot.log # 启动流程日志 → 写到 boot.log
解读示例:
*.info;mail.none;authpriv.none;cron.none /var/log/messages— "我要记所有设施的 info 及以上日志,但 mail、authpriv、cron 的日志别混进来,它们有专门的文件。"
5. 选择器的多种写法
| 写法 | 含义 | 示例 |
|---|---|---|
* | 所有优先级 | kern.*内核所有日志 |
none | 不记录 | mail.none排除邮件日志 |
=priority | 仅该级别 | mail.=err只记 mail 的 err |
!priority | 排除该级别及以上 | mail.!info不记 info 及以上 |
? | 基于属性过滤 | :msg,contains,"error" /var/log/myerr.log |
6. 动作(Action)— 日志去哪?
| 动作 | 写法 | 说明 |
|---|---|---|
| 写入文件 | /var/log/xxx.log | 最常见的 |
| 异步写入 | -/var/log/xxx.log | 加-不阻塞 |
| 丢入黑洞 | /dev/null | 不想保留的日志 |
| 发给用户 | root或* | 发给已登录用户 |
| 发送远程 | @IP:端口 | UDP 发送 |
| 发送远程 | @@IP:端口 | TCP 发送(可靠) |
| 存数据库 | action(type="ommysql" ...) | 需装对应模块 |
| 丢弃 | stop | 不处理,扔掉 |
远程日志转发(重点)
角色: 日志客户端(Client)→ 发送日志 → 日志服务器(Server) Server 端:启用 UDP/TCP 模块监听 514 端口 Client 端:在规则中把日志动作指向 Server
# 服务端启用 TCP 接收(修改 /etc/rsyslog.conf) module(load="imtcp") input(type="imtcp" port="514") # 客户端配置,把日志转发到服务端 *.info;mail.none @@10.0.0.100:514
7. journalctl — systemd 日志查看
rsyslog 管的是文本日志(/var/log/ 下的文件),而 systemd 还有一个二进制日志系统journald,用journalctl查看。
| 命令 | 作用 |
|---|---|
journalctl -xeu 服务名 | 最常用!查看某个服务的详细日志(含错误解释) |
journalctl -f | 实时跟踪日志(类似tail -f) |
journalctl --since "10 min ago" | 只看最近 10 分钟 |
journalctl -p err | 只看 error 及以上级别的日志 |
💡推荐用法:服务起不来了?先跑
journalctl -xeu 服务名,比看配置文件快多了。
8. logrotate — 日志轮转切割
日志如果不切割,会越来越大,直到撑爆磁盘。logrotate 就是自动帮你切日志的工具。
/etc/logrotate.conf # 主配置 /etc/logrotate.d/ # 各服务的轮转规则
配置项解读
/var/log/messages { monthly # 每月轮转一次 rotate 4 # 保留最近 4 个归档 compress # 压缩归档(.gz) missingok # 文件不存在不报错 notifempty # 空文件不轮转 create 0600 root root # 轮转后新建日志文件的权限 }| 参数 | 含义 |
|---|---|
daily / weekly / monthly | 按时间轮转 |
size 100M | 按大小轮转(超过 100M 就切) |
rotate N | 保留 N 个旧版本 |
compress | 压缩归档 |
missingok | 日志文件不存在也不报错 |
notifempty | 日志为空则不轮转 |
create 权限 属主 属组 | 轮转后创建新日志文件 |
postrotate ... endscript | 轮转后执行的脚本(通常重启服务) |
实际生产环境通常时间和容量双重触发:每天切一次,但如果某天日志量特别大超过 100M 也会提前切。
二、共享存储
1. 存储类型总览
存储样式: DAS(直连存储) → 硬盘直接插在机器上 → 就像自己电脑的硬盘 NAS(网络附加存储)→ 通过网络共享文件 → 就像公司共享文件夹 SAN(存储区域网络)→ 通过光纤/网络共享块设备 → 就像远程硬盘(高级) 存储方式: 块存储 → 像硬盘一样用(可以分区、格式化)→ 对应 SAN 文件存储 → 像文件夹一样用(NFS、CIFS) → 对应 NAS 对象存储 → 像网盘一样用(存放、下载、分享)→ 对应 OSS/S3
2. NFS — 网络文件系统
NFS 是最经典的 Linux 文件共享方案,把一台机器的目录通过网络挂载到另一台机器上。
服务端配置
# 1. 安装 yum install nfs-utils -y # 2. 编辑共享配置 vim /etc/exports
/data/share 10.0.0.0/24(rw,sync,no_root_squash) # 共享目录 允许的网段(权限)
| 导出选项 | 含义 |
|---|---|
rw / ro | 读写 / 只读 |
sync | 同步写入(安全但慢) |
async | 异步写入(快但可能丢数据) |
no_root_squash | 客户端 root 保持 root 权限 |
root_squash | 默认客户端 root 映射为 nobody(安全) |
no_subtree_check | 禁用子树检查(提高性能) |
# 3. 生效配置 exportfs -r # 重新读取 exports exportfs -v # 查看当前导出的共享 # 4. 启动服务 systemctl enable --now nfs-server
客户端挂载
showmount -e 10.0.0.100 # 查看服务端有哪些共享目录 mount -t nfs 10.0.0.100:/data/share /mnt/nfs # 挂载 df -h # 确认已挂载 # 永久挂载 → 写入 /etc/fstab 10.0.0.100:/data/share /mnt/nfs nfs defaults 0 0
⚠️NFS 权限两层检查:先看
/etc/exports的网络权限(rw/ro),再看文件系统本身的权限(755/644)。两层都允许才能读写。
三、实时数据同步
1. 方案对比
| 方案 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| inotify + rsync | inotify 监控文件变化 → 触发 rsync 同步 | 简单、原生支持 | 高频变更时事件风暴、重复同步 |
| sersync + rsync | sersync 代替 inotify,事件去重 + 多线程 | 高效、配置简单、失败重试 | 项目已停更 |
2. inotify + rsync
inotify 监控命令
# 监控 /data 目录的文件变更(阻塞等待事件) inotifywait -mrq /data/ -e create,delete,close_write,attrib # 常用选项 -m # 持续监控(不加则只监控一次退出) -r # 递归监控子目录 -q # 只输出事件信息(不输出标题) -e # 指定要监控的事件 --format "%T %w%f" # 自定义输出格式 --timefmt "%F %T" # 时间戳格式
rsync 同步命令
# 本地同步 rsync -avz /源目录/ /目标目录/ # 推送到远程 rsync 服务 rsync -avz --delete /data/www/ rsyncer@10.0.0.13::dir1 # 常用选项 -a # 归档模式(保留权限、时间等属性) -v # 显示过程 -z # 压缩传输 --delete # 目标端删除源端不存在的文件(保持完全一致)
rsync 服务端配置
# /etc/rsyncd.conf uid = root gid = root log file = /var/log/rsyncd.log pid file = /var/run/rsyncd.pid [dir1] path = /data/dir1/ comment = sync dir1 read only = no auth users = rsyncer secrets file = /etc/rsyncd.pwd
# 密码文件(服务端) echo 'rsyncer:123456' > /etc/rsyncd.pwd chmod 600 /etc/rsyncd.pwd # 密码文件(客户端,只需密码) echo '123456' > /etc/rsyncd.pwd chmod 600 /etc/rsyncd.pwd
完整同步脚本
#!/bin/bash # inotify + rsync 实时同步脚本 SRC="/data/www/" DEST="rsyncer@10.0.0.13::dir1" PASS_FILE="/etc/rsyncd.pwd" LOG_FILE="/var/log/rsync_sync.log" inotifywait -mrq --timefmt '%F %T' --format '%T %w%f' \ -e create,delete,moved_to,close_write,attrib ${SRC} | \ while read TIME FILE; do rsync -az --delete --password-file=${PASS_FILE} ${SRC} ${DEST} \ && echo "${TIME} ${FILE} synced" >> ${LOG_FILE} done⚠️inotify 的坑:高频写入场景下,一个文件保存可能触发多个事件(CREATE + CLOSE_WRITE + ATTRIB),导致 rsync 被反复调用。这就是 sersync 要解决的问题。
3. sersync + rsync(增强版)
sersync 用 C++ 重写了 inotify 监控逻辑,自带事件去重、多线程并发、失败重试队列、内置 crontab。
# 1. 下载解压 wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz mv GNU-Linux-x86/ /usr/local/sersync # 2. 修改配置文件 /usr/local/sersync/confxml.xml
<inotify> <createFile start="true"/> <attrib start="true"/> <modify start="true"/> </inotify> <sersync> <localpath watch="/data/www"> <remote ip="10.0.0.13" name="dir1"/> </localpath> <rsync> <commonParams params="-artuz"/> <auth start="true" users="rsyncer" passwordfile="/etc/rsyncd.pwd"/> </rsync> </sersync>
# 3. 启动(守护进程模式) cd /usr/local/sersync ./sersync2 -dro ./confxml.xml # 参数说明 -d # 守护进程模式(后台运行) -r # 启动前先全量同步一次 -o # 指定配置文件
sersync 启动后会自动调整内核参数(
max_user_watches、max_queued_events),不需要手动调优。
今日干货总结
| 场景 | 用什么 | 一句话命令 |
|---|---|---|
| 看某个服务的日志 | journalctl | journalctl -xeu nginx |
| 配置日志收集规则 | rsyslog | facility.priority /var/log/xxx.log |
| 日志切分防爆盘 | logrotate | 配/etc/logrotate.d/ |
| 共享目录给其他机器 | NFS | exportfs -r+mount -t nfs |
| 实时同步文件到远程 | inotify+rsync | 写脚本循环监控 + 同步 |
| 生产级实时同步 | sersync+rsync | sersync2 -dro confxml.xml |
日志是排错的第一入口,共享存储是集群的基础,实时同步是数据一致性的保障 — 这三块做好,服务器管理就稳了一大半。