经常有这样的情况,日志文件或者数据文件会变得很庞大,那么每次对这些目标文件的访问或者修改就会变得极其耗时。因而引发一些性能问题,但是如果对这些目标文件进行分割,限定其大小,那么每次的访问或者修改就会变得高效。

一、实现原理:

  用Linux自带的定时任务Crontab以及日志分割Logrotate 去进行定时的日志分割。

  Crontab:在LINUX中,周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep cron]。cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间。cron的配置文件称为“crontab”,是“cron table”的简写。

  Logrotate:logrotate工具是为了方便进行日志管理而产生的一个工具,主要可以完成的工作包含:基于天、周、月、文件大小进行日志的滚动备份、压缩、删除甚至是发送邮件。

二、调用方式

  logrotate默认情况下是通过anacron调用的,它每天只会被调用一次,也就是说一个日志文件默认不会多次被处理(除非-f强制调用或者文件大小超过指定值)。大致调用流程如下:
1).anacron每天去调用/etc/cron.daily中的任务(包含logrotate);
2).anacron调用logrotate后进行日志的处理工作;
3).如果logrotate被手工调用,或者配置文件中有引用,后面的配置记录会覆盖前面相同选项的内容;
 
  logrotate语法如下:logrotate [-dv] [-f|--force] [-s|--state file] config_file+
什么都不跟则显示版本信息和简单的帮助信息,如果处理过程中出现异常则返回非0的$?;
--?,--help:  显示帮助信息;
-v, --verbose:显示详细信息;
-d, --debug:开启调试模式并隐含开启-v,不会对日志和logrotate的state文件产生操作;
-f, --force:忽略调用周期强制调用logrotate,方便测试;
-m, --mail <command>:告知logrotate发送邮件的命令;
-s, --state <statefile>:多个logrotate运行时告知logrotate自己使用的state文件(/var/lib/logrotate.status)
config_file+:表示可以使用多个配置文件(默认为/etc/logrotate.conf)在后面,最好是在一个配置文件中进行引用(测试某条新的规则时可以单独创建一个配置文件并用-f参数进行强行调用);
三、配置文件

  配置文件对于logrotate来说至关重要,logrotate通过配置文件去找到需要操作的各个日志文件以及怎么操作这些日志文件。配置文件中可以定义全局options和局部options,且后面的options会覆盖前面的options,先来一个范例配置文件:

# sample logrotate configuration file --注释
compress --压缩option,默认所有的日志都压缩; /var/log/messages { --操作/var/log/messages日志文件,指定文件全名
rotate --最多保留历史存档5份;
weekly --rotate周期,周
postrotate -->rotate结束后直行以下endscript前面的操作
/sbin/killall -HUP syslogd --执行命令
endscript
}
"/var/log/httpd/access.log" /var/log/httpd/error.log { --操作两个文件,引号可以用于规避空格等特殊符号
rotate
mail www@my.org --旧日志文件发送到指定邮件地址
size 100k --rotate规则为超过100K
sharedscripts --所有日志处理完才执行后面的脚本而不是处理一个文件执行一次
postrotate
/sbin/killall -HUP httpd
endscript
}
/var/log/news/* { --指定某个文件夹下的所有文件(包含已经rotate过的),只要有一个处理报错就不会对日志进行压缩
monthly
rotate 2
olddir /var/log/news/old --有利于减少重复rotate
missingok --忽略不存在的日志
postrotate
kill -HUP ‘cat /var/run/inn.pid‘
endscript
nocompress
}

  以下是可用option的详细说明(前面打*号的通常应该都不会用到):

  常规参数:
include file_directory:引用对应的配置文件或者对应目录下的常规文件(最好指定明确的文件,除非该路径下全部都是logrotate的配置文件),文件读取顺序为alphabetic.注意:不能在某个日志的处理定义里面指定include.
mail address:发送邮件的收件人,如果不想发送邮件可以用nomail的参数;
nomail:不发送邮件;
maillast/mailfirst:mailfirst表示发送已经rotate的文件,需要与mail参数配合;maillast(默认值)发送下次会rotate的日志;
  压缩相关参数:
compress/nocompress: compress表示被归档的日志文件默认会通过gzip进行压缩,nocompress表示不压缩(默认);
nodelaycompress/delaycompress:需要结合compress使用,delaycompress下次rotate才compress本次rotate的日志(方便查历史),no开头覆盖此参数;
*extension ext:指定后缀名
*compresscmd:指定压缩的命令,默认是gzip;
*uncompresscmd:指定解压缩的命令,默认是gunzip;
*compressext:指定压缩过后的日志文件的后缀名;
*compressoptions:指定压缩程序的参数,默认为gzip指定的参数是"-9"(最大压缩);
  备份频率相关:
rotate count:归档的最大次数(超过该次数会被覆盖),如果设置为0则表示不归档;
daily:上次归档不是今天时备份一次;
weekly:Log files are rotated if the current weekday is less than the weekday of the last rotation or if more than a week has passed since the last rotation;
yearly:如果当天的年份与上次rotate的年份不一样;
monthly:每个月第一次运行logrotate的时候归档;
minsize size:可以与时间周期的归档结合起来,如果达到天数的归档周期还没有到最小大小也不会归档;
size size:达到指定size的日志会被rotate(单位可以是K/M等);
start count:如果用数字排号则表示直接从count开始排而不是0;
*maxage count:删除已经超过count天的归档,如果需要rotate这个归档则只是检查;
  特别处理方式:
ifempty/notifempty:ifempty是默认值表示空文件也会被rotate,可以通过notifempty修改为空文件不归档;
missingok/nomissingok:missingok表示就算日志不存在也不会报错,
olddir/noolddir:olddir表示将归档的日志放到对应的目录(必须在同一个物理设备)下,绝对路径为明确的路径,如果指定相对路径则是日志文件的相对路径,noolddir覆盖olddir参数
sharedscripts/nosharedscripts:主要针对处理多个日志或指定目录的情况下,sharedscripts表示处理子集中所有的日志都处理完成后才执行,如果没有日志被处理则不会执行。nosharedscripts则表示每个日志处理后都执行scripts部分;
  备份方式相关:
dateext/nodateext:在备份的日志后面加上备份当天的日期(YYYYMMDD)而不是简单的加一个数字(nodateext覆盖此归档方式);
copy/nocopy:copy指定备份日志的方式为复制(源文件可用作其他目的),因原文件不会被删除,所以指定create会直接被忽略;nocopy表示不复制
copytruncate/nocopytruncate:复制一个副本后直接truncate原日志,这对于不能用move掉旧的再创建一个新文件的日志(copy与truncate中间可能会丢失一部分日志,实测每秒一笔日志不会丢失),no开头表示copy后不truncate;
nocreate/create mode owner group:日志滚动(默认是move)后立即创建一个新的日志文件(mode指定权限,owner和group分别指定属主属组),然后才会执行portrotate,如果被忽略的一些属性将会和原日志文件一致,nocreate会覆盖此参数;
postrotate/endscript:rotate完成后通过/bin/sh去执行这两个标记中间(必须换行)的命令,处理的日志文件会作为第一个参数传递给每个命令,如果指定sharedscripts则所有的日志都会传递给脚本;
prerotate/endscript:rotate日志前(确实有日志需要rotate)执行,其他同postrotate;
firstaction/endscript:处理多个日志前执行
lastaction/endscript:处理多个日志全部后执行

四、加入定时任务

  在crontab中加入定时任务执行规则,然后就可以按照定时规则去执行logrotate任务了。

  /var/spool/cron/ 这个目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名,比如tom建的crontab任务对应的文件就是/var/spool/cron/tom。一般一个用户最多只有一个crontab文件。

  找到自己的crontab文件,并vi编辑文件:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/ # For details see man crontabs # Example of job definition:
# .---------------- minute ( - )
# | .------------- hour ( - )
# | | .---------- day of month ( - )
# | | | .------- month ( - ) OR jan,feb,mar,apr ...
# | | | | .---- day of week ( - ) (Sunday= or ) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed

  在末尾添加:

,,,, * * * * logrotate -f /etc/logrotate.d/定时任务配置A
,,,, * * * * logrotate -f /etc/logrotate.d/定时任务配置B

  保存即可。

Linux日志文件分割的更多相关文章

  1. linux文件分割(将大的日志文件分割成小的)

    linux文件分割(将大的日志文件分割成小的) linux下文件分割可以通过split命令来实现,可以指定按行数分割和安大小分割两种模式.Linux下文件合并可以通过cat命令来实现,非常简单. 在L ...

  2. linux文件分割(将大的日志文件分割成小的)【转载】

    linux文件分割(将大的日志文件分割成小的)linux下文件分割可以通过split命令来实现,可以指定按行数分割和安大小分割两种模式.Linux下文件合并可以通过cat命令来实现,非常简单. 在Li ...

  3. linux日志文件

    linux日志文件 在系统运行正常的情况下学习了解这些不同的日志文件有助于你在遇到紧急情况时从容找出问题并加以解决. /var/log/messages — 包括整体系统信息,其中也包含系统启动期间的 ...

  4. Linux - 日志文件

    Linux日志文件绝大多数存放在/var/log目录,其中一些日志文件由应用程序创建,其他的则通过syslog来创建. Linux系统日志文件通过syslog守护程序在syslog套接字/dev/lo ...

  5. Tomcat 日志文件分割

    新到公司, 拿到了前辈们留下的 程序 “病历书” , 上面记载了项目上的一些 经常会犯的毛病,  还有相应的解决方法. 其中有的是因为后台 代码逻辑上的一些原因 , N手代码通病了吧 (这个还是以后再 ...

  6. Linux - 日志文件简介

    Linux日志文件绝大多数存放在/var/log目录,其中一些日志文件由应用程序创建,其他的则通过syslog来创建. Linux系统日志文件通过syslog守护程序在syslog套接字/dev/lo ...

  7. Linux大文件分割splite

    /********************************************************************** * Linux大文件分割splite * 说明: * 编 ...

  8. 位于/var/log目录下的20个Linux日志文件

    位于/var/log目录下的20个Linux日志文件[译] from:http://buptguo.com/2014/01/16/linux-var-log-files/ 原文地址:20 Linux ...

  9. [转帖]Linux日志文件utmp、wtmp、lastlog、messages

    Linux日志文件utmp.wtmp.lastlog.messages https://www.cnblogs.com/zhuiluoyu/p/6874255.html 1.有关当前登录用户的信息记录 ...

随机推荐

  1. hdoj 1003 学习思路

    基本解题思路:动态规划,不考虑穷举,分治. 根据网上,状态转移方程是:MaxSum[i] = Max{ MaxSum[i-1] + A[i], A[i]} 翻译公式:到当前位置i 时,最大子序列和为: ...

  2. HashSet和LinkedHashSet解析

    一.简介 1.Set概念 Set可以理解为集合,非常类似数据概念中的集合,集合三大特征:1.确定性:2.互异性:3.无序性,因此Set实现类也有类似的特征. 2.HashSet HashSet继承自A ...

  3. tomcat8 web工程启动,登陆页面失败问题解决

    编辑该文件context.xml 增加以下内容 <CookieProcessor className="org.apache.tomcat.util.http.LegacyCookie ...

  4. FBackup:个人用途与商业用途都是免费的

    當自己在備份電腦資料時,若沒有使用備份及還原軟體時,我想很多人的作法就是「想到應該要備份了,然後進行備份檔案的壓縮.壓縮好之後複製到不同的磁碟機或燒錄光碟」,等要用的時候,再拿出來還原.若是這樣,其實 ...

  5. h5内容初探

    h5简介: h5新特性 h5新增标签 article  和  section 的区别相当于 div  和  p标签的区别 1—6都是块级元素 h5新增属性 拖放 拖动事件 <style> ...

  6. 简单的实现微信获取openid

    微信公众平台获取openid在公众号的开发中有很多用途,前段时间为实现用户使用公众号在登录一次以后可以免密登陆而使用了openid.开发过程中遇到了一些问题,在这里向需要且还没有获取到openid的米 ...

  7. linux centos 基本命令

    init 3 进入命令行界面. init 5 进入图形界面. ifconfig 查询IP地址. nmtui 设置网卡. su - root 是切换到root账号使用,使用的是root用户的环境变量:s ...

  8. MySql数据库常用语句汇总

    第一天1.登陆数据库 mysql -uroot -proot; //-u用户名 -p密码2.启动数据库 net start mysql;3.创建表空间(数据库)create database qy97 ...

  9. 二、Adapter 适配器

    适配器:继承适配与委托适配 需求:Banner 可以输出强电流380v.弱电流12v,但是不能被直接使用.通过别的方式,介间的使用banner? 委托类图: 代码清单: 需要隐藏的功能类: publi ...

  10. PHP伪原创同义词替代代码示意

    PHP伪原创同义词替代代码示意很多网站后台都是支持PHP,虽然用同义词百度能够识别,但至少比原封不动好些,没有AI原创NLP原创度高,但也有一定的效果.下面就是PHP代码实例: <?phpreq ...