跳到主要内容

Logrotate 速查表:60+ 指令与命令带常见坑和可用模板

Logrotate 速查,覆盖指令、CLI 参数、postrotate 信号脚本、常见坑与 nginx/rsyslog/应用日志的完整可用模板。

  • 本地处理
  • 分类 开发运维
  • 适合 格式化、校验、压缩或检查和代码相关的文本。
63
CLI 命令 (8)
logrotate /etc/logrotate.conf

用主配置文件跑 logrotate。通常由 cron(/etc/cron.daily/logrotate)或 systemd timer 每天自动调用。

常见坑: 以非 root 用户手动跑可能静默跳过需要高权限的文件。之后记得检查状态文件。

例子
logrotate /etc/logrotate.conf
sudo logrotate /etc/logrotate.conf
logrotate -d /etc/logrotate.conf

空跑 / debug 模式。显示 logrotate 会做什么(哪些文件匹配、哪些会轮转、postrotate 是否合法),但不实际轮转任何文件。

常见坑: `-d` 隐含 `-v`。输出里写着 "rotating" 但实际没有任何文件被动过。每次测试新配置都记住这点。

例子
logrotate -d /etc/logrotate.conf
logrotate -d /etc/logrotate.d/nginx
sudo logrotate --debug /etc/logrotate.d/myapp
logrotate -f /etc/logrotate.conf

强制立刻轮转,即使还没到期(刚转过)。测试新配置时用它在"刚转过"的日志上触发实际轮转。

常见坑: 先用 `-d` 空跑。glob 配错的情况下 `-f` 可能移走或截断你不想动的文件。

例子
sudo logrotate -f /etc/logrotate.conf
sudo logrotate -f /etc/logrotate.d/nginx
sudo logrotate --force /etc/logrotate.d/myapp
logrotate -v /etc/logrotate.conf

详细输出模式。打印每个被检查的文件、是否被轮转及每条指令的结果,适合排查日志没有如期轮转的原因。

例子
sudo logrotate -v /etc/logrotate.conf
sudo logrotate -v /etc/logrotate.d/nginx
sudo logrotate -v -f /etc/logrotate.d/myapp
logrotate -f -v /etc/logrotate.d/<config>

对单个配置文件强制 + 详细输出。测试单个服务轮转配置时最常用的组合。

例子
sudo logrotate -f -v /etc/logrotate.d/nginx
sudo logrotate -f -v /etc/logrotate.d/myapp
logrotate -s <statusfile> /etc/logrotate.conf

使用自定义状态文件跟踪轮转时间戳。默认是 /var/lib/logrotate/status(某些发行版是 /var/lib/logrotate.status)。

常见坑: 如果状态文件对运行 logrotate 的用户不可写,"成功"的轮转不会被记录,每次运行都会重复轮转。

例子
logrotate -s /var/lib/logrotate/status /etc/logrotate.conf
logrotate -s /tmp/lr-test.status -f -v /etc/logrotate.d/nginx
cat /var/lib/logrotate/status

查看 logrotate 状态文件,了解每个日志文件上次轮转的时间。排查为什么某个文件没有(或意外)轮转时很有用。

例子
cat /var/lib/logrotate/status
grep nginx /var/lib/logrotate/status
grep myapp /var/lib/logrotate/status
logrotate --version

打印已安装的 logrotate 版本。部分指令(hourly、maxage、dateyesterday)需要 logrotate ≥ 3.9。

例子
logrotate --version
配置指令 (37)
rotate N

保留 N 份旧日志文件,再旧的删除。`rotate 7` 保留 7 份(log.1 … log.7)。设为 `rotate 0` 则轮转后立刻删除旧文件。

常见坑: 默认是 `rotate 4`,忘写这条的话第四次轮转之后旧日志就开始消失了。

例子
rotate 7
rotate 30
rotate 0  # delete immediately
daily

每天轮转一次。logrotate 检查状态文件里的上次轮转时间,超过 24 小时则轮转。

例子
daily
weekly

每周轮转一次——当前星期几小于上次轮转时的星期几,或距上次已超过 7 天时触发。

例子
weekly
monthly

每月轮转一次——在某月首次运行时轮转(前提是上次运行在上一个月)。

例子
monthly
yearly

每年轮转一次——在某年首次运行时轮转(前提是上次运行在上一年)。

例子
yearly
hourly

每小时轮转一次。需要 logrotate ≥ 3.9.0,且 logrotate 必须由 cron.hourly(不是 cron.daily)调用。

常见坑: 在只被 cron.daily 触发的配置里写 `hourly` 没有任何效果,logrotate 一天还是只跑一次。

例子
hourly
# also add to /etc/cron.hourly/logrotate:
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
size <size>

当日志文件达到指定大小时立刻轮转,不管时间。单位:k(KB)、M(MB)、G(GB)。每次 logrotate 运行时检查。

常见坑: `size` 会覆盖时间指令(daily/weekly)。同一个配置块里同时写了 size 和 daily,size 生效,daily 没用。

例子
size 100M
size 500k
size 1G
maxsize <size>

当文件超过指定大小时立刻轮转,即使时间条件还没到。与 `size` 不同,它和 daily/weekly 并存——大小条件或时间条件,哪个先到哪个触发。

例子
maxsize 100M
maxsize 500M
minsize <size>

只有当文件至少达到这个大小时才轮转,即使时间条件已满足。防止生成空的或几乎为空的归档。

例子
minsize 1M
minsize 10M
maxage <days>

删除超过 N 天的旧日志文件。独立于 `rotate` 计数——maxage 和 rotate 保留数量取较严格的那个。

常见坑: 需要 logrotate ≥ 3.9.0。在旧版本上这条指令会被静默忽略。

例子
maxage 30
maxage 90
compress

用 gzip(默认压缩工具)压缩轮转后的日志文件,添加 .gz 扩展名。

常见坑: 对活跃守护进程,永远配合 `delaycompress` 一起用——立刻压缩可能和守护进程对旧 fd 的尾部写入竞争,造成 .gz 损坏。

例子
compress
delaycompress
nocompress

轮转后的文件保持明文不压缩。适合磁盘空间充裕或需要快速访问最近归档日志(免去解压)的场景。

例子
nocompress
delaycompress

推迟一个轮转周期再压缩。刚刚轮转的文件(log.1)保持不压缩,上一次的(log.2)在本次运行时被压缩。

常见坑: 不加 `compress` 的话 `delaycompress` 没有任何效果。两条指令总是写在同一个块里。

例子
compress
delaycompress
compresscmd <cmd>

使用其他压缩命令代替 gzip。常用选项:bzip2(更小、更慢)、xz(最高压缩率、最慢)、zstd(快且压缩率不错)。

例子
compresscmd /usr/bin/bzip2
compressext .bz2
compresscmd /usr/bin/xz
compressext .xz
compressoptions -9
compresscmd /usr/bin/zstd
compressext .zst
compressoptions -19
compressoptions <flags>

向压缩命令传额外参数。对 gzip:`-9` 最高压缩率,`-1` 最快速度。

例子
compressoptions -9
compressoptions --fast
compressext .<ext>

压缩后归档文件的扩展名,默认 `.gz`。必须与 `compresscmd` 选择的压缩工具对应。

例子
compressext .bz2
compressext .xz
compressext .zst
copytruncate

把日志文件复制到新名称,然后将原文件截断为空。守护进程继续往同一 inode 写——适用于不能通过信号让其重新打开日志的进程。

常见坑: 从"复制完"到"截断完"之间写入的数据静默丢失——这个竞争窗口可能丢失几毫秒的日志。对于能接收信号的守护进程,优先用 postrotate + 信号方案。

例子
copytruncate
copy

把日志文件复制到新名称,但不截断原文件。适合需要快照而不影响活跃守护进程的外部日志采集器。

常见坑: `copy` 不会减小日志文件大小,原文件继续增长。需要配合单独的截断步骤,或只用于归档场景。

例子
copy
postrotate / endscript

日志文件轮转完成后执行的脚本块,用来通知守护进程重新打开日志文件。脚本由 /bin/sh 执行。

常见坑: 非零退出码会把本次轮转标记为失败。接入 logrotate 之前先用 `bash -x` 单独测脚本。

例子
/var/log/nginx/*.log {
    daily
    rotate 14
    compress
    delaycompress
    sharedscripts
    postrotate
        kill -USR1 $(cat /var/run/nginx.pid)
    endscript
}
prerotate / endscript

在日志轮转开始前执行的脚本块。即使因各种原因(missingok 等)日志实际不会被轮转,prerotate 也会运行。

常见坑: 与 postrotate 不同,prerotate 在因 `notifempty` 或未达到 `size` 而跳过轮转时也会运行——注意误发信号。

例子
/var/log/myapp/*.log {
    weekly
    prerotate
        /usr/local/bin/myapp-flush-buffers
    endscript
    postrotate
        systemctl kill -s USR1 myapp
    endscript
}
firstaction / endscript

在块内所有日志文件轮转开始之前执行一次的脚本块,无论 glob 匹配了多少个文件。

例子
/var/log/myapp/*.log {
    daily
    firstaction
        echo "Starting rotation at $(date)" >> /var/log/rotation-events.log
    endscript
}
lastaction / endscript

在块内所有日志文件都轮转完之后执行一次的脚本块。

例子
/var/log/myapp/*.log {
    daily
    lastaction
        echo "Rotation done at $(date)" >> /var/log/rotation-events.log
    endscript
}
sharedscripts

对 glob 匹配的所有文件只跑一次 postrotate / prerotate 脚本,而不是每个文件各跑一次。glob 匹配多个日志文件时必须加这条。

常见坑: 不加的话,`/var/log/nginx/*.log` 匹配两个文件时 nginx 会收到两次 SIGUSR1,没有危害但很浪费。用 glob 时永远加这条。

例子
/var/log/nginx/*.log {
    daily
    sharedscripts
    postrotate
        kill -USR1 $(cat /var/run/nginx.pid)
    endscript
}
nosharedscripts

默认行为。对每个被轮转的文件各跑一次 postrotate / prerotate 脚本。只有当每个文件需要不同的 postrotate 操作时才用。

例子
nosharedscripts
notifempty

如果日志文件为空(零字节)则跳过轮转,防止生成无意义的空压缩归档。

例子
notifempty
ifempty

即使日志文件为空也轮转。这是默认行为——大多数生产日志应该用 `notifempty` 覆盖它。

例子
ifempty
missingok

日志文件不存在时不报错。适合已安装但还没启动的服务,或可选日志。

常见坑: 关键服务的日志不应该用 `missingok`——日志文件不存在通常意味着服务挂了或配置出错。

例子
missingok
nomissingok

日志文件不存在时报错退出,这是默认行为。如果 glob 没有匹配到任何文件,logrotate 以非零值退出。

例子
nomissingok
dateext

在轮转后的文件名上追加日期(默认 YYYYMMDD)而不是数字后缀。access.log → access.log-20260628。

常见坑: 如果每天跑多次且生成同样的日期后缀,第二次会因"log.YYYYMMDD 已存在"而失败。子日级别轮转要用 `dateformat` 带上小时组件。

例子
dateext
dateext
dateformat -%Y%m%d-%H%M
dateformat <fmt>

自定义 `dateext` 追加的日期后缀格式,使用 strftime 格式字符串。子日级别轮转要加上 `%H%M` 避免文件名冲突。

例子
dateext
dateformat -%Y-%m-%d
dateext
dateformat -%Y%m%d-%H%M  # hourly without collision
dateyesterday

使用 `dateext` 时用昨天的日期而不是今天的。适合在午夜触发轮转的场景——轮转出来的文件代表昨天的流量。

常见坑: 需要 logrotate ≥ 3.9.0,旧版本上静默忽略。

例子
dateext
dateyesterday
create <mode> <owner> <group>

轮转后创建一个新的空日志文件,使用指定的权限、所有者和组。权限用八进制。省略 mode/owner/group 则继承原文件属性。

常见坑: 如果守护进程无法写入新创建的文件(所有者或权限不对),它会静默丢弃日志条目,直到你修复权限。

例子
create 0640 www-data adm
create 0644 nginx nginx
create  # use original file attributes
nocreate

轮转后不创建新日志文件。适用于守护进程在下次写入时会自动创建日志文件,或使用 `copytruncate` 的场景。

例子
nocreate
olddir <path>

把轮转后的日志文件移到另一个目录,适合把活跃日志和归档分放在不同挂载点上。

常见坑: olddir 必须与日志文件在同一文件系统,否则 logrotate 退回到复制+删除,对大日志很慢。

例子
olddir /var/log/archive
olddir /mnt/logarchive/nginx
su <user> <group>

以指定用户和组的身份执行轮转。当日志文件归属非 root 用户而 logrotate 以 root 身份运行时必须加。

常见坑: 不加 `su` 的话,以 root 运行的 logrotate 可能把轮转后的文件归属为 root,导致守护进程在下次轮转后无法写入。

例子
su www-data www-data
su nginx nginx
tabooext [+] <ext> ...

处理引用目录的配置时跳过带这些扩展名的文件。默认列表包括:.bak .rpmsave .rpmorig .orig .dpkg-old .dpkg-dist。

常见坑: /etc/logrotate.d/ 里的配置文件名必须没有扩展名。命名为 nginx.conf 的文件会被默认 tabooext 静默跳过。

例子
tabooext + .conf .log  # add .conf and .log to default list
tabooext .bak          # REPLACE default list with just .bak
include <path>

引入另一个配置文件或目录下的所有文件。从 /etc/logrotate.d/ 加载各服务配置的标准方法。

常见坑: `include <dir>` 不递归——子目录里的文件不会被加载。只读取指定目录的顶层文件。

例子
include /etc/logrotate.d
include /etc/logrotate.d/nginx
守护进程信号 (6)
kill -USR1 $(cat /var/run/nginx.pid)

向 nginx 发送 SIGUSR1 让它重新打开日志文件。nginx 优雅完成当前请求后开始写入新日志。放在 postrotate 块里。

常见坑: nginx 没运行时 `cat /var/run/nginx.pid` 非零退出,postrotate 失败。防护写法:`[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)`。

例子
kill -USR1 $(cat /var/run/nginx.pid)
[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid) || true
nginx -s reopen
nginx -s reopen

nginx SIGUSR1 的替代写法。通过 nginx master 进程发送 reopen 信号,比手动查 PID 稍微更可靠。

例子
nginx -s reopen
sudo nginx -s reopen
kill -HUP $(cat /var/run/apache2/apache2.pid)

向 Apache httpd 发送 SIGHUP,优雅地重新打开日志文件。Apache 完成进行中的请求之后再重新打开。

常见坑: 部分发行版的 PID 文件在 /var/run/httpd/httpd.pid 或 /run/apache2/apache2.pid。kill 失败时用 `ps aux | grep apache` 确认位置。

例子
kill -HUP $(cat /var/run/apache2/apache2.pid)
apachectl graceful
systemctl reload apache2
systemctl kill -s USR1 rsyslog.service

通过 systemd 向 rsyslog 发送 SIGUSR1 让它重新打开所有日志文件。在 systemd 系统上比直接 kill 更好,因为它能处理 socket activation。

例子
systemctl kill -s USR1 rsyslog.service
systemctl reload rsyslog
kill -USR1 $(cat /var/run/syslogd.pid)
kill -USR1 $(cat /var/run/mysqld/mysqld.pid)

刷新并重新打开 MySQL 通用查询日志和慢查询日志。SIGUSR1 等效于对文件型日志执行 `FLUSH LOGS`。

常见坑: MySQL 二进制日志(binlog)不受 SIGUSR1 影响,需要在 MySQL 内执行 `FLUSH BINARY LOGS`。

例子
kill -USR1 $(cat /var/run/mysqld/mysqld.pid)
mysqladmin -u root -p flush-logs
systemctl reload postgresql

不断开连接地重载 PostgreSQL 配置。PostgreSQL 在收到 SIGHUP 时重新打开日志文件,这是在 postrotate 里触发的最干净方式。

例子
systemctl reload postgresql
pg_ctlcluster 14 main reload
kill -HUP $(head -1 /var/lib/postgresql/14/main/postmaster.pid)
常见坑 (7)
copytruncate race condition

从"复制完"到"截断完"之间写入的数据静默丢失。高流量服务器每秒写 10K 行时,每次轮转可能丢失几秒的日志条目。

常见坑: 缓解方案:对所有支持信号的守护进程用 `postrotate` + SIGUSR1。`copytruncate` 只用于没有其他办法的遗留守护进程。

例子
# AVOID for live daemons:
copytruncate

# PREFER (zero data loss):
sharedscripts
postrotate
    kill -USR1 $(cat /var/run/nginx.pid)
endscript
compress without delaycompress

对刚轮转的文件立刻压缩,会与守护进程向旧文件描述符的最后写入竞争,产生损坏或不完整的 .gz 归档。

常见坑: 活跃守护进程的日志块里永远把 `compress` 和 `delaycompress` 写在一起。

例子
# CORRECT:
compress
delaycompress

# RISKY for live daemons:
compress
# (no delaycompress)
postrotate exit code ≠ 0

postrotate、prerotate、firstaction 或 lastaction 任何一个非零退出,状态文件就标记本次轮转失败。但此时日志文件已经被重命名了——守护进程在往一个不存在的路径写。

常见坑: 调试方法:用 `bash -x /tmp/test-postrotate.sh` 确认退出 0,再接入 logrotate。

例子
# Guard against missing PID file:
postrotate
    [ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid) || true
endscript
dateext sub-daily collision

如果每天跑多次(比如每小时),而 `dateext` 只含日期不含时间,第二次运行会发现 `access.log-20260628` 已存在而失败。

常见坑: 修复:`dateformat -%Y%m%d-%H%M` 加上小时和分钟,保证每次轮转的文件名在当天内唯一。

例子
# BROKEN for hourly rotation:
dateext
# dateformat -%Y%m%d (default)

# FIXED:
dateext
dateformat -%Y%m%d-%H%M
tabooext silently skips /etc/logrotate.d/ configs

/etc/logrotate.d/ 里的配置文件名必须没有扩展名。`nginx.conf`、`myapp.log` 或 `service.bak` 这样的文件会被默认 tabooext 静默忽略。

常见坑: 正确命名:`nginx`、`myapp`、`rsyslog`——纯单词,没有扩展名。

例子
# WRONG — silently skipped:
/etc/logrotate.d/nginx.conf

# CORRECT:
/etc/logrotate.d/nginx
su directive and file ownership

当 logrotate 以 root 运行但日志归属某个应用用户时,轮转后的文件可能归属 root,导致守护进程在收到 postrotate 信号后无法写入新日志文件。

常见坑: 修复:加上 `su <user> <group>` 和 `create <mode> <user> <group>`,同时设置好备份文件和新日志文件的正确归属。

例子
/var/log/myapp/*.log {
    daily
    su myapp myapp
    create 0640 myapp myapp
    rotate 30
}
status file not writable

如果状态文件(/var/lib/logrotate/status)对运行 logrotate 的用户不可写,每次运行都认为"还没轮转过"并再次轮转——无限重复每日轮转。

常见坑: 检查方法:`ls -la /var/lib/logrotate/`,确认状态文件对 logrotate 进程用户可写。

例子
ls -la /var/lib/logrotate/status
sudo chown root:root /var/lib/logrotate/status
sudo chmod 644 /var/lib/logrotate/status
配置模板 (5)
Nginx access + error logs

nginx 生产级 logrotate 配置。每天轮转、保留 30 天、延迟压缩、对所有日志文件只发一次信号。

例子
/var/log/nginx/*.log {
    daily
    rotate 30
    compress
    delaycompress
    notifempty
    missingok
    sharedscripts
    dateext
    dateformat -%Y%m%d
    create 0640 www-data adm
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid) || true
    endscript
}
Generic application log

通用应用日志配置,适用于支持 SIGUSR1 重开日志的应用。每天轮转、保留 14 天、延迟 gzip、用正确归属创建新文件。

例子
/var/log/myapp/*.log {
    daily
    rotate 14
    compress
    delaycompress
    notifempty
    missingok
    sharedscripts
    dateext
    su myapp myapp
    create 0640 myapp myapp
    postrotate
        systemctl kill -s USR1 myapp.service || true
    endscript
}
rsyslog / syslog system logs

标准系统日志配置,覆盖 /var/log/syslog、messages、kern.log 等。每周轮转、保留 4 周、压缩、只发一次信号给 rsyslog。

例子
/var/log/syslog
/var/log/messages
/var/log/kern.log
/var/log/auth.log
{
    weekly
    rotate 4
    compress
    delaycompress
    notifempty
    missingok
    sharedscripts
    postrotate
        /usr/lib/rsyslog/rsyslog-rotate
    endscript
}
Docker file-based log

Docker 使用 json-file 日志驱动并将输出重定向到命名路径时的配置。使用 copytruncate,因为 Docker 日志守护进程不能通过信号重新打开文件。

例子
/var/lib/docker/containers/*/*-json.log {
    daily
    rotate 7
    compress
    delaycompress
    notifempty
    missingok
    copytruncate
    maxsize 100M
}
MySQL slow query log

每天轮转 MySQL 慢查询日志。使用 mysqladmin flush-logs 安全地重新打开文件,避免 SIGUSR1 影响二进制日志。

常见坑: FLUSH LOGS 同时也轮转二进制日志。如果只想重开文本日志,用 `FLUSH SLOW LOGS` 或 `FLUSH ERROR LOGS`(MySQL 5.7+)。

例子
/var/log/mysql/mysql-slow.log {
    daily
    rotate 14
    compress
    delaycompress
    notifempty
    missingok
    su mysql mysql
    create 0640 mysql adm
    postrotate
        mysqladmin -u root -p"${MYSQL_ROOT_PASS}" flush-slow-logs 2>/dev/null || true
    endscript
}

这个工具能做什么

可搜索的 logrotate 速查,涵盖运维值班时真正会用到的所有指令、CLI 参数和 postrotate 信号脚本。60+ 条目分五大类:CLI 命令(-d 空跑、 -f 强制轮转、-v 详细输出、-s 自定义状态文件、单配置调试),配置 指令(rotate N、daily / weekly / monthly / yearly / hourly / size / maxsize / minsize / maxage、compress + delaycompress 配合用法、 copytruncate 与默认重命名的选择、postrotate / prerotate / firstaction / lastaction 脚本、sharedscripts 共享脚本、notifempty、 missingok、dateext + dateformat + dateyesterday、create + nocreate、 olddir、su 指令、tabooext 扩展名过滤、include 引入),各主流守护 进程在 postrotate 里重新打开日志的信号脚本(nginx / Apache / rsyslog / MySQL / PostgreSQL),常见坑(copytruncate 的数据竞争窗口、 compress 不配 delaycompress 造成 gz 损坏、postrotate 非零退出中断 轮转、dateext 子日级别冲突、tabooext 默认扩展名踩坑、需要 su 指令 的权限场景),以及五份直接复制可用的完整配置模板(nginx access + error 日志、通用应用日志、rsyslog 系统日志、Docker 文件型日志、 MySQL 慢查询日志)。每条都有指令本体、中英文说明、对应的"常见坑" 和一到多条可直接复制的例子。按分类过滤、输入搜索跨字段匹配、 一键复制。完全在浏览器内运行,不上传任何日志或配置内容。

工具细节

输入
文本
页面会根据工具类型展示文本框、数值控件、文件选择或结构化输入。
输出
即时结果 + 复制
结果区优先给出可操作结果,支持项会显示复制、下载或可视化预览。
隐私
浏览器本地处理
主工具逻辑未发现外部 API 调用,输入通常留在当前标签页内处理。
保存 / 分享
可分享链接状态
关键设置会进入 URL,复制链接后别人能复现同一组参数。
性能预算
首屏 JS ≤ 32 KB
没有声明 WASM 依赖,适合快速打开和移动端使用。
适用场景
开发运维 · 运营
分类和职业标签用于推荐相关工具、组织内链,并帮助用户快速判断是否适合当前任务。

怎么用

  1. 1. 输入

    把内容粘贴或拖入工具面板。

  2. 2. 处理

    点击按钮,在浏览器内本地处理,文件不上传。

  3. 3. 复制 / 下载

    一键复制结果或下载到本地。

Logrotate 速查表 适合怎么用

适合穿插在写代码、查问题、做 Review、上线前的小任务里。

适合开发场景

  • 格式化、校验、压缩或检查和代码相关的文本。
  • 把片段整理好再放进文档、工单、提交或交接材料。
  • 不切换工具,快速检查一个小 payload。

开发检查项

  • 压缩、混淆这类不可逆处理,先对副本操作。
  • 除非确认工具本地处理,不要粘贴密钥和敏感片段。
  • 转换后的代码上线前,仍要跑自己的测试或 lint。

下一步可以接着做

这些入口会把当前任务接到更完整的工具链里。

  1. 1 Nginx 速查表 Nginx 速查表,常见配置、location/server 块、SSL、反代、gzip,真实例子和常见坑。 打开
  2. 2 Bash 速查表 Bash 速查表,100+ 命令和习语,涵盖变量、条件、循环、函数、管道、信号陷阱,真实一行命令。 打开
  3. 3 awk + sed 命令速查 awk + sed 命令速查,80+ 条文本处理一行命令,真实例子和常见坑。 打开

真实使用场景

  • 不碰线上日志先调试新 logrotate 配置

    你刚给新微服务写了 /var/log/myapp/*.log 的轮转配置,跑一下 `logrotate -d /etc/logrotate.d/myapp`,logrotate 会输出匹配到 了哪些文件、会做什么轮转、postrotate 语法有没有问题,一个字节 都不会动。在空跑循环里改到没问题,再 `logrotate -f` 触发第一次 真正轮转。

  • 轮转后让 nginx 写新日志而不是老文件

    logrotate 把 access.log 重命名成 access.log.1 之后,nginx 还拿着 老 inode 的文件描述符一直往里写,新的 access.log 一直是空的, 直到下次重启。在速查里搜"signal",复制带 `kill -USR1 $(cat /var/run/nginx.pid)` 的 nginx postrotate 块,nginx 立刻重新打开 日志文件。再加 `sharedscripts` 让信号只发一次,不管匹配了几个 nginx 日志文件。

  • 给不能重新打开文件的守护进程安全轮转日志

    一个老 Python 服务启动时打开 /var/log/pyapp/app.log,之后再也不 关。搜"copytruncate",在配置块里加上这条指令,logrotate 把内容 复制到 app.log.1 再把原文件截断为空,Python 进程继续往同一 inode 写,你也拿到了归档副本。速查里也写了竞争窗口的坑,让你 清楚复制到截断这段时间内写入的数据会丢。

常见踩坑

  • 用 glob 却不加 `sharedscripts`,postrotate 对每个匹配文件各跑一次,向守护进程发送多余的 reload 信号。

  • 给活跃守护进程用了 `compress` 但没加 `delaycompress`,gzip 步骤与守护进程往老 fd 的最后写入竞争,产生损坏的 .gz 文件。

  • 把 logrotate 配置文件放进 /etc/logrotate.d/ 时加了扩展名(比如 nginx.conf),默认 tabooext 列表会静默跳过 .conf 文件。

隐私说明

这份速查是个静态页,搜索完全在浏览器内存里对指令数组做过滤,你的 logrotate 配置不会被上传、不会在服务端解析、也不会进 URL。气隙机器 和运维堡垒机上放心用。

常见问题

类似工具组合

做你这行的人, 还会一起用这些。

Made by Toolora · 100% client-side · Updated 2026-07-01