﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-~怪^_*兽~-随笔分类-管理运营</title><link>http://www.blogjava.net/ldcsaa/category/51381.html</link><description>虚荣锁身躯 心灵给酒醉 脆弱人类 懒问何为对
&lt;br&gt;&lt;font color="#CC0000"&gt;（怪兽乐园Q群：&lt;a target="_blank" href="http://qun.qq.com/#jointhegroup/gid/75375912"&gt;&lt;strong&gt;75375912&lt;/strong&gt;&lt;/a&gt;）&lt;/font&gt;</description><language>zh-cn</language><lastBuildDate>Tue, 26 Mar 2013 16:35:09 GMT</lastBuildDate><pubDate>Tue, 26 Mar 2013 16:35:09 GMT</pubDate><ttl>60</ttl><item><title>用 Java 实现的日志切割清理工具</title><link>http://www.blogjava.net/ldcsaa/archive/2012/04/12/373927.html</link><dc:creator>~怪^_*兽~ </dc:creator><author>~怪^_*兽~ </author><pubDate>Thu, 12 Apr 2012 02:56:00 GMT</pubDate><guid>http://www.blogjava.net/ldcsaa/archive/2012/04/12/373927.html</guid><wfw:comment>http://www.blogjava.net/ldcsaa/comments/373927.html</wfw:comment><comments>http://www.blogjava.net/ldcsaa/archive/2012/04/12/373927.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/ldcsaa/comments/commentRss/373927.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldcsaa/services/trackbacks/373927.html</trackback:ping><description><![CDATA[<p>　　对于服务器的日常维护来说，日志清理是非常重要的事情，如果残留日志过多则严重浪费磁盘空间同时影响服务的性能。如果用手工方式进行清理，会花费太多时间，并且很多时候难以满足实际要求。例如：如何在每个星期六凌晨3点把超过2G大的日志文件进行切割，保留最新的100M日志记录？</p>
<p>　　网上没有发觉能满足本座要求的日志切割工具，因此花了一些闲暇时间自己写了一个。由于要在多个平台上使用，为了方便采用 Java 实现。本工具命名为 <strong>LogCutter</strong>，主要有以下特点：</p>
<ol><li><strong>支持 Linux、Mac 和 Windows 等所有常见操作系统平台</strong></li><li><strong>支持命令行交互式运行</strong></li><li><strong>支持后台非交互式运行（Linux/MAC 下使用 daemon 进程实现，Windows 用系统 Service 实现）</strong></li><li><strong>支持两种日志清理方式（删除日志文件或切割日志文件）</strong></li><li><strong>支持对 GB18030、UTF-8、UTF-16LE、UTF-16BE 等常用日志文件类型进行切割（不会发生切掉半个字符的情况）</strong></li><li><strong>高度可配置（程序执行周期、要删除的日志文件过期时间、要切割的日志文件阀值和保留大小等均可配置</strong> </li></ol>
<ul><li><strong>使用方法：</strong> </li></ul>
<div class="cnblogs_code"><pre>*******************************************************<br />**** LogCutter - Bruce Liang, all rights reserved. ****<br />*******************************************************<br /><br />一、启动方式<br />--------------------------------------------------<br />1) Windows<br />    A) 前台运行: &gt; ./<span style="color: #0000ff">run</span>.bat<br />    B) 后台运行: &gt; ./LogCutter.exe {    <br />                                       -install-demand  (安装手动启动服务)<br />                                       -install-auto    (安装自动启动服务)<br />                                       -<span style="color: #0000ff">start</span>           (启动服务)<br />                                       -stop            (停止服务)<br />                                       -status          (查看服务状态)<br />                                   }<br /><br />    *** 注 *** <br />        @ LogCutter.exe 以 Windows 系统服务的方式运行，安装好后也可以通过 Windows 服务管理器进行管理<br />        @ LogCutter.exe 依赖 JRE 1.6, 因此必须在注册表或环境变量中设置 %JAVA_HOME%<br /><br />2) Linux / Unix<br />    A) 前台运行: $ ./<span style="color: #0000ff">run</span>.sh<br />    B) 后台运行: $ ./<span style="color: #0000ff">run</span>.sh -d<br /><br />    *** 注 ***<br />        @ 可以设置为开机时自动后台运行，方法如下:<br /><br />        $ vi /etc/rc.d/rc.local<br />                    ( 加入: ${YOUR_LOGCUTTER_PATH}/<span style="color: #0000ff">run</span>.sh -d )<br />--------------------------------------------------<br /><br />二、配置文件<br />--------------------------------------------------<br />1) 程序配置文件: ./conf/config.xml<br />2) 日志配置文件: ./conf/log4j.properties (默认)<br />--------------------------------------------------<br /><br />三、环境要求<br />--------------------------------------------------<br />1) Java 版 本: JRE 1.6 以上<br />2) 依赖程序包: dom4j、log4j、juniversalchardet<br />--------------------------------------------------</pre></div>
<p>&nbsp;</p>
<ul><li>run.sh (Mac 平台) </li></ul>
<div class="cnblogs_code"><pre>#!/bin/bash<br /><br />JAVA_HOME="<strong>/Library/Java/Home</strong>"<br />CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar<br />JAVA_BIN=$JAVA_HOME/bin<br />JAVA=$JAVA_BIN/java<br /><br />APP_PATH="<strong>/Users/Kingfisher/MyWork/Java/LogCutter</strong>"<br />APP_CLASSPATH=$APP_PATH/classes<br />APP_LIBPATH=$APP_PATH/lib<br />APP_LIBS=$APP_LIBPATH/dom4j-1.6.1.jar:$APP_LIBPATH/log4j-1.2.16.jar:$APP_LIBPATH/juniversalchardet-1.0.3.jar<br />APP_CONFPATH=$APP_PATH/conf<br />APP_CONFFILE=$APP_CONFPATH/config.xml<br />APP_MAIN_CLASS=com.bruce.main.LogCutter<br /><br />DAEMON='-d'<br /><span style="color: #0000ff">CMD</span>="$JAVA -cp $CLASSPATH:$APP_CLASSPATH:$APP_LIBS $APP_MAIN_CLASS -f $APP_CONFFILE"<br /><br /><span style="color: #0000ff">if</span> [ $# -eq 0 ]<br /><span style="color: #0000ff">then</span><br />    $<span style="color: #0000ff">CMD</span><br />elif [ "$#" -eq 1 -a "$1" = "$DAEMON" ]<br /><span style="color: #0000ff">then</span><br />    $<span style="color: #0000ff">CMD</span> &amp;<br /><span style="color: #0000ff">else</span><br />    <span style="color: #0000ff">echo</span> "Usage: $0 [ $DAEMON ]"<br />    <span style="color: #0000ff">exit</span> 1<br />fi</pre></div>
<p>&nbsp;</p>
<ul><li><strong>交互式运行操作演示：</strong> </li></ul>
<div class="cnblogs_code"><pre>[Kingfisher@Bruce-mbp LogCutter] $ <strong>pwd</strong><br />/Users/Kingfisher/MyWork/Java/LogCutter<br />[Kingfisher@Bruce-mbp LogCutter] $ <strong>./<span style="color: #0000ff">run</span>.sh</strong> <br /><span style="color: #0000ff">command</span> line usage <br />------------------------------------------------------------<br />    HELP : Show help<br />    JOBS : Show jobs status<br />     CFG : Show configuration summary<br />     <span style="color: #0000ff">RUN</span> : Schedule jobs manually<br />      !Q : Shutdown application<br />       ? : About me<br />------------------------------------------------------------<br />&gt; <strong>help</strong><br /><span style="color: #0000ff">command</span> line usage <br />------------------------------------------------------------<br />    HELP : Show help<br />    JOBS : Show jobs status<br />     CFG : Show configuration summary<br />     <span style="color: #0000ff">RUN</span> : Schedule jobs manually<br />      !Q : Shutdown application<br />       ? : About me<br />------------------------------------------------------------<br />&gt; <strong>jobs</strong><br />jobs summary (total: 2, active: 0) <br />------------------------------------------------------------<br />    1. DelFileRunner@334936591                    [  Idle  ]<br />    2. CutFileRunner@724646150                    [  Idle  ]<br />------------------------------------------------------------<br />&gt; <strong>cfg</strong><br />configuration summary <br />------------------------------------------------------------<br />[global]<br />    <span style="color: #0000ff">start</span>-check-delay : 1 hours<br />       check-interval : 24 hours<br />    log4j-config-file : /Users/Kingfisher/MyWork/Java/LogCutter/classes/../conf/log4j.properties<br />            lock-file : /Users/Kingfisher/MyWork/Java/LogCutter/classes/../LogCutter.lock<br />[delete-<span style="color: #0000ff">files</span>] (expire: 30 days)<br />    1. /opt/LogCutter/logs/LogCutter.log*<br />    2. /opt/tomcat6-logs/*.log<br />    3. /opt/tomcat7-logs/*.log<br />[cut-<span style="color: #0000ff">files</span>] (threshold: 30960 KBs, reserve: 1024 KBs)<br />    1. /opt/apache-logs/*_log<br />    2. /opt/nginx-logs/*.log<br />    3. /opt/tomcat6-logs/catalina.out<br />    4. /opt/tomcat7-logs/catalina.out<br />    5. /var/lib/mysql/*.err<br />------------------------------------------------------------<br />&gt; <strong><span style="color: #0000ff">run</span></strong><br />manual jobs are scheduled !<br />&gt; <strong>?</strong><br />LogCutter 1.0.2 - Bruce Liang, all rights reserved. <br />------------------------------------------------------------<br />    Description : schedule to DELETE and CUT text log <span style="color: #0000ff">files</span> automatically or manually.<br />        Support : GB18030, UTF-8, UTF-16LE and UTF-16BE text file types.<br />          Usage : java com.bruce.main.LogCutter [ -f &lt;config-file&gt; ]<br />                  (default config file is '/Users/Kingfisher/MyWork/Java/LogCutter/classes/../conf/config.xml')<br />------------------------------------------------------------<br />&gt; <strong>!q</strong><br />be about to shutdown, please wait ...<br />shutdown perfectly !</pre></div>
<p>&nbsp;</p>
<ul><li><strong>后台运行演示（Mac 平台）：</strong> </li></ul>
<div class="cnblogs_code"><pre>[Kingfisher@Bruce-mbp LogCutter] $ <strong>./<span style="color: #0000ff">run</span>.sh -d</strong><br />[Kingfisher@Bruce-mbp LogCutter] $ <br />LogCutter is running in background, <span style="color: #0000ff">use</span> 'kill 4544' to stop me.<br /><br />[Kingfisher@Bruce-mbp LogCutter] $ <strong>kill 4544</strong><br />[Kingfisher@Bruce-mbp LogCutter] $ <br />!! LogCutter received terminate signal !!<br />be about to shutdown, please wait ...<br />shutdown perfectly !<br /><br />[Kingfisher@Bruce-mbp LogCutter] $ </pre></div>
<p>&nbsp;</p>
<ul><li><strong>程序运行日志</strong> </li></ul>
<div class="cnblogs_code"><pre><span style="color: #333333">05:52:20,705  INFO [main]: -&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;-&gt;</span><br /><span style="color: #333333">05:52:20,706  INFO [main]: starting: class com.bruce.main.LogCutter ...</span><br /><span style="color: #333333">05:52:20,707  INFO [main]: configuration summary </span><br /><span style="color: #333333">------------------------------------------------------------</span><br /><span style="color: #333333">[global]</span><br /><span style="color: #333333">    start-check-delay : 1 hours</span><br /><span style="color: #333333">       check-interval : 24 hours</span><br /><span style="color: #333333">    log4j-config-file : /Users/Kingfisher/MyWork/Java/LogCutter/classes/../conf/log4j.properties</span><br /><span style="color: #333333">            lock-file : /Users/Kingfisher/MyWork/Java/LogCutter/classes/../LogCutter.lock</span><br /><span style="color: #333333">[delete-files] (expire: 30 days)</span><br /><span style="color: #333333">    1. /opt/LogCutter/logs/LogCutter.log*</span><br /><span style="color: #333333">    2. /opt/tomcat6-logs/*.log<br />    3. /opt/tomcat7-logs/*.log<br />[cut-files] (threshold: 30960 KBs, reserve: 1024 KBs)<br />    1. /opt/apache-logs/*_log<br />    2. /opt/nginx-logs/*.log<br />    3. /opt/tomcat6-logs/catalina.out<br />    4. /opt/tomcat7-logs/catalina.out<br />    5. /var/lib/mysql/*.err<br />------------------------------------------------------------<br />05:52:39,062  INFO [pool-1-thread-2]: - - - - - - - -&gt; start CutFileRunner@724646150 &lt;- - - - - - - -<br />05:52:39,062  INFO [pool-1-thread-1]: - - - - - - - -&gt; start DelFileRunner@334936591 &lt;- - - - - - - -<br />05:52:39,063  INFO [pool-1-thread-2]: - - - - - - - -&gt; end   CutFileRunner@724646150 &lt;- - - - - - - -<br />05:52:39,063  INFO [pool-1-thread-1]: - - - - - - - -&gt; end   DelFileRunner@334936591 &lt;- - - - - - - -<br />05:52:54,222  INFO [main]: stoping: class com.bruce.main.LogCutter ...<br />05:52:54,222  INFO [main]: &lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-&lt;-</span></pre></div>
<p style="text-align: left">&nbsp;</p>
<ul><li style="text-align: left"><strong>程序配置文件（./conf/config.xml）</strong> </li></ul>
<div class="cnblogs_code"><pre><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml version="1.0" encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><br /><span style="color: #0000ff">&lt;</span><span style="color: #800000">CONFIG</span><span style="color: #0000ff">&gt;</span><br />    <span style="color: #0000ff">&lt;</span><span style="color: #800000">global</span><span style="color: #0000ff">&gt;</span><br />        <span style="color: #008000">&lt;!--</span><span style="color: #008000"> 开始日志检查延时 (小时), 默认: 0 (立刻开始) </span><span style="color: #008000">--&gt;</span><br />        <span style="color: #0000ff">&lt;</span><span style="color: #800000">start-check-delay</span><span style="color: #0000ff">&gt;</span>1<span style="color: #0000ff">&lt;/</span><span style="color: #800000">start-check-delay</span><span style="color: #0000ff">&gt;</span><br />        <span style="color: #008000">&lt;!--</span><span style="color: #008000"> 日志检查间隔 (小时), 默认: 72 </span><span style="color: #008000">--&gt;</span><br />        <span style="color: #0000ff">&lt;</span><span style="color: #800000">check-interval</span><span style="color: #0000ff">&gt;</span>24<span style="color: #0000ff">&lt;/</span><span style="color: #800000">check-interval</span><span style="color: #0000ff">&gt;</span><br />        <span style="color: #008000">&lt;!--</span><span style="color: #008000"> Log4J 配置文件, 默认: ${CLASS_ROOT}/../conf/log4j.properties </span><span style="color: #008000">--&gt;</span><br />        <span style="color: #0000ff">&lt;</span><span style="color: #800000">log4j-config-file</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">log4j-config-file</span><span style="color: #0000ff">&gt;</span><br />        <span style="color: #008000">&lt;!--</span><span style="color: #008000"> 程序锁, 默认: ${CLASS_ROOT}/../${APP_NAME}.lock </span><span style="color: #008000">--&gt;</span><br />        <span style="color: #0000ff">&lt;</span><span style="color: #800000">lock-file</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">lock-file</span><span style="color: #0000ff">&gt;</span><br />    <span style="color: #0000ff">&lt;/</span><span style="color: #800000">global</span><span style="color: #0000ff">&gt;</span><br />    <span style="color: #008000">&lt;!--</span><span style="color: #008000"> 要删除的日志文件列表 </span><span style="color: #008000">--&gt;</span><br />    <span style="color: #008000">&lt;!--</span><span style="color: #008000"> delete-files.expire: 日志文件过期时间(天), 默认: 90 </span><span style="color: #008000">--&gt;</span><br />    <span style="color: #0000ff">&lt;</span><span style="color: #800000">delete-files </span><span style="color: #ff0000">expire</span><span style="color: #0000ff">="30"</span><span style="color: #0000ff">&gt;</span><br />        <span style="color: #008000">&lt;!--</span><span style="color: #008000"> files: 文件名称(不包含目录), 必须填写, 可包含通配符 </span><span style="color: #008000">--&gt;</span><br />        <span style="color: #008000">&lt;!--</span><span style="color: #008000"> files.path: 文件所在目录, 必须填写, 不能包含通配符 </span><span style="color: #008000">--&gt;</span><br />        <span style="color: #0000ff">&lt;</span><span style="color: #800000">file </span><span style="color: #ff0000">path</span><span style="color: #0000ff">="/opt/LogCutter/logs"</span><span style="color: #0000ff">&gt;</span>LogCutter.log*<span style="color: #0000ff">&lt;/</span><span style="color: #800000">file</span><span style="color: #0000ff">&gt;</span><br />        <span style="color: #0000ff">&lt;</span><span style="color: #800000">file </span><span style="color: #ff0000">path</span><span style="color: #0000ff">="/opt/tomcat6-logs"</span><span style="color: #0000ff">&gt;</span>*.log<span style="color: #0000ff">&lt;/</span><span style="color: #800000">file</span><span style="color: #0000ff">&gt;</span><br />        <span style="color: #0000ff">&lt;</span><span style="color: #800000">file </span><span style="color: #ff0000">path</span><span style="color: #0000ff">="/opt/tomcat7-logs"</span><span style="color: #0000ff">&gt;</span>*.log<span style="color: #0000ff">&lt;/</span><span style="color: #800000">file</span><span style="color: #0000ff">&gt;</span><br />        <span style="color: #008000">&lt;!--</span><span style="color: #008000"><br />        &lt;file path="/var/lib/mysql"&gt;mysql-bin.*&lt;/file&gt;<br />        &lt;file path="/var/lib/mysql"&gt;efly-test-relay-bin.*&lt;/file&gt;<br />        </span><span style="color: #008000">--&gt;</span><br />    <span style="color: #0000ff">&lt;/</span><span style="color: #800000">delete-files</span><span style="color: #0000ff">&gt;</span><br />    <span style="color: #008000">&lt;!--</span><span style="color: #008000"> 要截断的日志文件列表 </span><span style="color: #008000">--&gt;</span><br />    <span style="color: #008000">&lt;!--</span><span style="color: #008000"> cut-files.threshold: 日志文件截断阀值(KB), 默认: 10240 </span><span style="color: #008000">--&gt;</span><br />    <span style="color: #008000">&lt;!--</span><span style="color: #008000"> cut-files.reserve: 日志文件保留内容(KB), 默认: 1024 </span><span style="color: #008000">--&gt;</span><br />    <span style="color: #008000">&lt;!--</span><span style="color: #008000"><br />         &lt;!注!&gt; 'cut-files.reserve' 是保留内容的近似值得, 实际内容按行取整保留<br />            如下列日志文件内容:<br />                ...... ...... ......<br />                 line1: xxxxxxxxxxxxxxxxxxxxx<br />                 line2: xxxxxxxxxx<strong>P</strong>yyyyyyyyyy<br />                 line3: zzzzzzzzzzzzzzzzzzzzz<br />                 line4: zzzzzzzzzzzzzzzzzzzzz<br />                 ...... ...... ...... (EOF)<br />             '<strong>P</strong>'为定位得到的保留起点, 程序实际会在'P'点开始查找下一个换行符,<br />             从该换行符的后一个字符开始保留, 也就是从第三行开始保留到文件末尾<br />    </span><span style="color: #008000">--&gt;</span><br />    <span style="color: #0000ff">&lt;</span><span style="color: #800000">cut-files </span><span style="color: #ff0000">threshold</span><span style="color: #0000ff">="30960"</span><span style="color: #ff0000"> reserve</span><span style="color: #0000ff">="1024"</span><span style="color: #0000ff">&gt;</span><br />                <span style="color: #0000ff">&lt;</span><span style="color: #800000">file </span><span style="color: #ff0000">path</span><span style="color: #0000ff">="/opt/apache-logs"</span><span style="color: #0000ff">&gt;</span>*_log<span style="color: #0000ff">&lt;/</span><span style="color: #800000">file</span><span style="color: #0000ff">&gt;</span><br />                <span style="color: #0000ff">&lt;</span><span style="color: #800000">file </span><span style="color: #ff0000">path</span><span style="color: #0000ff">="/opt/nginx-logs"</span><span style="color: #0000ff">&gt;</span>*.log<span style="color: #0000ff">&lt;/</span><span style="color: #800000">file</span><span style="color: #0000ff">&gt;</span><br />                <span style="color: #0000ff">&lt;</span><span style="color: #800000">file </span><span style="color: #ff0000">path</span><span style="color: #0000ff">="/opt/tomcat6-logs"</span><span style="color: #0000ff">&gt;</span>catalina.out<span style="color: #0000ff">&lt;/</span><span style="color: #800000">file</span><span style="color: #0000ff">&gt;</span><br />                <span style="color: #0000ff">&lt;</span><span style="color: #800000">file </span><span style="color: #ff0000">path</span><span style="color: #0000ff">="/opt/tomcat7-logs"</span><span style="color: #0000ff">&gt;</span>catalina.out<span style="color: #0000ff">&lt;/</span><span style="color: #800000">file</span><span style="color: #0000ff">&gt;</span><br />                <span style="color: #0000ff">&lt;</span><span style="color: #800000">file </span><span style="color: #ff0000">path</span><span style="color: #0000ff">="/var/lib/mysql"</span><span style="color: #0000ff">&gt;</span>*.err<span style="color: #0000ff">&lt;/</span><span style="color: #800000">file</span><span style="color: #0000ff">&gt;</span><br />    <span style="color: #0000ff">&lt;/</span><span style="color: #800000">cut-files</span><span style="color: #0000ff">&gt;</span><br /><span style="color: #0000ff">&lt;/</span><span style="color: #800000">CONFIG</span><span style="color: #0000ff">&gt;</span></pre></div>
<p style="text-align: left"><br />&nbsp;&nbsp;&nbsp;&nbsp;<a title="LogCutter" href="http://files.cnblogs.com/ldcsaa/LogCutter.zip" target="_blank"><strong>下载试用</strong></a></p><img src ="http://www.blogjava.net/ldcsaa/aggbug/373927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldcsaa/" target="_blank">~怪^_*兽~ </a> 2012-04-12 10:56 <a href="http://www.blogjava.net/ldcsaa/archive/2012/04/12/373927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>