日志服务与文件共享

📋 日志服务与文件共享

一句话总结:学了 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 + rsyncinotify 监控文件变化 → 触发 rsync 同步简单、原生支持高频变更时事件风暴、重复同步
sersync + rsyncsersync 代替 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_watchesmax_queued_events),不需要手动调优。


今日干货总结

场景用什么一句话命令
看某个服务的日志journalctljournalctl -xeu nginx
配置日志收集规则rsyslogfacility.priority /var/log/xxx.log
日志切分防爆盘logrotate/etc/logrotate.d/
共享目录给其他机器NFSexportfs -r+mount -t nfs
实时同步文件到远程inotify+rsync写脚本循环监控 + 同步
生产级实时同步sersync+rsyncsersync2 -dro confxml.xml

日志是排错的第一入口,共享存储是集群的基础,实时同步是数据一致性的保障 — 这三块做好,服务器管理就稳了一大半。