Linux使用logrotate来切割日志文件
<p>程序在运行的时候为了了解运行状态,会输出日志文件,时间久了日志文件会变得非常大,甚至达到GB级别。我在golang应用里使用logrus包来打日志,配置和使用都很方便,就是没有日志分割的功能,应用在线上运行一个月后日志文件都已经达到上百兆。后来发现了logrotate,这是centos自带的日志分割工具,都不用安装额外组件就能实现定时分割日志。</p><p><strong>1.运行原理</strong></p>
<p>logrotate由系统的cron运行,位置在/etc/cron.daily/logrotate</p>
<div class="jb51code">
<div><div id="highlighter_626036" class="syntaxhighlighterbash">
<div class="toolbar"><span>?</span></div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
</td>
<td class="code"><div class="container">
<div class="line number1 index0 alt2"><code class="bash comments">#!/bin/sh</code></div>
<div class="line number2 index1 alt1">
<code class="bash plain">/usr/sbin/logrotate</code> <code class="bash plain">-s </code><code class="bash plain">/var/lib/logrotate/logrotate</code><code class="bash plain">.status </code><code class="bash plain">/etc/logrotate</code><code class="bash plain">.conf</code>
</div>
<div class="line number3 index2 alt2"><code class="bash plain">EXITVALUE=$?</code></div>
<div class="line number4 index3 alt1">
<code class="bash keyword">if</code> <code class="bash plain">[ $EXITVALUE != 0 ]; </code><code class="bash keyword">then</code>
</div>
<div class="line number5 index4 alt2">
<code class="bash spaces"> </code><code class="bash plain">/usr/bin/logger</code> <code class="bash plain">-t logrotate </code><code class="bash string">"ALERT exited abnormally with [$EXITVALUE]"</code>
</div>
<div class="line number6 index5 alt1"><code class="bash keyword">fi</code></div>
<div class="line number7 index6 alt2">
<code class="bash functions">exit</code> <code class="bash plain">0</code>
</div>
</div></td>
</tr></tbody></table>
</div></div>
<div class="codetool" id="codetool"><div class="code_n"><textarea></textarea></div></div>
</div>
<p>可以看到入口配置文件是/etc/logrotate.conf,依次运行/etc/logrotate.conf.d里的配置文件 如果发现配置的logrotate没有执行,可以看下系统的crond服务有没有开启</p>
<p><strong>2.配置</strong></p>
<p>如果有安装nginx,可以参考nginx里的配置例子</p>
<div class="jb51code">
<div><div id="highlighter_35294" class="syntaxhighlighterbash">
<div class="toolbar"><span>?</span></div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
</td>
<td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">/var/log/nginx/</code><code class="bash plain">*log {</code>
</div>
<div class="line number2 index1 alt1">
<code class="bash spaces"> </code><code class="bash plain">create 0644 nginx nginx</code>
</div>
<div class="line number3 index2 alt2">
<code class="bash spaces"> </code><code class="bash plain">daily</code>
</div>
<div class="line number4 index3 alt1">
<code class="bash spaces"> </code><code class="bash plain">rotate 10</code>
</div>
<div class="line number5 index4 alt2">
<code class="bash spaces"> </code><code class="bash plain">missingok</code>
</div>
<div class="line number6 index5 alt1">
<code class="bash spaces"> </code><code class="bash plain">notifempty</code>
</div>
<div class="line number7 index6 alt2">
<code class="bash spaces"> </code><code class="bash plain">compress</code>
</div>
<div class="line number8 index7 alt1">
<code class="bash spaces"> </code><code class="bash plain">sharedscripts</code>
</div>
<div class="line number9 index8 alt2">
<code class="bash spaces"> </code><code class="bash plain">postrotate</code>
</div>
<div class="line number10 index9 alt1">
<code class="bash spaces"> </code><code class="bash plain">/bin/kill</code> <code class="bash plain">-USR1 `</code><code class="bash functions">cat</code> <code class="bash plain">/run/nginx</code><code class="bash plain">.pid 2></code><code class="bash plain">/dev/null</code><code class="bash plain">` 2></code><code class="bash plain">/dev/null</code> <code class="bash plain">|| </code><code class="bash functions">true</code>
</div>
<div class="line number11 index10 alt2">
<code class="bash spaces"> </code><code class="bash plain">endscript</code>
</div>
<div class="line number12 index11 alt1"><code class="bash plain">}</code></div>
</div></td>
</tr></tbody></table>
</div></div>
<div class="codetool" id="codetool"><div class="code_n"><textarea></textarea></div></div>
</div>
<p>第一行定义的是日志文件的路径,可以用*通配,一般可以定义成*.log来匹配所有日志文件。也可以指定多个文件,用空格隔开,比如</p>
<div class="jb51code">
<div><div id="highlighter_694001" class="syntaxhighlighterbash">
<div class="toolbar"><span>?</span></div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
</td>
<td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">/var/log/nginx/access</code><code class="bash plain">.log </code><code class="bash plain">/var/log/nginx/error</code><code class="bash plain">.log {</code>
</div>
<div class="line number2 index1 alt1">
<code class="bash spaces"> </code> </div>
<div class="line number3 index2 alt2"><code class="bash plain">}</code></div>
</div></td>
</tr></tbody></table>
</div></div>
<div class="codetool" id="codetool"><div class="code_n"><textarea></textarea></div></div>
</div>
<p>花括号里面是日志切割相关的参数,下面是常用的切割参数</p>
<ol>
<li>compress 是否开启压缩,压缩格式gzip</li>
<li>不开启压缩</li>
<li>compresscmd 自定义压缩命令</li>
<li>compressexty 压缩文件名后缀</li>
<li>compressoptions 压缩选项</li>
<li>copy 复制一份文件</li>
<li>create 后面跟mode owner group,设置新日志文件的权限</li>
<li>daily 按天分割</li>
<li>weekly 按周分割</li>
<li>monthly 按月分割</li>
<li>rotate 后面跟数字,表示需要保留的文件历史记录,超过数量就会删除,或者通过邮件发送</li>
<li>size 后面跟文件大小,比如100k、100M,超过这个大小后分割</li>
<li>missingok 忽略不存在的文件,不报错</li>
<li>notifempty 不分割空文件</li>
<li>sharedscripts 配合postrotate、prerotate,让他们只执行一次</li>
<li>postrotate/endscript 文件分割完后,执行postrotate、endscript之间的命令</li>
<li>prerotate/endscript 文件分割完前,执行prerotate、endscript之间的命令<br>
</li>
</ol>
<p>下面看几个例子</p>
<div class="jb51code">
<div><div id="highlighter_549726" class="syntaxhighlighterbash">
<div class="toolbar"><span>?</span></div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
</td>
<td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">/var/log/httpd/error</code><code class="bash plain">.log {</code>
</div>
<div class="line number2 index1 alt1">
<code class="bash spaces"> </code><code class="bash plain">rotate 5</code>
</div>
<div class="line number3 index2 alt2">
<code class="bash spaces"> </code><code class="bash plain">mail i@wuyuans.com</code>
</div>
<div class="line number4 index3 alt1">
<code class="bash spaces"> </code><code class="bash plain">size=100k</code>
</div>
<div class="line number5 index4 alt2">
<code class="bash spaces"> </code><code class="bash plain">sharedscripts</code>
</div>
<div class="line number6 index5 alt1">
<code class="bash spaces"> </code><code class="bash plain">postrotate</code>
</div>
<div class="line number7 index6 alt2">
<code class="bash spaces"> </code><code class="bash plain">/sbin/killall</code> <code class="bash plain">-HUP httpd</code>
</div>
<div class="line number8 index7 alt1">
<code class="bash spaces"> </code><code class="bash plain">endscript</code>
</div>
<div class="line number9 index8 alt2"><code class="bash plain">}</code></div>
</div></td>
</tr></tbody></table>
</div></div>
<div class="codetool" id="codetool"><div class="code_n"><textarea></textarea></div></div>
</div>
<p>切割/var/log/httpd/error.log日志文件,超过100k后切割,保留最新的5个历史记录,超过5个的邮件发送到fss@qq.com,postrotate里的的命令是为了让httpd重新打开日志文件。</p>
<div class="jb51code">
<div><div id="highlighter_552145" class="syntaxhighlighterbash">
<div class="toolbar"><span>?</span></div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
</td>
<td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">/var/lib/mysql/mysqld</code><code class="bash plain">.log {</code>
</div>
<div class="line number2 index1 alt1">
<code class="bash spaces"> </code><code class="bash comments"># create 600 mysql mysql</code>
</div>
<div class="line number3 index2 alt2">
<code class="bash spaces"> </code><code class="bash plain">notifempty</code>
</div>
<div class="line number4 index3 alt1">
<code class="bash spaces"> </code><code class="bash plain">daily</code>
</div>
<div class="line number5 index4 alt2">
<code class="bash spaces"> </code><code class="bash plain">rotate 3</code>
</div>
<div class="line number6 index5 alt1">
<code class="bash spaces"> </code><code class="bash plain">missingok</code>
</div>
<div class="line number7 index6 alt2">
<code class="bash spaces"> </code><code class="bash plain">compress</code>
</div>
<div class="line number8 index7 alt1">
<code class="bash spaces"> </code><code class="bash plain">postrotate</code>
</div>
<div class="line number9 index8 alt2">
<code class="bash spaces"> </code><code class="bash comments"># just if mysqld is really running</code>
</div>
<div class="line number10 index9 alt1">
<code class="bash spaces"> </code><code class="bash keyword">if</code> <code class="bash functions">test</code> <code class="bash plain">-x </code><code class="bash plain">/usr/bin/mysqladmin</code> <code class="bash plain">&& \</code>
</div>
<div class="line number11 index10 alt2">
<code class="bash spaces"> </code><code class="bash plain">/usr/bin/mysqladmin</code> <code class="bash functions">ping</code> <code class="bash plain">&></code><code class="bash plain">/dev/null</code>
</div>
<div class="line number12 index11 alt1">
<code class="bash spaces"> </code><code class="bash keyword">then</code>
</div>
<div class="line number13 index12 alt2">
<code class="bash spaces"> </code><code class="bash plain">/usr/bin/mysqladmin</code> <code class="bash plain">--</code><code class="bash functions">local</code> <code class="bash plain">flush-error-log \</code>
</div>
<div class="line number14 index13 alt1">
<code class="bash spaces"> </code><code class="bash plain">flush-engine-log flush-general-log flush-slow-log</code>
</div>
<div class="line number15 index14 alt2">
<code class="bash spaces"> </code><code class="bash keyword">fi</code>
</div>
<div class="line number16 index15 alt1">
<code class="bash spaces"> </code><code class="bash plain">endscript</code>
</div>
<div class="line number17 index16 alt2"><code class="bash plain">}</code></div>
</div></td>
</tr></tbody></table>
</div></div>
<div class="codetool" id="codetool"><div class="code_n"><textarea></textarea></div></div>
</div>
<p>这是对mysql日志的切割,每天一份,忽略空文件,保留最新3份,使用gzip压缩</p>
<div class="jb51code">
<div><div id="highlighter_334165" class="syntaxhighlighterbash">
<div class="toolbar"><span>?</span></div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
</td>
<td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">/home/wuyuan/log/</code><code class="bash plain">*.log {</code>
</div>
<div class="line number2 index1 alt1">
<code class="bash spaces"> </code><code class="bash functions">su</code> <code class="bash plain">wuyuan wuyuan</code>
</div>
<div class="line number3 index2 alt2">
<code class="bash spaces"> </code><code class="bash plain">create 0777 wuyuan wuyuan</code>
</div>
<div class="line number4 index3 alt1">
<code class="bash spaces"> </code><code class="bash plain">daily</code>
</div>
<div class="line number5 index4 alt2">
<code class="bash spaces"> </code><code class="bash plain">rotate 10</code>
</div>
<div class="line number6 index5 alt1">
<code class="bash spaces"> </code><code class="bash plain">olddir </code><code class="bash plain">/home/wuyuan/log/old</code>
</div>
<div class="line number7 index6 alt2">
<code class="bash spaces"> </code><code class="bash plain">missingok</code>
</div>
<div class="line number8 index7 alt1">
<code class="bash spaces"> </code><code class="bash plain">postrotate</code>
</div>
<div class="line number9 index8 alt2">
<code class="bash spaces"> </code><code class="bash plain">endscript</code>
</div>
<div class="line number10 index9 alt1">
<code class="bash spaces"> </code><code class="bash plain">nocompress</code>
</div>
<div class="line number11 index10 alt2"><code class="bash plain">}</code></div>
</div></td>
</tr></tbody></table>
</div></div>
<div class="codetool" id="codetool"><div class="code_n"><textarea></textarea></div></div>
</div>
<p>这是我在用的配置项,对log目录所有.log文件切割,每天一份,保留10份,新文件设定权限777,历史文件保留在old目录里,这样可以方便查看。因为应用程序用的logrus使用append的方式写日志,所以不需要重新打开日志文件,这点logrus做得很不错。</p>
<p><strong>3.测试</strong></p>
<p>写完配置文件后可以手动执行下,来验证是否可用。</p>
<div class="jb51code">
<div><div id="highlighter_164761" class="syntaxhighlighterbash">
<div class="toolbar"><span>?</span></div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter"><div class="line number1 index0 alt2">1</div></td>
<td class="code"><div class="container"><div class="line number1 index0 alt2">
<code class="bash plain">logrotate -f </code><code class="bash plain">/etc/logrotate</code><code class="bash plain">.d</code><code class="bash plain">/wuyuan</code>
</div></div></td>
</tr></tbody></table>
</div></div>
<div class="codetool" id="codetool"><div class="code_n"><textarea></textarea></div></div>
</div>
<p>其中-f 表示强制执行,其他命令可以用help来查看</p>
<div class="jb51code">
<div><div id="highlighter_974651" class="syntaxhighlighterplain">
<div class="toolbar"><span>?</span></div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
</td>
<td class="code"><div class="container">
<div class="line number1 index0 alt2"><code class="plain plain">logrotate --help</code></div>
<div class="line number2 index1 alt1"><code class="plain plain">用法: logrotate <configfile></code></div>
<div class="line number3 index2 alt2">
<code class="plain spaces"> </code><code class="plain plain">-d, --debug Don't do anything, just test (implies -v)</code>
</div>
<div class="line number4 index3 alt1">
<code class="plain spaces"> </code><code class="plain plain">-f, --force Force file rotation</code>
</div>
<div class="line number5 index4 alt2">
<code class="plain spaces"> </code><code class="plain plain">-m, --mail=command Command to send mail (instead of `/bin/mail')</code>
</div>
<div class="line number6 index5 alt1">
<code class="plain spaces"> </code><code class="plain plain">-s, --state=statefile Path of state file</code>
</div>
<div class="line number7 index6 alt2">
<code class="plain spaces"> </code><code class="plain plain">-v, --verbose Display messages during rotation</code>
</div>
<div class="line number8 index7 alt1">
<code class="plain spaces"> </code><code class="plain plain">-l, --log=STRING Log file</code>
</div>
<div class="line number9 index8 alt2">
<code class="plain spaces"> </code><code class="plain plain">--version Display version information</code>
</div>
<div class="line number10 index9 alt1"><code class="plain plain">Help options:</code></div>
<div class="line number11 index10 alt2">
<code class="plain spaces"> </code><code class="plain plain">-?, --help Show this help message</code>
</div>
<div class="line number12 index11 alt1">
<code class="plain spaces"> </code><code class="plain plain">--usage Display brief usage message</code>
</div>
</div></td>
</tr></tbody></table>
</div></div>
<div class="codetool" id="codetool"><div class="code_n"><textarea></textarea></div></div>
</div>
<p>没问题的话日志就会被移到old目录下,并带上日期,之前的log文件会被清空<br></p>
<p>以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。</p>
頁:
[1]