📄 1200.html
字号:
<input type=radio value=content name=type>内容
<input type=image src="images/button_go.gif" tppabs="http://www.linuxhero.com/docs/images/button_go.gif" border=0 name=image2>
</font></div>
</td>
</tr>
<tr>
<td noWrap>
<div align="center">
<input maxlength=100 size=30 name=keyword2>
</div>
</td>
</tr></tbody>
</table>
</form>
</TD>
<TD rowSpan=2><IMG src="images/header_r1_c7.gif" tppabs="http://www.linuxhero.com/docs/images/header_r1_c7.gif" width=26 border=0 name=header_r1_c7></TD>
<TD><IMG height=83 src="images/spacer.gif" tppabs="http://www.linuxhero.com/docs/images/spacer.gif" width=1 border=0></TD></TR>
<TR>
<TD background="images/bgline.gif" tppabs="http://www.linuxhero.com/docs/images/bgline.gif"><IMG height=22
src="images/header_r2_c1.gif" tppabs="http://www.linuxhero.com/docs/images/header_r2_c1.gif" width=296 border=0
name=header_r2_c1></TD>
<TD background="images/bgline.gif" tppabs="http://www.linuxhero.com/docs/images/bgline.gif" colSpan=5>
<DIV align=right><FONT class=normalfont>当前位置:
<A href="index.html" tppabs="http://www.linuxhero.com/docs/index.html">本站首页</A>
<font color="#FF6699">>></font>
<A href="type18.html" tppabs="http://www.linuxhero.com/docs/type18.html">apache</A> | <A href="copyright.html" tppabs="http://www.linuxhero.com/docs/copyright.html">版权说明</A></font></DIV>
</TD>
<TD><IMG height=22 src="images/spacer.gif" tppabs="http://www.linuxhero.com/docs/images/spacer.gif" width=1
border=0></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=10 cellPadding=0 width="100%" bgColor=#ffffff
border=0>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=3 width="100%" border=0>
<TR>
<TD vAlign=top align=middle width="60%">
<TABLE cellSpacing=0 cellPadding=0 width="100%"
background="images/back.gif" tppabs="http://www.linuxhero.com/docs/images/back.gif" border=0>
<TBODY>
<TR>
<TD vAlign=top width="80%">
<DIV align=center>
<FORM action="search.html" tppabs="http://www.linuxhero.com/docs/search.html" method=get>
</FORM>
<TABLE cellSpacing=0 cellPadding=0 width="95%"
border=0><TBODY>
<TR>
<TD background="images/bgi.gif" tppabs="http://www.linuxhero.com/docs/images/bgi.gif"
height=30></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=3 width="95%"
align=center border=0>
<TBODY>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=3 width="100%"
border=0>
<TBODY>
<TR>
<TD vAlign=top>
<p><FONT class=normalfont><B><font color=blue>多服务器的日志合并统计</font></B></FONT><BR><FONT class=smallfont color=#ff9900>2004-04-23 15:18 pm</FONT><BR><FONT class=normalfont>作者:车东 chedong@bigfoot.com<br>来自:Linux知识宝库<br>联系方式:无名<br><br>——apache日志的cronolog轮循和webalizer合并统计<br>
http://www.chedong.com/tech/rotate_merge_log.html<br>
<br>
作者: 车东 chedong@bigfoot.com<br>
<br>
最后更新:2002-12-22 00:49:17<br>
<br>
版权声明:可以任意转载,转载时请务必标明原始出处和作者信息<br>
<br>
关键词:webalizer apache log analysis sort merge cronolog 日志 分析<br>
<br>
内容摘要:你完全不必耐心地看完下面的所有内容,因为结论无非以下2点:<br>
1 用 cronolog 干净,安全地轮循apache“日”志<br>
2 用 sort -m 合并排序多个日志<br>
<br>
根据个人的使用经历:<br>
1 先介绍apache日志的合并方法;<br>
2 然后根据由此引出的问题说明日志轮循的必要性和解决方法,介绍如何通过cronolog对apache日志进行轮循;<br>
中间有很多在设计日志合并过程中一些相关工具的使用技巧和一些尝试的失败经历……<br>
我相信解决以上问题的路径不止这一条途径,以下方案肯定不是最简便或者说成本最低的,希望能和大家有更多的交流。<br>
<br>
<br>
{0} 多服务器日志合并统计的必要性:<br>
越来越多大型的WEB服务使用DNS轮循来实现负载均衡:使用多个同样角色的服务器做前台的WEB服务,这大大方便了服务的分布规划和扩展性,但多个服务器的分布使得日志的分析统计也变得有些麻烦。如果使用webalizer等日志分析工具对每台机器分别做日志统计:<br>
1 会对数据的汇总带来很多麻烦,比如:统计的总访问量需要将SERVER1 SERVER2...上指定月份的数字相加。<br>
2 会大大影响统计结果中唯一访客数unique visits,唯一站点数unique sites的等指标的统计,因为这几个指标并非几台机器的代数相加。<br>
<br>
统一日志统计所带来的好处是显而易见的,但如何把所有机器的统计合并到一个统计结果里呢?<br>
首先也许会想:多个服务器能不能将日志记录到同一个远程文件里呢?我们不考虑使用远程文件系统记录日志的问题,因为带来的麻烦远比你获得的方便多的多……<br>
因此,要统计的多个服务器的日志还是:分别记录=>并通过一定方式定期同步到后台=>合并=>后用日志分析工具来进行分析。<br>
<br>
首先,要说明为什么要合并日志:因为webalizer没有将同一天的多个日志合并的功能<br>
先后运行<br>
webalizer log1<br>
webalizer log2<br>
webalizer log3<br>
这样最后的结果是:只有log3的结果。<br>
<br>
能不能将log1<<log2<<log3简单叠加呢?<br>
因为一个日志的分析工具不是将日志一次全部读取后进行分析,而且流式的读取日志并按一定时间间隔,保存阶段性的统计结果。因此时间跨度过大(比如2条日志间隔超过5分钟),一些日志统计工具的算法就会将前面的结果“忘掉”。因此, log1<<log2<<log3直接文件连接的统计结果还是:只有log3的统计结果。<br>
<br>
{1} 日志合并问题:多个服务的合并统计就是要把日志按时间排序后合并成一个文件<br>
典型的多个日志文件的时间字段是这样的:<br>
log1 log2 log3<br>
00:15:00 00:14:00 00:11:00<br>
00:16:00 00:15:00 00:12:00<br>
00:17:00 00:18:00 00:13:00<br>
00:18:00 00:19:00 00:14:00<br>
14:18:00 11:19:00 10:14:00<br>
15:18:00 17:19:00 11:14:00<br>
23:18:00 23:19:00 23:14:00<br>
<br>
日志合并必须是按时间将多个日志的交叉合并。合并后的日志应该是:<br>
00:15:00 来自log1<br>
00:15:00 来自log2<br>
00:16:00 来自log1<br>
00:17:00 来自log3<br>
00:18:00 来自log2<br>
00:19:00 来自log1<br>
....<br>
<br>
如何合并多个日志文件?<br>
下面以标准的clf格式日志(apache)为例:<br>
apche的日志格式是这样的:<br>
%h %l %u %t "%r" %>s %b<br>
具体的例子:<br>
111.222.111.222 - - [03/Apr/2002:10:30:17 +0800] "GET /index.html HTTP/1.1" 200 419<br>
<br>
最简单的想法是将日志一一读出来,然后按日志中的时间字段排序<br>
cat log1 log2 log3 |sort -k 4 -t " "<br>
注释:<br>
-t " ": 日志字段分割符号是空格<br>
-k 4: 按第4个字段排序,也就是:[03/Apr/2002:10:30:17 +0800] 这个字段<br>
-o log_all: 输出到log_all这个文件中<br>
<br>
但这样的效率比较低,要知道。如果一个服务已经需要使用负载均衡,其服务的单机日志条数往往都超过了千万级,大小在几百M,这样要同时对多个几百M的日志进行排序,机器的负载可想而之……<br>
其实有一个优化的途径,要知道:即使单个日志本身已经是一个“已经按照时间排好序“的文件了,而sort对于这种文件的排序合并提供了一个优化合并算法:使用 -m merge合并选项,<br>
因此:合并这样格式的3个日志文件log1 log2 log3并输出到log_all中比较好方法是:<br>
sort -m -t " " -k 4 -o log_all log1 log2 log3<br>
注释:<br>
-m: 使用 merge优化算法<br>
<br>
注意:合并后的日志输出最好压缩以后再发给webalizer处理<br>
有的系统能处理2G的文件,有的不能。有的程序能处理大于2G的文件,有的不能。尽量避免大于2G的文件,除非确认所有参与处理的程序和操作系统都能处理这样的文件。所以输出后的文件如果大于2G,最好将日志gzip后再发给webalizer处理:大于2G的文件分析过程中文件系统出错的可能性比较大,并且gzip后也能大大降低分析期间的I/O操作。<br>
<br>
日志的按时间排序合并就是这样实现的。<br>
<br>
{2} 日志的轮循机制:<br>
让我们关心一下数据源问题:webalizer其实是一个按月统计的工具,支持增量统计:因此对于大型的服务,我可以按天将apache的日志合并后送给webalizer统计。WEB日志是如何按天(比如每天子夜00:00:00)截断呢?<br>
如果你每天使用crontab:每天0点准时将日志备份成access_log_yesterday<br>
mv /path/to/apache/log/access_log /path/to/apache/log/access_log_yesterday<br>
的话:你还需要:马上运行一下:apache restart 否则:apache会因为的日志文件句柄丢失不知道将日志记录到哪里去了。这样归档每天子夜重启apache服务会受到影响。<br>
比较简便不影响服务的方法是:先复制,后清空<br>
cp /path/to/apache/log/access_log /path/to/apache/log/access_log_yesterday<br>
echo >/path/to/apache/log/access_log<br>
<br>
严肃的分析员会这样做发现一个问题:<br>
但cp不可能严格保证严格的0点截断。加入复制过程用了6秒,截断的access_log_yesterday日志中会出现复制过程到00:00:06期间的日志。对于单个日志统计这些每天多出来几百行日志是没有问题的。但对于多个日志在跨月的1天会有一个合并的排序问题:<br>
[31/Mar/2002:59:59:59 +0800]<br>
[31/Mar/2002:23:59:59 +0800]<br>
[01/Apr/2002:00:00:00 +0800]<br>
[01/Apr/2002:00:00:00 +0800]<br>
<br>
要知道[01/Apr/2002:00:00:00 这个字段是不可以进行“跨天排序”的。因为日期中使用了dd/mm/yyyy,月份还是英文名,如果按照字母排序,很有可能是这样的结果:排序导致了日志的错误<br>
[01/Apr/2002:00:00:00 +0800]<br>
[01/Apr/2002:00:00:00 +0800]<br>
[01/Apr/2002:00:00:00 +0800]<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -