FreeBSD日志轮转
服务器运行一段时间后,日志文件可能持续增长,占用越来越多的磁盘空间。FreeBSD自带的newsyslog可以按文件大小或时间条件轮转日志,并设置归档数量及压缩方式。先用一个独立测试文件验证配置,再应用到业务日志,可以减少误操作对现有服务的影响。
一、确认环境与操作范围
以下示例使用FreeBSD的基础系统工具,不需要额外安装日志管理软件。
先查看系统版本及命令位置。
freebsd-version
command -v newsyslog
后续文件操作需要root权限。普通用户可以切换到root,再进入sh执行示例中的命令。
su -
/bin/sh
本例仅使用两个独立文件。
/var/log/zzbaike-demo.log
/usr/local/etc/newsyslog.conf.d/zzbaike-demo.conf
如果服务器上已经存在同名文件,先备份或更换示例名称。不要直接拿正在使用的数据库日志、访问日志进行强制轮转测试。
二、创建测试日志
创建日志文件并设置权限,然后写入一条测试内容。
touch /var/log/zzbaike-demo.log
chown root:wheel /var/log/zzbaike-demo.log
chmod 640 /var/log/zzbaike-demo.log
printf '%s\n' 'newsyslog test before rotation' \
>> /var/log/zzbaike-demo.log
检查文件。
ls -l /var/log/zzbaike-demo.log
cat /var/log/zzbaike-demo.log
这里使用640权限,供文件所有者读写、同组用户读取,不向其他用户开放日志内容。实际业务日志还需要结合写入进程使用的账号设置所有者和权限。
三、编写日志轮转规则
创建配置目录。
mkdir -p /usr/local/etc/newsyslog.conf.d
写入示例规则。
cat > /usr/local/etc/newsyslog.conf.d/zzbaike-demo.conf <<'EOF'
/var/log/zzbaike-demo.log root:wheel 640 7 1024 24 JN
EOF
这条规则中,各字段的含义如下。
/var/log/zzbaike-demo.log是需要管理的日志文件。root:wheel指定所有者和所属组。640设置轮转后日志及归档的权限。7表示最多保留7份归档,不包含当前正在写入的日志。1024表示按大小判断时的阈值为1024KB。24表示按时间判断时,距离上次轮转达到24小时。J表示使用bzip2压缩归档。N表示轮转后不需要通知任何写入进程。
本例使用N,是因为测试内容通过短时运行的命令写入,没有常驻进程持续持有日志文件。不要把这个标志直接套用到所有应用日志上。
四、先模拟检查,再执行轮转
先指定配置文件进行模拟检查。
newsyslog -nv \
-f /usr/local/etc/newsyslog.conf.d/zzbaike-demo.conf
-n不会实际轮转日志,-v用于输出详细信息。检查输出中是否包含正确的文件路径,以及是否出现配置解析错误。
为了验证归档效果,可以仅对测试日志强制执行一次轮转。
newsyslog -Fv \
-f /usr/local/etc/newsyslog.conf.d/zzbaike-demo.conf \
/var/log/zzbaike-demo.log
该命令同时限定配置文件和日志路径,避免误操作其他日志。-F会跳过正常的大小及时间条件,因此只用于这次验证,不要放入日常定时任务。
检查轮转结果。
ls -lh /var/log/zzbaike-demo.log*
正常完成后,应能看到当前日志和第一份压缩归档。
/var/log/zzbaike-demo.log
/var/log/zzbaike-demo.log.0.bz2
读取归档中的内容。
bzcat /var/log/zzbaike-demo.log.0.bz2
再向当前日志写入一条内容,确认新文件可以正常使用。
printf '%s\n' 'newsyslog test after rotation' \
>> /var/log/zzbaike-demo.log
tail -n 5 /var/log/zzbaike-demo.log
新内容应出现在当前日志中,轮转前的测试内容应保留在归档中。后续轮转会按规则更新归档序号,并限制保留数量。
五、检查配置是否纳入定时执行
手动指定-f能够执行,并不代表系统定时任务已经加载了这份配置。
检查主配置中的包含规则。
grep -n '<include>' /etc/newsyslog.conf
FreeBSD的默认配置会加载指定配置目录中以.conf结尾、且不以点开头的文件。本例需要确认主配置包含下面这一目录规则。
<include> /usr/local/etc/newsyslog.conf.d/[!.]*.conf
如果已有该规则,不要重复添加。如果服务器使用了自定义主配置,应先备份,再将需要的包含规则补入。
随后检查cron服务和现有调度。
service cron status
grep -n newsyslog /etc/crontab
newsyslog通常由cron定期调用,本身不是需要常驻运行的服务。若系统已经配置了调度,保留现有任务即可,不要额外添加重复执行项。
最后,通过主配置再次检查测试日志。
newsyslog -nv /var/log/zzbaike-demo.log
确认它能够读取刚才设置的轮转规则。
六、应用到真实业务日志时要注意什么
业务程序可能长时间持有日志文件。文件改名之后,如果没有通知程序重新打开日志,它可能继续向旧文件写入。
newsyslog支持通过PID文件和信号通知写入进程,但具体配置必须对应实际服务。不能把syslogd使用的处理方式直接复制给Nginx、数据库或其他应用,也不要通过随意填写PID和信号来消除报错。
接入业务日志前,建议先明确三件事。
- 日志由哪个进程写入,使用什么账号。
- 应用是否已经有自己的轮转机制。
- 轮转后需要怎样通知应用重新打开日志文件。
日志轮转负责管理文件大小和保留数量。如果还需要记录登录及文件操作等安全事件,可以结合站内的FreeBSD安全审计教程配置对应的审计策略。
七、常见问题
1. 设置1024KB后,为什么文件还能继续增长
newsyslog只有被执行时才检查文件。两次调度之间,日志仍可能继续增长,因此大小阈值不是实时硬限制。需要结合日志增长速度和调度频率安排轮转。
2. 保留7份归档是否等于保留7天
不等于。按大小触发时,一天可能生成多份归档。保留数量控制的是文件份数,实际覆盖的时间取决于日志增长速度和轮转频率。
3. 修改规则后是否需要重启newsyslog
不需要。newsyslog在每次执行时读取配置。修改后先模拟检查,再等待现有调度执行即可。
八、撤销测试配置
完成验证后,如果不准备继续管理这个测试日志,可以将配置文件改为不以.conf结尾的名称。
mv /usr/local/etc/newsyslog.conf.d/zzbaike-demo.conf \
/usr/local/etc/newsyslog.conf.d/zzbaike-demo.conf.disabled
在采用前述包含规则的情况下,该文件将不再被自动加载。测试日志和归档可以先保留,确认不再需要后再单独清理,不必修改其他服务的日志配置。
广告合作
QQ群号:4114653
- 本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com(#改为@)。
- 本站原创内容未经允许不得转载,转载请注明出处“站长百科”和原文地址。