logrotate 日志滚动的使用

最近由于最近上一个了项目,但是项目的本身没有做日志的滚动,导致日志一直在增长,这样下去肯定会撑爆磁盘,导致不可预测的结果   
这个适合logrotate就出场了

作用

 logrotate is designed to ease administration of systems that generate large numbers of log files. It allows automatic rotation, compression, removal,   
  and mailing of log files. Each log file may be handled daily, weekly, monthly, or when it grows too large.

正如man logrotate说的那样,logrotate可以实现自动轮替、压缩、删除日志、并且发邮件的功能

使用

root@49335c6e5ee3:/var/log# logrotate --help
Usage: logrotate [OPTION...] <configfile>
  -d, --debug               Don't do anything, just test (implies -v)
  -f, --force               Force file rotation
  -m, --mail=command        Command to send mail (instead of `/usr/bin/mail')
  -s, --state=statefile     Path of state file
  -v, --verbose             Display messages during rotation
  -l, --log=STRING          Log file or 'syslog' to log to syslog
      --version             Display version information

Help options:
  -?, --help                Show this help message
      --usage               Display brief usage message

也就是说,可以手动的执行 logrotate configfile 文件,那配置文件里的内容怎么设置呢,如下demo:

/var/log/cron.log {
  daily
  rotate 7
  notifempty
  create
  size 1K
  nocompress
  nodateext
  missingok
}

解释说明

参数说明
daily按天滚动
rotate保留的文件数量
notifempty如日志为空,则进行滚动
create旧日志文件轮替后创建新的日志文件
size日志达到多少进行日志滚动
nocompress日志文件不进行压缩
nodateext日志文件,以数字递增的形式增加,如:log.1
missingok假如日志文件不存在,不报错

具体的详细说明,参照man logrotate

运行机制

对安装了cron的系统来说,crontab会每天定时执行/etc/cron.daily目录下的脚本,而这个目录下有个文件叫logrotate :

 #!/bin/sh

test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf

我们看到 每天会运行/usr/sbin/logrotate /etc/logrotate.conf 这个命令,
在linux上 文件/etc/logrotate.conf内容如下:

# see "man logrotate" for details
# rotate log files weekly
weekly

# use the syslog group by default, since this is the owning group
# of /var/log/syslog.
su root syslog

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
#compress

# packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
    missingok
    monthly
    create 0664 root utmp
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0660 root utmp
    rotate 1
}

# system-specific logs may be configured here

我们看到include /etc/logrotate.d,会把/etc/logrotate.d目录下的文件include进来,
所以对于用户来说在/etc/logrotate.d 配置文件,就可以,总结一下
logrotate的配置文件:

/etc/logrotate.d/*   
/etc/logrotate.conf
<think>好的,我现在要处理用户关于“tail -f日志滚动”的问题。首先,我需要理解用户的问题。用户在使用tail -f命令时,日志文件没有自动滚动更新,可能是指即使日志文件被轮转(比如通过logrotate),tail -f仍然在追踪旧文件,没有切换到新生成的日志文件。接下来,我需要分析可能的原因和解决方案。 首先,回忆一下tail -f和-F选项的区别。tail -f默认是跟踪文件描述符,而-F会跟踪文件名,当文件被轮转时,会重新打开新文件。所以用户可能应该使用-F选项,但用户可能并不知道这个区别。这时候需要解释两者的不同,并建议使用-F。 其次,考虑日志轮转的机制。当logrotate执行时,通常会重命名原日志文件并创建新文件。例如,app.log变成app.log.1,然后新建app.log。如果使用tail -f,它会继续跟踪原来的文件描述符(即app.log.1),而不会切换到新的app.log。因此,用户需要知道-F选项或者使用其他工具如tail --follow=name。 另外,可能需要检查用户使用的tail版本是否支持-F选项。某些较旧的系统可能不支持,这时候需要提供替代方法,比如使用循环结合tail -f或其他工具。 还需要考虑是否有其他原因导致日志滚动,例如权限问题导致tail无法访问新文件,或者日志轮转没有正确触发。这时候需要用户检查logrotate配置,确认是否生效,比如查看logrotate的状态文件或手动运行logrotate测试。 另外,用户可能没有意识到需要重新打开文件,可以建议在logrotate配置中添加postrotate脚本,例如重启应用程序或发送信号让应用重新打开日志文件,但这可能不适用于所有情况。 最后,可能需要综合这些因素,给出分步骤的解决方案,比如首先建议使用tail -F,其次检查logrotate配置,再检查权限,最后考虑其他替代方法如使用multitail等工具。</think>关于使用`tail -f`追踪日志时文件不滚动的问题,以下是逐步分析及解决方案: --- ### **1. 现象描述** 当使用`tail -f filename.log`追踪日志时,若日志文件被轮转(如通过`logrotate`重命名为`filename.log.1`并新建空文件`filename.log`),`tail -f`可能仍持续追踪旧文件(`filename.log.1`),而不会自动切换到新文件`filename.log`。 --- ### **2. 核心原因** - **`tail -f`的工作原理**:默认追踪文件的**描述符(inode)**,而非文件名。当日志轮转时,原文件被重命名,但`tail -f`仍跟踪旧文件的inode,导致无法感知新文件。 --- ### **3. 解决方案** #### **方法1:使用`tail -F`替代`tail -f`** - **命令**:`tail -F filename.log` - **原理**:`-F`选项会追踪**文件名**而非文件描述符。当日志轮转后,它会自动检测到文件变化并重新打开新文件。 - **验证**: ```bash # 查看当前追踪的文件名 lsof -p $(pgrep tail) | grep filename.log ``` #### **方法2:检查`logrotate`配置** 确保日志轮转后触发信号或动作,使应用程序重新打开日志文件: - **示例配置**(`/etc/logrotate.d/your_app`): ```bash /var/log/filename.log { daily rotate 7 compress delaycompress missingok notifempty create 644 root root postrotate # 向应用程序发送信号(如HUP)以重新打开日志文件 kill -HUP $(cat /var/run/your_app.pid) endscript } ``` #### **方法3:手动验证日志轮转** - 执行日志轮转测试: ```bash sudo logrotate -vf /etc/logrotate.d/your_app ``` - 观察`tail -f`是否切换到新文件。若无,说明配置可能未生效。 #### **方法4:使用替代工具** - **`multitail`**:支持自动追踪新文件。 ```bash multitail -f filename.log ``` - **`less +F`**:按`F`键进入追踪模式,按`Ctrl+C`后重新加载文件。 --- ### **4. 关键区别:`-f` vs `-F`** | 选项 | 追踪对象 | 是否感知文件轮转 | |------------|---------------|------------------| | `tail -f` | 文件描述符 | ❌ 否 | | `tail -F` | 文件名 | ✔️ 是 | --- ### **5. 特殊情况处理** - **旧系统兼容性**:若`tail`不支持`-F`(如Solaris),使用循环: ```bash while true; do tail -n 100 filename.log; sleep 1; done ``` - **权限问题**:确保用户对**新日志文件**有读取权限。 --- ### **总结** - **优先方案**:使用`tail -F`直接追踪文件名。 - **补充措施**:检查`logrotate`配置的`postrotate`脚本是否生效。 - **替代工具**:尝试`multitail`或`less +F`增强追踪能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值