<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.linuxsa.org/index.php?action=history&amp;feed=atom&amp;title=Logrotate%E8%BD%AE%E8%AF%A2%E6%97%A5%E5%BF%97</id>
	<title>Logrotate轮询日志 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.linuxsa.org/index.php?action=history&amp;feed=atom&amp;title=Logrotate%E8%BD%AE%E8%AF%A2%E6%97%A5%E5%BF%97"/>
	<link rel="alternate" type="text/html" href="https://wiki.linuxsa.org/index.php?title=Logrotate%E8%BD%AE%E8%AF%A2%E6%97%A5%E5%BF%97&amp;action=history"/>
	<updated>2026-04-17T10:23:08Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://wiki.linuxsa.org/index.php?title=Logrotate%E8%BD%AE%E8%AF%A2%E6%97%A5%E5%BF%97&amp;diff=629&amp;oldid=prev</id>
		<title>Evan：​/* 参考 */</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxsa.org/index.php?title=Logrotate%E8%BD%AE%E8%AF%A2%E6%97%A5%E5%BF%97&amp;diff=629&amp;oldid=prev"/>
		<updated>2019-12-06T03:09:38Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;参考&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==前言==&lt;br /&gt;
日志的重要性，作为运维 你懂的！  以前我自己的环境是直接打包rpm 包 加上 日志切割的，没去理，今天有台以前的机器因log爆硬盘了，于是没事记录一下 &lt;br /&gt;
网上很多教程都推荐什么 诸如每天切分Nginx日志之类的shell 脚本 然后cront定时跑，大家似乎遗忘了Logrotate，争相发明自己的轮子，这真是尴尬呀 为什么不用现成，剩下的时间少点写代码，多点陪陪家人，泡泡妹子呀 ！就好比明明身边有美女，你却忙着玩王者荣耀，罪过！当然 如果是喜欢游戏的妹子，那是另外一回事!&lt;br /&gt;
===定义===&lt;br /&gt;
logrotate is a bash script which can rotate log files and multilog log directories and archive them in a central location.logrotate requires GNU bash, GNU gzip and GNU date.&lt;br /&gt;
&lt;br /&gt;
logrotate 是一个 Bash 的 SHELL 脚本，可对日志文件进行切分，并将切分后的日志放在统一目录。 logrotate 要求 GNU bash, GNU gzip and GNU date.&lt;br /&gt;
&lt;br /&gt;
==主体==&lt;br /&gt;
logrotate的配置文件是/etc/logrotate.conf，而/etc/logrotate.d/是用于存储其他配置文件的目录。该目录里的所有文件都会被主动的读入 /etc/logrotate.conf中执行。&lt;br /&gt;
===logrotate===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 vi  /etc/logrotate.d/nginx&lt;br /&gt;
/usr/local/nginx/logs/*log {&lt;br /&gt;
daily&lt;br /&gt;
rotate 10&lt;br /&gt;
missingok&lt;br /&gt;
notifempty&lt;br /&gt;
compress&lt;br /&gt;
sharedscripts&lt;br /&gt;
postrotate&lt;br /&gt;
if [ -f /usr/local/nginx/nginx.pid ]; then&lt;br /&gt;
#/etc/init.d/nginx restart&lt;br /&gt;
kill -HSR1 `cat /usr/local/nginx/nginx.pid`&lt;br /&gt;
&lt;br /&gt;
fi&lt;br /&gt;
endscript&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===注释：===&lt;br /&gt;
/var/log/nginx/*log：需要轮询日志路径&lt;br /&gt;
&lt;br /&gt;
daily：每天轮询 日志文件将按天轮循。&lt;br /&gt;
&lt;br /&gt;
weekly：日志文件将按周轮循。&lt;br /&gt;
&lt;br /&gt;
monthly：日志文件将按月轮循。&lt;br /&gt;
&lt;br /&gt;
rotate 10：保留最多10次滚动的日志 时间最久的那个日志文件将被删除。 这个参数。如果不配置默认是0个，也就是只允许存在一份日志，刚切分出来的日志会马上被删除。多么痛的领悟，说多了都是泪。&lt;br /&gt;
&lt;br /&gt;
missingok:如果日志丢失，不报错继续滚动下一个日志 在日志轮循期间，任何错误将被忽略，例如“文件无法找到”之类的错误。&lt;br /&gt;
&lt;br /&gt;
notifempty:当日志为空时不进行滚动&lt;br /&gt;
&lt;br /&gt;
compress：旧日志默认用gzip压缩 在轮循任务完成后，已轮循的归档将使用gzip进行压缩。&lt;br /&gt;
&lt;br /&gt;
/var/run/nginx.pid：nginx主进程pid&lt;br /&gt;
&lt;br /&gt;
dateext：定义日志文件后缀是日期格式,也就是切割后文件是:xxx.log-20160402.gz这样的格式。如果该参数被注释掉,切割出来是按数字递增,即前面说的 xxx.log-1这种格式。&lt;br /&gt;
&lt;br /&gt;
delaycompress：总是与compress选项一起用，delaycompress选项指示logrotate不要将最近的归档压缩，压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。&lt;br /&gt;
&lt;br /&gt;
create 640 nginx adm：以指定的权限和用书属性，创建全新的日志文件，同时logrotate也会重命名原始日志文件。&lt;br /&gt;
&lt;br /&gt;
postrotate/endscript：在所有其它指令完成后，postrotate和endscript里面指定的命令将被执行。在这种情况下，rsyslogd进程将立即再次读取其配置并继续运行。注意：这两个关键字必须单独成行。&lt;br /&gt;
&lt;br /&gt;
sharedscripts的作用是什么？&lt;br /&gt;
大家可能注意到了，我在前面Nginx的例子里声明日志文件的时候用了星号通配符，也就是说这里可能涉及多个日志文件，比如：access.log和error.log。说到这里大家或许就明白了，sharedscripts的作用是在所有的日志文件都轮转完毕后统一执行一次脚本。如果没有配置这条指令，那么每个日志文件轮转完毕后都会执行一次脚本。&lt;br /&gt;
&lt;br /&gt;
==logrotate默认执行时间==&lt;br /&gt;
logrotate切割时间默认是在每天的3:22。这个时间点可以通过crontab配置文件查看到&lt;br /&gt;
&amp;lt;pre&amp;gt;[root@ddmin]# cat /etc/anacrontab &lt;br /&gt;
# /etc/anacrontab: configuration file for anacron&lt;br /&gt;
&lt;br /&gt;
# See anacron(8) and anacrontab(5) for details.&lt;br /&gt;
&lt;br /&gt;
SHELL=/bin/sh&lt;br /&gt;
PATH=/sbin:/bin:/usr/sbin:/usr/bin&lt;br /&gt;
MAILTO=root&lt;br /&gt;
# the maximal random delay added to the base delay of the jobs&lt;br /&gt;
RANDOM_DELAY=45&lt;br /&gt;
# the jobs will be started during the following hours only&lt;br /&gt;
START_HOURS_RANGE=3-22&lt;br /&gt;
&lt;br /&gt;
#period in days   delay in minutes   job-identifier   command&lt;br /&gt;
1	5	cron.daily		nice run-parts /etc/cron.daily&lt;br /&gt;
7	25	cron.weekly		nice run-parts /etc/cron.weekly&lt;br /&gt;
@monthly 45	cron.monthly		nice run-parts /etc/cron.monthly&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==其它注意的==&lt;br /&gt;
===问题：如何告诉应用程序重新打开日志文件===&lt;br /&gt;
以Nginx为例，是通过postrotate指令发送USR1信号来通知Nginx重新打开日志文件的。但是其他的应用程序不一定遵循这样的约定，比如说MySQL是通过flush-logs来重新打开日志文件的。更有甚者，有些应用程序就压根没有提供类似的方法，此时如果想重新打开日志文件，就必须重启服务，但为了高可用性，这往往不能接受。还好Logrotate提供了一个名为copytruncate的指令，此方法采用的是先拷贝再清空的方式，整个过程中日志文件的操作句柄没有发生改变，所以不需要通知应用程序重新打开日志文件，但是需要注意的是，在拷贝和清空之间有一个时间差，所以可能会丢失部分日志数据。&lt;br /&gt;
&lt;br /&gt;
BTW：MySQL本身在support-files目录已经包含了一个名为mysql-log-rotate的脚本，不过它比较简单，更详细的日志轮转详见「Rotating MySQL Slow Logs Safely」。https://engineering.groupon.com/2013/mysql/rotating-mysql-slow-logs-safely/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===logrotate无法自动轮询日志===&lt;br /&gt;
&lt;br /&gt;
==== force参数====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
没有发现异常，系统日志等都是由这个脚本轮询的，一切运行正常，脚本应该就没问题。直接执行命令/usr/sbin/logrotate /etc/logrotate.conf系统日志是正常轮询了，但nginx日志却没反应。&lt;br /&gt;
再man logrotate看下说明发现一个选项-f (–force),大概意思是：强行启动记录文件维护操作，纵使logrotate指令认为没有需要亦然。&lt;br /&gt;
那应该有可能是logroate认为nginx日志太小，不进行轮询，但我们需要轮询，加-f选项即可。即&lt;br /&gt;
&lt;br /&gt;
为什么 是第二次才是压缩了呢 &lt;br /&gt;
/usr/sbin/logrotate -f  -v /etc/logrotate.conf&lt;br /&gt;
&lt;br /&gt;
crontab #这个其实一般不要 除非切割不了 &lt;br /&gt;
 * 4 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 加错参数dateformat  ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
导致压缩不成功 起因 本来想加个每日压缩的 哈哈&lt;br /&gt;
[root@ nginx]# cat /etc/logrotate.d/nginx&lt;br /&gt;
/data/logs/nginx/*.log {&lt;br /&gt;
        daily&lt;br /&gt;
        #dateformat -%Y-%m&lt;br /&gt;
&lt;br /&gt;
logrotate -f -v /etc/logrotate.d/nginx&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==参考==&lt;br /&gt;
linux中logrotate对日志进行切割压缩(nginx,mysql)&lt;br /&gt;
http://www.111cn.net/sys/linux/61133.htm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://blog.linuxchina.net/?p=2321 logrotate管理nginx日志文件]&lt;br /&gt;
&lt;br /&gt;
切割nginx日志&lt;br /&gt;
http://www.ilanni.com/?p=11150#1.3 查看logrotate默认执行时间&lt;br /&gt;
&lt;br /&gt;
[https://blog.csdn.net/molaifeng/article/details/82667158 Nginx 日志分割]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
使用logrotate轮询nginx和apache日志&lt;br /&gt;
https://www.centos.bz/2011/12/logrotate-nginx-log/&lt;br /&gt;
&lt;br /&gt;
logrotate无法自动轮询日志的原因&lt;br /&gt;
https://www.centos.bz/2011/12/logrotate-can-not-auto-cut-logfile/&lt;br /&gt;
&lt;br /&gt;
被遗忘的Logrotate&lt;br /&gt;
https://huoding.com/2013/04/21/246&lt;br /&gt;
&lt;br /&gt;
鸟哥logrotate&lt;br /&gt;
http://cn.linux.vbird.org/linux_basic/0570syslog_3.php&lt;br /&gt;
&lt;br /&gt;
linux下logrotate 配置和理解&lt;br /&gt;
http://blog.csdn.net/cjwid/article/details/1690101&lt;br /&gt;
&lt;br /&gt;
这个教程不错哦 &lt;br /&gt;
logrotate机制和原理&lt;br /&gt;
http://blog.lightxue.com/how-logrotate-works/&lt;br /&gt;
&lt;br /&gt;
linux下logrotate 配置和理解&lt;br /&gt;
http://blog.csdn.net/cjwid/article/details/1690101&lt;br /&gt;
 &lt;br /&gt;
使用logrotate分割tomcat日志&lt;br /&gt;
https://www.52os.net/articles/using-logrotate-manage-tomcat-logs.html&lt;br /&gt;
&lt;br /&gt;
Linux日志文件总管——logrotate&lt;br /&gt;
https://linux.cn/article-4126-1.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://iain.cx/src/logrotate/&lt;br /&gt;
[https://www.gubo.org/linux-rotate-logs-with-logrotate-utility/ Linux logrotate 命令教程日志分割]&lt;br /&gt;
[[category:ops]] [[category:nginx]]&lt;/div&gt;</summary>
		<author><name>Evan</name></author>
	</entry>
</feed>