LINUX日志系统之日志文件的管理

来源:互联网 发布:java valueof方法 编辑:程序博客网 时间:2024/05/16 09:49

我们都知道linux日志文件对我们管理linux系统至关重要,我们需要根据日志文件的信息对系统进行维护、排错以及调优,但是随着系统运行的时间越来越长,软件越装越多,日志文件也变的越来越大~让我们查看起来十分的不方便。那么能不能对日志文件进行切割,变成一个一个小的文件呢进行查看呢?能不能将不同软件产生的日志信息分别存在不同的日志文件中呢?能不能只记录错误级别的日志的信息呢?答案是肯定的~单着一切都基于以下俩个程序:

1、logrotate

2、cron

  • 相关概念:

     linux系统日志文件的管理是通过logrotate程序来实现的。logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,我们把它叫做“转储”。我们可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron 程序来执行。crontab是一个很方便的在unix/linux系统上定时(循环)执行某个任务的程序使用cron服务。

     crond守护进程是在系统启动时由init进程启动的,受init进程的监视,如果它不存在了,会被init进程重新启动。这个守护进程每分钟唤醒一次,并通过检查crontab文件判断需要做什么。每个用户有一个以用户名命名的crontab文件,存放在/var/spool/cron/crontabs目录里。若管理员允许或者禁止其他用户拥有crontab文件,则应编辑/etc/下面的cron.deny和cron.allow这两个文件来禁止或允许用户拥有自己的crontab文件。每一个用户都可以有自己的crontab文件,但在一个较大的系统中,系统管理员一般会禁止这些文件,而只在整个系统保留一个这样的文件。

     cron是一个在后台运行的守护进程,而crontab是一个设置cron的工具。cron调度的是/etc/crontab文件【anacron调度/etc/anacrontab文件】。
     cron.allow和cron.deny:crontab使用的两个文件,cron不会用到它们。
     cron.daily、cron.hourly、cron.weekly和cron.monthly这四个目录均位于/etc下,但cron和crontab两个并不处理。它们是由run-parts处理,run-parts命令位于/usr/bin/run-parts,内容是很简单的一个shell脚本,就是遍历目标文件夹,执行第一层目录下的可执行权限的文件。

    在CeontOS6 里面,crond每分钟去/etc/cron.d里面搜索配置文件,里面有一个0hourly文件,里面写了01 * * * * root run-parts /etc/cron.hourly。是每隔1小时去运行一次/etc/cron.hourly目录,该目录下面有一个0anacron文件,这样0anacron文件就能每小时运行一次。0anacron按照/etc/anacrontab文件里面的配置,将当前时间与/var/spool/anacron目录下面的文件里面的时间戳作对比,如果需要则去运行/etc/anacrontab对应的条目。这也是为什么/etc/anacrontab文件里面只定义了cron.daily、cron.weekly与cron.monthly,而没有定义cron.hourly,因为cron.daily、cron.weekly与cron.monthly其实是由cron.hourly调起来的。

    每小时运行的0anacron只负责进行时间戳的比对,如果当前日期和上次运行anacron的日期不符,说明系统停机过了,就会启动anacron这支程序,再由anacron根据/etc/anacrontab配置进一步判断,然后去运行cron.daily、cron.weekly与cron.monthly里面未完成的任务。

看过了以上概念也许你还有点晕,那我就再多费点口舌:logrotate命令以及配置文件可以用来使我们的日志文件进行滚动转储,我们只要手动使用logrotate命令或者修改logrotate配置文件就可以使我们的日志文件进行滚动转储,那好问题来了,手动使用命令,大家都明白,但是写在配置文件的参数为什么会周期性的执行使我们的日志文件转储滚动呢?这就是crond服务的功劳!crond服务周期性的去执行logrotate配置脚本文件,使得我们的日志管理得以实现!!

日志滚动脚本文件:
/etc/cron.daily/logrotate 

调用过程:
/etc/cron.daily/logrotate脚本文件调用logrotate程序执行/etc/logrotate.conf文件,/etc/logrotate.conf文件又包含/etc/logrotate.d/目录下的相关文件
【/etc/logrotate.conf管理日志文件最小滚动时间是daily所以将logrotate脚本放在/etc/cron.daily/下

  • 配置文件:

     cron本身是一个不间断运行的服务(前提系统不关机)
     查看crond服务的状态:#service crond status
     系统cron任务:定义在/etc/crontab
     用户cron任务:定义在/var/spool/cron/USERNAME

     logrotate程序配置文件:

     /etc/logrotate.conf 日志滚动配置文件,给出了日志滚动的默认值 注意:该文件中有一行:include /etc/logrotate.d  告诉 logrotate 读入存放在/etc/logrotate.d 目录中的日志转储参数,当系统中安装了RPM 软件包时,使用include 选项十分有用。RPM软件包的日志转储参数一般存放在/etc/logrotate.d 目录。include 选项十分重要,一些应用把日志转储参数存在/etc/logrotate.d 典型的应用有:apache, linuxconf, samba, cron 以及syslog。这样,系统管理员只要管理一个 /etc/logrotate.conf 文件就可以了。当 /etc/logrotate.conf 读入文件时,include 指定的文件中的转储参数将覆盖缺省的参数!

    /etc/logrotate.d/目录下可以建立自己的文件,供我们手动管理日志滚动方式。

    # man logrotate   可以通过man命令来查看logrotate命令的参数

  • 以下是logrotate配置文件中常用的一些参数以及含义:
# rotate log files weeklyweekly   //指定所有文件每周转储一次# keep 4 weeks worth of backlogsrotate 4  //一次将存储4个归档日志,超过就删除最早的。# create new (empty) log files after rotating old onescreate  //指定 logrotate 自动建立新的日志文件,新的日志文件具有和原来的文件一样的权限。# use date as a suffix of the rotated filedateext //轮训后的日志文件会附加上一个短横线和YYYYMMDD格式的日期,没有这个配置项会附加一个小数点加一个数字序号# uncomment this if you want your log files compressed#compress //指定压缩转储文件,如果需要压缩,去掉注释就可以了。#notifempty //如果日志文件为空,轮循不会进行。#copytruncate //用于还在打开中的日志文件,把当前日志备份并截断 #nocopytruncate //备份日志文件但是不截断 #delaycompress //和 compress 一起使用时,转储的日志文件到下一次转储时才压缩#nodelaycompress //覆盖 delaycompress 选项,转储同时压缩。#noolddir:转储后的日志文件和当前日志文件放在同一个目录下#errors address:专储时的错误信息发送到指定的Email 地址#olddir directory:转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统#maxage 90   只存储最近90天的日志文件,超过90天则删除#prerotate#//在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行#endscript #postrotate#//在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行#endscript # RPM packages drop log rotation information into this directoryinclude /etc/logrotate.d# no packages own wtmp and btmp -- we'll rotate them here/var/log/wtmp {    monthly//时间最小是daily    create 0664 root utmp  //以指定的文件权限、属主、属组创建全新的日志文件,同时logrotate也会重命名原始日志文件。minsize 1M  //日志文件增长到超过SIZE bytes时进行轮转,但不会在额外指定的时间间隔之前(dailyweekly等)。    rotate 1}/var/log/btmp {    missingok  //在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。    monthly    create 0600 root utmp    rotate 1}

  • 配置实例:
"/var/log/httpd/access.log" /var/log/httpd/error.log {    rotate 5    mail www@my.org    size 100k    sharedscripts #sharedscripts的作用是在所有的日志文件都轮转完毕后统一执行一次脚本。如果没有配置这条指令,那么每个日志文件轮转完毕后都会执行一次脚本。    postrotate        /usr/bin/killall -HUP httpd    endscript}

#service 服务名 reload     //让服务不用重启就可以读取其配置文件。

/usr/sbin/logrotate -f /etc/logrotate.d/文件名    //测试配置是否成功

  • 日志文件格式

     可以在/etc/syslog.conf中配置linux系统日志文件的格式,你需要记录什么级别的日志。【关于系统日志文件的级别产生源等可以自行搜索】
     php-fpm的日志格式是在/usr/local/php/etc/php-fpm.conf中定义的
     httpd的错误日志的格式在httpd.conf中定义LogLevel warn 

注意:

一般不建议手动删除日志文件,如果你手动或者自动删除一个日志文件的后,一定要让对应的软件重新读取配置文件,否则新的日志信息不会被记录进日志文件。

【补充linux命令】

#du -sh 查看下当前文件夹的大小

#df -h 查看当前磁盘空间还剩余多少空间

#ls -lZ查看文件属性标记后有.
Selinux开其后,每个文件都有安全上下文属性,有这个点说明这个文件包含安全上下文属性,可以ls  -lZ查看跟设置ACL后文件会有+符号标记是一样的,是文件属性的标记
———-. 1 root root 1142 9月 25 16:19 /etc/shadow

注意到最后一个点:因为新版本ls把多acl和selinux属性加进去了,与系统无关,新版本的ls代码使用12个字节长的char类型的字符数组modebuf来记录文件属性,前面10个和老版本一样,第一表示类型,后9个表示权限,第11个表示selinux和acl的设置,最后一个当然是c的结尾符\0了。

#有时候你发现用root权限都不能修改某个文件,大部分原因是曾经用chattr命令锁定该文件了。chattr命令的作用很大,其中一些功能是由Linux内核版本来支持的,不过现在生产绝大部分跑的linux系统都是2.6以上内核了。通过chattr命令修改属性能够提高系统的安全性,但是它并不适合所有的目录。chattr命令不能保护/、/dev、/tmp、/var目录。lsattr命令是显示chattr命令设置的文件属性。

原创粉丝点击