linux 日志分割

2017-03-28 11:33:14 jmingbh 阅读数 646
  • 什么是日志切割

    从理论到实践,快速入门Spring Boot 2.x 从Spring Boot扩展到Spring相关知识的学习和实战 Spring Boot与其他技术框架的集成 Spring Boot部分功能源码解析

    0人学习 向明旺
    免费试看
logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,我们把它叫做“转储”。我们可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron 程序来执行。
logrotate 程序还可以用于压缩日志文件,以及发送日志到指定的E-mail 。




Logrotate是基于CRON来运行的,其脚本是「/etc/cron.daily/logrotate」
实际运行时,Logrotate会调用配置文件「/etc/logrotate.conf」




这里的设置可以理解为Logrotate的缺省值,当然了,可以我们在「/etc/logrotate.d」目录里放置自己的配置文件,用来覆盖Logrotate的缺省值。


logrotate 是安装系统时就可以装上去的,很多的大流量网站都是使用这个来进行Log的切换。
不用 Kill nginx pid, 不用restart nginx,只要重新载入一下就可以了。




nginx日志分割:
在/etc/logrotate.d/目录下生成nginx文件


/mnt/nginx/logs/*.log {      //注意:具体请以自己的nginx日志为准
    daily                   //每天切割
    dateext                 //%Y%m%d作为后缀
    missingok               //日志不存在,分析下一个
    rotate 20                //保留最近的20个备份
    compress                //切换之后压缩.tar.gz
    notifempty              //空文件不转储
    create 640 root root    //新日志文件模式 root 是使用的用户
    sharedscripts           //整个日志组运行一次的脚本
    postrotate
    /mnt/nginx/sbin/nginx reload > /dev/null 2>/dev/null || true
    endscript
}


如果你等不及CRON,可以通过如下命令来手动执行:
shell> logrotate -f /etc/logrotate.d/nginx
当然,正式执行前最好通过Debug选项来验证一下,这对调试也很重要,验证的过程不会真的转存:
shell> logrotate -d -f /etc/logrotate.d/nginx


Logrotate的备份策略(以两个备份来说明,即rotate 2,文件error.log):原始文件error.log,经过一次转储,会生成error.log.1;第二次转储,生成error.log.2;第三次转储,error.log.n命名为error.log.n+1,同时生成新的error.log.1,删除error.log.n+1文件。


日志切割的执行时间是由cron程配置决定的,可查看/etc/crontab文件(cron时间戳格式:分时日月周)






    postrotate
            [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
                            //重启nginx,重新加载日志文件,防止不写
            `cp -f /var/log/nginx/*.* /var/log/nginx/backup`
                            //自定义脚本,将旧日志copy到backup文件夹(backup要存在)




 cat /var/lib/logrotate.status
2017-08-04 13:24:25 bob_tthp 阅读数 535
  • 什么是日志切割

    从理论到实践,快速入门Spring Boot 2.x 从Spring Boot扩展到Spring相关知识的学习和实战 Spring Boot与其他技术框架的集成 Spring Boot部分功能源码解析

    0人学习 向明旺
    免费试看
1.split
split  [-<行数>][-b <字节>][-C <字节>][-l <行数>][要切割的文件][输出文件名]
wc -l check.log 查看大概多少行
split -C 10M check.log check_new.log
split -l 100000  check.log check_new.log  会分成n个日志文件




2.  dd
  1. if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >
  2. of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >
  3. count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
  4. conv=conversion:用指定的参数转换文件。
  5. bs=bytes:同时设置读入/输出的块大小为bytes个字节。
  6. skip=blocks:从输入文件开头跳过blocks个块后再开始复制。
  7. seek=blocks:从输出文件开头跳过blocks个块后再开始复制
dd bs=1M count=10 if=check.log of=check_new.log1
dd bs=1M count=10 if=check.log of=check_new.log2 skip=10
dd bs=1M count=10 if=check.log of=check_new.log3 skip=20 每次分割10M  分割3次   每次跳过10M
2019-05-05 14:07:57 p312011150 阅读数 2443
  • 什么是日志切割

    从理论到实践,快速入门Spring Boot 2.x 从Spring Boot扩展到Spring相关知识的学习和实战 Spring Boot与其他技术框架的集成 Spring Boot部分功能源码解析

    0人学习 向明旺
    免费试看

指定文件大小分割:

split -b 10m catalina.out imsoft

以每个文本文件10M方式分割日志

文件合并:

cat small_file* > large_file

2015-09-06 19:35:06 caiceyunchuang 阅读数 401
  • 什么是日志切割

    从理论到实践,快速入门Spring Boot 2.x 从Spring Boot扩展到Spring相关知识的学习和实战 Spring Boot与其他技术框架的集成 Spring Boot部分功能源码解析

    0人学习 向明旺
    免费试看
nginx的日志不会自动切割,所以得借助第3方工具来进行切割
利用logrotate进行日志切割比利用crontab写脚本切割方便。
参考文档:http://blog.sina.com.cn/s/blog_5f54f0be0101h6y8.html
logrotate是作为linux系统日志的管理工具存在。他可以轮换,压缩,邮件系统日志文件。
它默认的配置文件在:
/etc/logrotate.conf
/etc/logrotate.d/


配置文件介绍:
========================
logrotate.conf 才主要的配置文件, logrotate.d 是一个目录, 该目录里的所有文件都会被主动的读入 /etc/logrotate.conf 中执行。
另外,如果 /etc/logrotate.d/ 里面的文件中没有设定一些细节,则会以 /etc/logrotate.conf 这个文件的设定来作为默认值。


切割介绍:
--------------------------
当第一次执行完 rotate 之后,原本的 messages 会变成 messages.1 而且会制造一个空的 messages 给系统来储存日志。而第二次执行之后, messages.1 会变成 messages.2 而 messages 会变成 messages.1 ,又造成一个空的 messages 来储存日志!如果我们仅设定保留三个日志而已的话,那么执行第四次时,则 messages.3 这个档案就会被删除,并由后面的较新的保存日志所取代!也就是会保存最新的几个日志。


当然,这个得根据配置文件中的 dateext 参数来判定:


先看 logrotate.conf 的内容:


vim /etc/logrotate.conf
# 底下的设定是 "logrotate 的默认值" ,如果別的文件设定了其他的值,
# 就会以其它文件的设定为主


weekly    <==默认一周执行一次 rotate 工作
rotate 4  <==保留多少个日志文件.默认保留四个.
create    <==创建新的文件.因为日志被改名,因此要创建一个新的来继续存储之前的日志
dateext   <==文件后缀是日期格式,也就是切割后文件是:xxx.log-20131216.gz 这样,如果注释掉,切割出来是按数字递增,即前面说的 xxx.log-1 这种格式
#compress <==是否压缩日志.


include /etc/logrotate.d
# 将 /etc/logrotate.d/ 目录中的所有文件都加载进来


/var/log/wtmp {       <==仅针对 /var/log/wtmp 所设定的参数
    monthly           <==每月一次切割,取代默认的一周
    minsize 1M        <==文件大小超过 1M 后才会切割
    create 0664 root utmp <==指定新建的日志文件权限以及所属用户和组
    rotate 1          <==只保留一个日志.
}
# 这个 wtmp 可记录用户登录系统及系统重启的时间
# 因为有 minsize 的参数,因此不见得每个月一定会执行一次喔.要看文件大小。


由这个文件的设定我们可以知道 /etc/logrotate.d 其实就是由 /etc/logrotate.conf 所规划出来的目录,虽然我们可以将所有的配置都给他写入 /etc/logrotate.conf ,但是这样一来这个文件就实在是太复杂了,尤其是当我们使用很多的服务在系统上面时, 每个服务都要去修改 /etc/logrotate.conf 的设定也似乎不太合理~ 
所以,如果独立出来一个目录,那么每个要切割日志的服务, 就可以独自成为一个文件,并且放置到 /etc/logrotate.d/ 当中


示例:
cd /etc/logrotate.d/ # 进入该目录
vim nginx # 通过vim新创建一个文件
文件内容:
/opt/modules/nginx/logs/*.log {
    daily
    dateext
    rotate 30
    compress
    create


    sharedscripts
    postrotate
        if [ -f /opt/modules/nginx/logs/nginx.pid ]; then
            kill -USR1 `cat /opt/modules/nginx/logs/nginx.pid`
        fi
    endscript
}
说明:
日志文件:
被处理的日志绝对路径.使用空格符分隔多个文件名;
执行脚本:
可调用外部指令来进行额外的命令,这个设定需与 sharedscripts .... endscript 设定合用才行。命令介绍:
prerotate:在启动 logrotate 之前进行的指令,例如修改文件的属性等动作;
postrotate:在做完 logrotate 之后启动的指令,例如重新启动 (kill -HUP) 某个服务!
prerotate 与 postrotate 对于已加上特殊属性的文件处理上面,是相当重要的执行程序!


查看效果:
/usr/sbin/logrotate -vf nginx
logrotate [-vf] logfile选项与参数:
v: 启动显示模式,会显示 logrotate 执行的过程
f: 不论是否符合配置文件地规则,强制每个日志都进行 rotate 的动作
2018-06-19 09:27:16 qq564425 阅读数 2088
  • 什么是日志切割

    从理论到实践,快速入门Spring Boot 2.x 从Spring Boot扩展到Spring相关知识的学习和实战 Spring Boot与其他技术框架的集成 Spring Boot部分功能源码解析

    0人学习 向明旺
    免费试看

有两篇文章可供参考:

随着项目的运行,Tomcat的日志文件catalina.out的大小日益增大,现在都有好几个GB了。如果我们不做任何处理,catalina.out的文件大小将会持续增加,直到把我们的系统硬盘空间给撑爆不可。

 

当Tomcat的日志文件catalina.out的大小大于2GB时,Tomcat程序崩溃时将有可能会启动失败并且不会有任何错误信息提示。为了避免该场景的出现,我们要定期轮转catalina.out日志文件。

 

这里小白使用CentOS6U5自带的logrotate程序来解决catalina.out的日志轮转问题。这种方式比较简单。在/etc/logrotate.d/目录下新建一个名为tomcat的文件,

1
2
3
4
5
6
7
8
9
10
cat >/etc/logrotate.d/tomcat <<EOF
/usr/local/apache-tomcat-8.0.28/logs/catalina.out{
    copytruncate
    daily
    rotate 7
    missingok
    compress
    size 16M
}
EOF

 

以上的配置说明:

1
2
3
4
5
6
7
8
/usr/local/apache-tomcat-8.0.28/logs/catalina.out{ # 要轮转的文件
    copytruncate # 创建新的catalina.out副本后,截断源catalina.out文件
    daily     # 每天进行catalina.out文件的轮转
    rotate 7   # 至多保留7个副本
    missingok   # 如果要轮转的文件丢失了,继续轮转而不报错
    compress   # 使用压缩的方式(非常有用,节省硬盘空间;一个2~3GB的日志文件可以压缩成60MB左右)
    size 16M   # 当catalina.out文件大于16MB时,就轮转
}

 

以上是如何工作的呢?

  1. 每天晚上crond守护进程会运行在/etc/cron.daily目录中的任务列表;

  2. 与logrotate相关的脚本也在/etc/cron.daily目录中。运行的方式为"/usr/bin/logrotate /etc/logrotate.conf";

  3. /etc/logrotate.conf文件include了/etc/logrotate.d/目录下的所有文件。还包括我们上面刚创建的tomcat文件;

  4. /etc/logrotate.d/tomcat文件会触发/usr/local/apache-tomcat-8.0.28/logs/catalina.out文件的轮转。

 

 

以上是程序自动完成的,不需要我们干预。当然了,我们也可以使用手工的方式进行logrotate程序。在命令行进行如下运行:

1
logrotate /etc/logrotate.conf

或者只轮转刚刚的tomcat配置文件,可以这样运行:

1
logrotate --force /etc/logrotate.d/tomcat

 

要想获得logrotate程序的更多帮助信息,可以查看其man page,

1
man logrotate

 

可以看一下catalina.out轮转前后的文件大小,

轮转之前:

1
2
3
4
du -sh *
...
2.0G    catalina.out # 未轮转之前的文件大小
...

 

轮转之后的文件大小:

1
2
3
# du -sh catalina.out*
2.0M    catalina.out
60M catalina.out.1.gz # 轮转之后,进行压缩,日志文件变得更小了

 

另外在Tomcat的logs目录,每天都会产生很多日志文件,我们也可以定期手工或使用定时任务来删除7天前的日志文件,这里使用手工的方式进行演示,

1
2
cd /usr/local/apache-tomcat-8.0.28/logs
find -mtime +7 -exec rm -f {} \;



第二篇:

1.下载logrotate

在Fedora和CentOS安装

yum install logrotate crontabs

Debian和Ubuntu上

apt-get install logrotate cron

2.创建日志文件在文件里面添加日志

vim /var/log/file.log

 3.创建file.log的配置文件添加

复制代码
vim /etc/logrotate.d/file

/vsr/log/file.log{
daily 日志文件按每个月轮循 daily 每天 weakly 每星期 yealy 每年
rotate 5 储存5个归档日志,对于第六个归档,时间最久的自动删除
compress 以归档的文件用gzip进行压缩
mail address 把转储的日志文件发送到指定的E-mail 地址
nocompress 不需要压缩时,用这个参数 
copytruncate 用于还在打开中的日志文件,把当前日志备份并截断 
nocopytruncate 备份日志文件但是不截断
create 644 root root 转储文件,使用指定的文件模式创建新的日志文件 
size 20M 指定文件当天达到20M的时候才转储
dateext 文件后加上当前日期
}
以上的参数可以根据自己的需求而添加
复制代码

4.手动切割日志

logrotate -vf  /etc/logrotate.d/file

 5.在/var/log/ 目录下你会看到分割的日志文件

6.还可以使用crontab定时写入数据到file.log  

首先检查crontab是否启动

检查crontab服务是否启动
service crond status
启动crontab服务
service crond start

7.使用命令 crontab -e 命令进入编辑模式定时写入数据到file.log

#cron 格式
   */1        *              *            *            *        echo"ni hao nihao" >>/var/log/file.log
#分钟(0~59)  小时(0~23)   几号(1~31)   几月(1~12)  星期几(0~7)      命令
#每行代表都代表一个任务
#上面代码意思是每分钟向文件file.log文件写入 nihao nihao

8.查看当前任务

crontab -l

9.查看定时任务的数据是否写入文件

tail -f  /var/log/file.log

logrotate定义了如何处理日志,而它本身则是被crond定时调用的。crond是一个Unix系操作系统中的定时调度软件,下面一段文字是从wiki上抄来的:

The software utility Cron is a time-based job scheduler in Unix-like computer operating systems. People who set up and maintain software environments use cron to schedule jobs (commands or shell scripts) to run periodically at fixed times, dates, or intervals. It typically automates system maintenance or administration—though its general-purpose nature makes it useful for things like connecting to the Internet and downloading email at regular intervals.

默认的logrotate是一天运行一次,它的脚本被放在/etc/cron.daily/下面。除了cron.daily外还有cron.weekly,cron.monthly,cron.hourly等分别对应不同的频率,你可以根据自己的需要把脚本放在不同的文件夹下面。在设置外所有东西以后,别忘了使用chkconfig crond on来保证它会一直开机运行。然后就大工告成了。


linux日志分割

阅读数 125