Linux下apache日志(按日期存放)
Linux下apache日志(按日期存放)分析与状态查看方法
一、apache日志按日期记录
在apache的配置文件中找到
ErrorLog logs/error_log
CustomLog logs/access_log common
Linux系统配置方法:
将其改为
ErrorLog “| /usr/local/apache/bin/rotatelogs /home/logs/www/%Y_%m_%d_error_log 86400 480″
CustomLog “| /usr/local/apache/bin/rotatelogs /home/logs/www/%Y_%m_%d_access_log 86400 480″ common
Windows系统下配置方法:
#ErrorLog “|bin/rotatelogs.exe logs/vicp_net_error-%y%m%d.log 86400 480″
#CustomLog “|bin/rotatelogs.exe logs/vicp_net_access-%y%m%d.log 86400 480″ common
第一次不知道设置480这个参数,导致日志记录时间和服务器时间相差8小时,原来是rotatelogs有一个offset参数,表示相对于UTC的时差分钟数,中国是第八时区,相差480分钟。86400是表示1天。
附rotatelogs说明
rotatelogs logfile [ rotationtime [ offset ]] | [ filesizeM ]
选项
logfile
它加上基准名就是日志文件名。如果logfile中包含’%’,则它会被视为用于的strftime(3)的格式字串;否则,它会被自动加上以秒为单位的.nnnnnnnnnn后缀。这两种格式都表示新的日志开始使用的时间。
rotationtime
日志文件回卷的以秒为单位的间隔时间
offset
相对于UTC的时差的分钟数。如果省略,则假定为0,并使用UTC时间。比如,要指定UTC时差为-5小时的地区的当地时间,则此参数应为-300。
filesizeM
指定回卷时以兆字节为单位的后缀字母M的文件大小,而不是指定回卷时间或时差。
二、设置apache日志记录格式
定制日志文件的格式涉及到两个指令,即LogFormat指令和CustomLog指令,默认httpd.conf文件提供了关于这两个指令的几个示例。
LogFormat指令定义格式并为格式指定一个名字,以后我们就可以直接引用这个名字。CustomLog指令设置日志文件,并指明日志文件所用的格式(通常通过格式的名字)。
LogFormat指令的功能是定义日志格式并为它指定一个名字。例如,在默认的httpd.conf文件中,我们可以找到下面这行代码:
LogFormat “%h %l %u %t \”%r\” %>s %b” common
该指令创建了一种名为“common”的日志格式,日志的格式在双引号包围的内容中指定。格式字符串中的每一个变量代表着一项特定的信息,这些信息按照格式串规定的次序写入到日志文件。
Apache文档已经给出了所有可用于格式串的变量及其含义,下面是其译文:
%…a: 远程IP地址
%…A: 本地IP地址
%…B: 已发送的字节数,不包含HTTP头
%…b: CLF格式的已发送字节数量,不包含HTTP头。例如当没有发送数据时,写入‘-’而不是0。
%…{FOOBAR}e: 环境变量FOOBAR的内容
%…f: 文件名字
%…h: 远程主机
%…H 请求的协议
%…{Foobar}i: Foobar的内容,发送给服务器的请求的标头行。
%…l: 远程登录名字(来自identd,如提供的话)
%…m 请求的方法
%…{Foobar}n: 来自另外一个模块的注解“Foobar”的内容
%…{Foobar}o: Foobar的内容,应答的标头行
%…p: 服务器响应请求时使用的端口
%…P: 响应请求的子进程ID。
%…q 查询字符串(如果存在查询字符串,则包含“?”后面的部分;否则,它是一个空字符串。)
%…r: 请求的第一行
%…s: 状态。对于进行内部重定向的请求,这是指*原来*请求 的状态。如果用%…>s,则是指后来的请求。
%…t: 以公共日志时间格式表示的时间(或称为标准英文格式)
%…{format}t: 以指定格式format表示的时间
%…T: 为响应请求而耗费的时间,以秒计
%…u: 远程用户(来自auth;如果返回状态(%s)是401则可能是伪造的)
%…U: 用户所请求的URL路径
%…v: 响应请求的服务器的ServerName
%…V: 依照UseCanonicalName设置得到的服务器名字
在所有上面列出的变量中,“…”表示一个可选的条件。如果没有指定条件,则变量的值将以“-”取代。分析前面来自默认httpd.conf文件的 LogFormat指令示例,可以看出它创建了一种名为“common”的日志格式,其中包括:远程主机,远程登录名字,远程用户,请求时间,请求的第一 行代码,请求状态,以及发送的字节数。
有时候我们只想在日志中记录某些特定的、已定义的信息,这时就要用到“…”。如果在“%”和变量之间放入了一个或者多个HTTP状态代码,则只有当请 求返回的状态代码属于指定的状态代码之一时,变量所代表的内容才会被记录。例如,如果我们想要记录的是网站的所有无效链接,那么可以使用:
LogFormat @4{Referer}i BrokenLinks
反之,如果我们想要记录那些状态代码不等于指定值的请求,只需加入一个“!”符号即可:
LogFormat %!200U SomethingWrong
三、专门记录某个蜘蛛记录
SetEnvIfNoCase User-Agent Baiduspider baidu_robot
LogFormat “%h %t \”%r\” %>s %b” robot
linux下
CustomLog “|/usr/local/apache2.2.0/bin/rotatelogs /usr/local/apache2.2.0/logs/baidu_%Y%m%d.txt 86400 480″ robot env=baidu_robot
windows下
CustomLog “|bin/rotatelogs.exe logs/baidu_%Y%m%d.txt 86400 480″ robot env=baidu_robot
这样在logs目录下,就会每天产生baidu_年月日.txt的日志了,每条的记录和下面的类似:
61.135.168.14 [22/Oct/2008:22:21:26 +0800] “GET / HTTP/1.1″ 200 8427
四、去掉日志中的图片、js、css、swf文件
SetEnv IMAG 1
CustomLog "|bin/cronolog.exe logs/cpseadmin/access_%Y%m%d.log" combined env=!IMAG
清除error.log、access.log并限制Apache日志文件大小的方法
Apache下的access.log和error.log文件从安装服务器到现在没有动过,今天突然discuz 的MYSQL数据库连接错误,提示2003 错误,检查发现原来是error.log、access.log爆满,文件达到30个G,奶奶的,立马搜索,得把这两个小子干掉。
下面是在网上搜索到的方法,立马见效,顶一个!
在 Windows 下的设置例子如下:
第一步:删除 Apache2/logs/目录下的 error.log、access.log文件
第二步:打开 Apache 的 httpd.conf配置文件并找到下面两条配置
ErrorLog logs/error.log
CustomLog logs/access.log common
直接注释掉,换成下面的配置文件。
# 限制错误日志文件为 1M
ErrorLog “|bin/rotatelogs.exe -l logs/error-%Y-%m-%d.log 1M”
# 每天生成一个错误日志文件
#ErrorLog “|bin/rotatelogs.exe -l logs/error-%Y-%m-%d.log 86400″
# 限制访问日志文件为 1M
CustomLog “|bin/rotatelogs.exe -l logs/access-%Y-%m-%d.log 1M” common
# 每天生成一个访问日志文件
#CustomLog “|bin/rotatelogs.exe -l logs/access-%Y-%m-%d.log 86400″ common
参考:
Apache下的access.log和error.log文件处理方法
这几天有会员和我说到网站访问速度越来越慢。我查了一下,看到Apache2下面有两个日志文件非常大了,加起来有800多M了。
分别是access.log和error.log。
于是在网上找找了给access.log和error.log减肥的方法,这个方法可让这两个文件按每天日期生成。这样你可以选择
把前面的旧文件删除了。
在Apache下的httpd.conf配置文件下找到下面两句:
ErrorLog logs/error.log
CustomLog logs/access.log common
然后把这两句分别改为如下:
CustomLog “|D:/apache2/bin/rotatelogs.exe D:/apache2/logs/access_%Y_%m_%d.log 86400 480″ common
ErrorLog “|D:/apache2/bin/rotatelogs.exe D:/apache2/logs/error_%Y_%m_%d.log 86400 480″
一切就这么简单,这样这两个日志文件每天都会起一个新文件,就不至于单个文件太大,打不开,而无法看到日志信息了.
你还可以把前面的日志文件删除。
access.log,件在 WEB 服务器运行一段时间之后会达到几十兆甚至上百兆,如果Apache运行有错误,error.log也会增大到几十兆,我们知道系统读写一个大的文本文件是非常耗内存的,因此限定日志文件大小十分必要。
日志文件大小的配置指令,通过参考http://httpd.apache.org/docs/2.0/programs /rotatelogs.html,可以用apache 自己的程序 rotatelogs.exe(位于 {$apache}/bin/目录下),来限制日志文件的大小。
Usage: rotatelogs [-l] [offset minutes from UTC] or
Add this:
TransferLog “|rotatelogs /some/where 86400″
or
TransferLog “|rotatelogs /some/where 5M”
to httpd.conf. The generated name will be /some/where.nnnn where nnnn is the system time at which the log nominally starts (N.B. if using a rotation time, the time will always be a multiple of the rotation time, so you can synchronizecron scripts with it). At the end of each rotation time or when the file size is reached a new log is started.
在 Windows 下的设置例子如下:
# 限制错误日志文件为 1M
ErrorLog “|bin/rotatelogs.exe -l logs/error-%Y-%m-%d.log 1M”
# 每天生成一个错误日志文件
#ErrorLog “|bin/rotatelogs.exe -l logs/error-%Y-%m-%d.log 86400″
# 限制访问日志文件为 1M
CustomLog “|bin/rotatelogs.exe -l logs/access-%Y-%m-%d.log 1M” common
# 每天生成一个访问日志文件
#CustomLog “|bin/rotatelogs.exe -l logs/access-%Y-%m-%d.log 86400″ common
linux/Unix下 应该类似。
清除apache的access.log方法
有个客户服务器是用apache搭建的,最近总是感觉站很慢,服务器很慢很卡,有时候甚至网站都打不开,后来经过排查分析原来是里面的access.log和error.log这两个文件要经常上去看,和清理,如果时间忙,忘记看和清理了,过不了多久,这两个文件就膨胀的非常的大,打都打不开了。 下面就跟你说下 清理access.log和error.log这两个日志文件的方法希望对大家有些帮助。也怀疑怀疑是有其他的爬虫,明天都在爬我的几个网站。
优化access.log和error.log的方法如下 :
CustomLog “|D:/thridparty-system/java/apache2/bin/rotatelogs.exe D:/thridparty-system/java/apache2/logs/access_%Y_%m_%d.log 86400 480″ common
ErrorLog “|D:/thridparty-system/java/apache2/bin/rotatelogs.exe D:/thridparty-system/java/apache2/logs/error_%Y_%m_%d.log 86400 480″
一切就这么简单,这样这两个日志文件每天都会起一个新文件,就不至于单个文件太大,打不开,而无法看到日志信息了.
解决Apache日志文件ACCESS.LOG日益膨胀的一个办法
将httpd.conf中customlog logs/access.log common 改成
customlog “|c:/apache/bin/rotatelogs c:/apache/logs/%y_%m_%d.access.log 86400 480″ common
重启apache
其中c:/apache/是你安装apache的路径
这样每一天生成一个日志文件
解决Apache日志文件ACCESS.LOG日益膨胀的一个办法
APACHE 日志查看与分析
假设apache日志格式为:
118.78.199.98 – - [09/Jan/2010:00:59:59 +0800] “GET /Public/Css/index.css HTTP/1.1″ 304 – “http://www.a.cn/common/index.php” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6.3)”
问题1:在apachelog中找出访问次数最多的10个IP。
awk '{print $1}' apache_log |sort |uniq -c|sort -nr|head -n 10
awk 首先将每条日志中的IP抓出来,如日志格式被自定义过,可以 -F 定义分隔符和 print指定列;
sort进行初次排序,为的使相同的记录排列到一起;
upiq -c 合并重复的行,并记录重复次数。
head进行前十名筛选;
sort -nr按照数字进行倒叙排序。
我参考的命令是:
显示10条最常用的命令
sed -e "s/| //n/g" ~/.bash_history | cut -d ' ' -f 1 | sort | uniq -c | sort -nr | head
问题2:在apache日志中找出访问次数最多的几个分钟。
awk '{print $4}' access_log |cut -c 14-18|sort|uniq -c|sort -nr|head
awk 用空格分出来的第四列是[09/Jan/2010:00:59:59;
cut -c 提取14到18个字符
剩下的内容和问题1类似。
问题3:在apache日志中找到访问最多的页面:
awk '{print $11}' apache_log |sed 's/^.*cn/(.*/)/"//1/g'|sort |uniq -c|sort -rn|head
类似问题1和2,唯一特殊是用sed的替换功能将”http://www.a.cn/common/index.php”替换成括号内的内容:”http://www.a.cn(/common/index.php)”
问题4:在apache日志中找出访问次数最多(负载最重)的几个时间段(以分钟为单位),然后在看看这些时间哪几个IP访问的最多?
1,查看apache进程:
ps aux | grep httpd | grep -v grep | wc -l
2,查看80端口的tcp连接:
netstat -tan | grep "ESTABLISHED" | grep ":80" | wc -l
3,通过日志查看当天ip连接数,过滤重复:
cat access_log | grep "19/May/2011" | awk '{print $2}' | sort | uniq -c | sort -nr
4,当天ip连接数最高的ip都在干些什么(原来是蜘蛛):
cat access_log | grep "19/May/2011:00" | grep "61.135.166.230" | awk '{print $8}' | sort | uniq -c | sort -nr | head -n 10
5,当天访问页面排前10的url:
cat access_log | grep "19/May/2010:00" | awk '{print $8}' | sort | uniq -c | sort -nr | head -n 10
6,用tcpdump嗅探80端口的访问看看谁最高
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr
接着从日志里查看该ip在干嘛:
cat access_log | grep 220.181.38.183| awk '{print $1"/t"$8}' | sort | uniq -c | sort -nr | less
7,查看某一时间段的ip连接数:
grep "2006:0[7-8]" www20110519.log | awk '{print $2}' | sort | uniq -c| sort -nr | wc -l
8,当前WEB服务器中联接次数最多的20条ip地址:
netstat -ntu |awk '{print $5}' |sort | uniq -c| sort -n -r | head -n 20
9,查看日志中访问次数最多的前10个IP
cat access_log |cut -d ' ' -f 1 |sort |uniq -c | sort -nr | awk '{print $0 }' | head -n 10 |less
10,查看日志中出现100次以上的IP
cat access_log |cut -d ' ' -f 1 |sort |uniq -c | awk '{if ($1 > 100) print $0}'|sort -nr |less
11,查看最近访问量最高的文件
cat access_log |tail -10000|awk '{print $7}'|sort|uniq -c|sort -nr|less
12,查看日志中访问超过100次的页面
cat access_log | cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' | less
13,列出传输时间超过 30 秒的文件
cat access_log|awk '($NF > 30){print $7}'|sort -n|uniq -c|sort -nr|head -20
14,列出最最耗时的页面(超过60秒的)的以及对应页面发生次数
cat access_log |awk '($NF > 60 && $7~//.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100
提示:如果上面显示空白或者页面排版混乱、内容显示不完整等影响阅读的问题,请点击这儿浏览原文
linux下查看所有硬盘分区+挂接NTF
linux下查看所有硬盘分区+挂接NTFS磁盘/硬盘+自动挂接硬盘方法
在linux下查看硬盘分区
linux下,你如果想要挂载一个硬盘的话,你肯定需要知道硬盘分区的情况,怎么知道呢?我现在说两几方法。
用"df"或者“df -lh”可以查看已经挂载的分区情况。
用“fdisk -l“可以查看所有分区的使用情况,当然还可以进行分区变动!
用”cfdisk“也可以查看所有分区的使用情况。按Q可以退出!
这几种方法,我认为是比较常用的方法,不同的系统,可以还有不同的方法!
fdisk -l 查看分区情况
mkdir /mnt/win 创建目录
mount /dev/hda6(据情况而定) /mnt/win 查看本机fat格式的硬盘(ide硬盘)
mount /dev/sda6(据情况而定) /mnt/win 查看本机fat格式的硬盘(sata硬盘)
mount -t ntfs /dev/hda5(据情况而定) /mnt/win查看本机ntfs格式的硬盘(可能要重新编译内核)
mount -t snbfs -o username=*** //192.168.2.2/shared /mnt/win查看网络上机器的硬盘
cp -r /mnt/win/oc4j ../appsoft/oc4j复制命令(r表示递归复制整个目录)
Linux挂载NTFS磁盘
今天去给公司的服务器做维护,需要将一些数据备份回来。带过去的是一个ntfs的移动硬盘,到机房,我突然想到原来公司的服务器还不能直接挂在ntfs格式的硬盘。
所以,需要提供支持。我用的是ntfs-3g。文件在附件里面可以看到,将他下在下来,然后直接传到服务器上面,将他安装进linux操作系统。 安装的流程非常简单,就是./configure&&make&&make install就可以了。
然后需要找出ntfs硬盘的设备位置,使用fdisk -l命令显示当前系统下面的所有硬盘设备,找出你的ntfs设备,然后就进行挂载。
首先需要你将挂载点建立好,我是这么做的,mkdir /media/udisk。 然后进行挂载,
mount -t ntfs-3g 设备 /media/udisk,
例如:mount -t ntfs-3g /dev/sdb1 /media/udisk
最后,你就可以去udisk下面访问你的文件了
卸载硬盘设备。
umount /media/udisk 或者 umount /dev/sdb1 ok!
# tar –zxvf fuse-2.7.0.tar.gz
# cd fuse-2.7.0
# ./configure
# make
# make install
# lsmod
# modprobe fuse
Then (re)configure and install ntfs-3g
# tar –zxvf ntfs-3g-1.5130.tar.gz
# cd ntfs-3g-1.5130
# ./configure -–enable-fuse-module
# make
# make install
Then mount your ntfs drive in linux.
# mkdir /mnt/windows
# mount –t ntfs-3g /dev/sda1 /mnt/windows
Now, you can Read/Write NTFS formatted drive in Linux.
Linux开机自动挂载硬盘
基本上所有Linux 发行版在启动系统时都是根据/etc/fstab文件的配置来挂载分区的。在/etc/fstab中,根据不同格式的分区,其挂载参数也不同,参数不同其结果不同,包括用户的读写权限,下面一一说来。
1、对于fat32格式分区,向/etc/fstab中加入下面的内容:
/dev/sdaX /media/Y vfat user,rw,utf8,umask=000 0 0
说明:/dev/sdaX可以以管理员身份通过命令fdisk -l得知,只要找你需要挂载的那个分区即可。/media/Y这是一个文件夹,应该提前建立好。”user,rw”是说用户可进行读写操作。utf8这个 可以说是必要的,因为往往有一些windows的文件夹是中文名的,而在windows下是GBK的编码方式,在linux下挂载就会看到乱码,加上 utf8的参数将中文自动转换成UTF8显示,可以有效的避免乱码问题。umask=000说明对所有用户赋予了读写操作,也就是说挂载之后普通用户也可 进行操作。最后有两个0通过空格隔开,这两个0中的后者决定了开机是否检查,如果需要检查则将其改为1。
2、对于EXT3、EXT4等Linux分区格式,可以向/etc/fstab中加入下面的内容:
/dev/sdaX /media/Y ext3 defaults 0 1
/dev/sdaX /media/Y ext4 defaults 0 1
/dev/sdaX /media/Y jfs defaults 0 1
……
上面这几行分别对应了ext3、ext4和jfs的挂载语句,具体请根据您自己的分区情况来修改。这几句中,X与Y的含义同上,default参数说明按照默认格式挂载,后面的0和1就说明开机要检查。
3、NTFS格式分区,比较麻烦,首先请安装ntfs-3g这个软件,如果不安装这个软件将不能对NTFS格式分区进行读写。安装之后将如下内容添加到/etc/fstab中:
/dev/sdaX /media/Y ntfs-3g defaults 0 0
ps:这个我使用第是/dev/sdaX /media/Y auto defaults 0 0
此处X与Y的含义同上,值得说明的是ntfs-3g后的参数,如下:
users – 假如ntfs-3g可执行文件设置了SUID root(命令:chmod u+s /bin/ntfs-3g ) ,则允许任何人挂载/卸载NTFS分区。请注意,你要用users 而不是user
uid – 指定NTFS分区中文件和目录的拥有者(用十进制数表示)
gid – 指定NTFS分区中文件和目录的用户组(用十进制数表示)
fmask – 文件权限(八进制数掩码)
dmask – 目录权限(八进制数掩码)
locale – 曾经用来让使用国际化字符集的文件可见。在ntfs-3g 2009.1.1和更新的版本中已不再需要。
noauto – 启动时不要自动挂载分区
提示:如果上面显示空白或者页面排版混乱、内容显示不完整等影响阅读的问题,请点击这儿浏览原文