感谢支持
我们一直在努力

Linux认识和分析日志文件

前言

唉,这周本来想彻底研究一下树的数据结构,结果搭建了基于nginx+php-fpm的web server运行模式,回到宿舍就太累没心思再思考数据结构和算法,就这样吧,这周就只搞运维了,虽然之间也写了点php代码学了点设计模式

syslogd:记录日志文件的服务

日志内容的一般格式

一般来说,系统产生的信息经过syslog而记录下来的数据中,每条信息均会记录下面几个重要数据:

(1)事件发生的日期与时间

(2)发生此事件的主机名

(3)启动此时间的服务名称

(4)该信息的实际数据内容

举个例子如下:

解释一下其中一条数据:在2012年11月15日的10:13:34秒,错误信息是php-fpm绑定的ip地址被使用了,主机名和服务名称是我自己设置没加上

syslog的配置文件

Ubuntu 10.04之后,syslog的配置文件在

/etc/rsyslog.conf 

配置文件的内容可以简单分为三部分说明:

服务名称

auth : 主要与认证有关的机制 
cron : 就是例行性工作调度crontab等生成信息日志的地方 
daemon : 就是各个daemon有关的信息 
kern : 就是内核(kernel)产生信息的地方 
lpr : 打印相关信息 
mail : 只要与邮件收发有关的信息记录在此 
news :  与新闻组服务器有关的东西 

信息等级

info : 一些基本的信息说明 
notice : 除了info还需要注意的一些信息内容 
warning : 警示的信息,可能有问题,但是不至于影响到某个daemon的运行 
error : 一些重大的错误信息 
crit : 比error还要严重的错误信息 
alert : 警告,已经很有问题的等级 
emerg : “疼痛”等级,意指系统已经几乎要死机状态! 

链接符号[.|.=|.!]

. : 代表比后面还要高的等级(含该等级)都被记录下来的意思。例如:news.err 代表只要是news的信息,而且该信息的等级大于等于error级别就会被记录下来的意思 
.= : 代表所需要的等级==后面链接的等级,其它的不要 
.! : 代表不等于,即除了该等级之外的等级都记录下来 

说下题外话:

一个程序员一般会尽全力消除程序中所有的notice,因此到现在我也是仅仅见过error级别的,error之上的我觉得可能需要更大并发量的时候才能遇到

信息记录的文件名或设备或主机

注意

查看rsyslog的配置文件的时候,大部分linux选手会选择vim,并且更大的部分在退出文件的时候会:x一下,这就会麻烦了,我这里是参考了<<鸟哥linux私房菜>>中的说法:由于你vim保存了日志文件,则syslog会误判为该文件已被改动过,将导致syslog不再写入该文件新的内容,因此只能重新启动syslog程序了,重启命令:

/etc/init.d/rsyslog  restart 

日志文件的轮替(logrotate)

前言:

syslog利用的是daemon的方式来启动的,当有需求的时候立刻会被执行,但是logrotate却是在规定的时间到了之后才来进行日志文件的轮替,所以这个logrotate程序当然是挂在cron下面进行的。

查看一下logrotate的内容如下:

#!/bin/sh 
 
# Clean non existent log file entries from status file 
cd /var/lib/logrotate 
test -e status || touch status 
head -1 status > status.clean 
sed ‘s/”//g’ status | while read logfile date 
do 
    [ -e “$logfile” ] && echo “\”$logfile\” $date” 
done >> status.clean 
mv status.clean status 
 
test -x /usr/sbin/logrotate || exit 0 
/usr/sbin/logrotate /etc/logrotate.conf 

logrotate主要是针对日志文件来进行轮替操作,所以它必须记载在什么状态下才将日志文件进行轮替的设置,通过上面的shell脚本,就可以看出配置文件是在/etc/logrotate.conf

logrotate的配置文件

  1. # see “man logrotate” for details
  2. # rotate log files weekly
  3. weekly <== 默认每个星期进行一次logrotate工作
  4. # keep 4 weeks worth of backlogs
  5. rotate 4 <== 默认没星期保留4个日志文件
  6. # create new (empty) log files after rotating old ones
  7. create <== 由于日志文件被重命名,因此新建一个新的来继续存储
  8. # uncomment this if you want your log files compressed
  9. #compress <== 被修改的日志文件是否需要压缩存储?(文件太大可以考虑这个参数)
  10. # packages drop log rotation information into this directory
  11. include /etc/logrotate.d <== 将这个目录下的所有文件都读进来执行rotate程序
  12. # no packages own wtmp, or btmp — we’ll rotate them here
  13. /var/log/wtmp { <== 仅针对/var/log/wtmp 所设置的参数
  14. missingok
  15. monthly <== 每月执行一次备份操作
  16. create 0664 root utmp <== 指定文件的权限
  17. rotate 1 <== 仅保留一个
  18. }
  19. /var/log/btmp {
  20. missingok
  21. monthly
  22. create 0660 root utmp
  23. rotate 1
  24. }
  25. # system-specific logs may be configured here

logrotate语法

  1. compress:通过gzip 压缩转储以后的日志
  2. nocompress:不需要压缩时,用这个参数
  3. copytruncate:用于还在打开中的日志文件,把当前日志备份并截断
  4. nocopytruncate:备份日志文件但是不截断
  5. create mode owner group:转储文件,使用指定的文件模式创建新的日志文件
  6. nocreate:不建立新的日志文件
  7. delaycompress:和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
  8. nodelaycompress:覆盖 delaycompress 选项,转储同时压缩。
  9. errors address:专储时的错误信息发送到指定的Email 地址
  10. ifempty:即使是空文件也转储,这个是 logrotate 的缺省选项。
  11. notifempty:如果是空文件的话,不转储
  12. mail address:把转储的日志文件发送到指定的E-mail 地址
  13. nomail:转储时不发送日志文件
  14. olddir directory:转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
  15. noolddir:转储后的日志文件和当前日志文件放在同一个目录下
  16. prerotate/endscript:在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
  17. postrotate/endscript:在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
  18. daily:指定转储周期为每天
  19. weekly:指定转储周期为每周
  20. monthly:指定转储周期为每月
  21. rotate count:指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
  22. size size:当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem).

备注

本来想通过logrotate来按天备份nginx日志文件,查看了logrotate中关于nginx的配置,发现也是发送了kill -USR1信号给nginx重新生成日志,就不准备用nginx了,还是要自己写脚本通过crontab控制吧

按天备份php5-fpm脚本

  1. #!/bin/bash –
  2. #1.php5-fpm日志存放路径
  3. php5_fpm_logs_path=”/var/log/php5-fpm/”
  4. category_array=(“access” “error”)
  5. #2.php5-fpm日志名后缀
  6. postfix=`date -d ‘-1 days’ +%Y%m%d`”.log”
  7. #3.php5-fpm日志切割
  8. for category in ${category_array[*]}
  9. do
  10. if [ -e $php5_fpm_logs_path/php5-fpm.$category.log ]
  11. then
  12. mv $php5_fpm_logs_path/php5-fpm.$category.log \
  13. $php5_fpm_logs_path/php5-fpm.$category.$postfix
  14. fi
  15. done
  16. #4.查找php5-fpm进程号,让其产生新的日志文件
  17. php5fpm_pid=`ps -aux |grep -E ‘php-fpm: master process’|grep -v ‘grep’|awk ‘{print $2}’`
  18. #USR1:Reopen log files,刷新nginx日志文件
  19. kill -USR1 $php5fpm_pid
赞(0) 打赏
转载请注明出处:服务器评测 » Linux认识和分析日志文件
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏