FROM : http://www.2cto.com/os/201503/381812.html

在很多实际项目中,应用程序会持续写日志,如果程序代码中没有调用支持自动切分(如按filesize或date切割)的日志库,则日志文件会很快增长到G级别。单机操作大文件对后续跟进日志来说非常不方便。

本文介绍如何利用logrotate这个工具来在应用程序外部切分日志。

1. logrotate是什么
logrotate是大多数linux系统自带的日志切割工具,在shell终端输入"man logrotate"可查看其简介(部分摘出如下):
logrotate is designed to ease administration of systems that generate large numbers of log files. It allows automatic rotation, compression, removal, and mailing of log files.Each log file may be handled daily, weekly, monthly, or when it grows too large.
更完整的简介可以在shell终端查看其man文档,这里不赘述。
总之,我们知道它可以用来切割仍在滚动的日志文件即可,这里的“仍在滚动”是指当前日志文件仍在被应用程序持续进行追加写操作。

2. logrotate的适用场景
如果文件是静态的(即当前没有应用程序对齐进行写操作),则split是更常用的静态文件切割工具,其用法简介见这里,此处略过。
logrotate常用来切割仍在被写的“动态”文件,它支持按时间间隔或文件大小来触发文件的自动切分(automatic rotation)。具体用法下面说明。

3. 如何使用logrotate
根据man logrotate的说明,logrotate用法很简单:

1
logrotate [-dv] [-f|--force] [-s|--state file] config_file+

其中[]中出现的option(s)均是可选项,我们只需提供一份配置文件即可,下面用示例对配置文件格式做说明。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# sample logrotate configuration file
compress # 全局配置项,对切分后的文件做gzip压缩
       
# 一个配置文件中可以包含多个相互独立的sections
# 其中,待切分文件路径 + { xxx }构成了一个独立的section,每个section可以配置针对该类文件的切分行为
# 注意:全局配置项会作用于每个section,除非在该section配置中覆盖了全局配置项的行为
  
# 下面section的配置表明按时间间隔(weekly)触发日志的自动切分,历史数据只保存最近的5
# 切分完成后,通过发送-HUP信号来重启syslogd这个daemon进程。
/var/log/messages { 
    rotate 5 
    weekly
    postrotate
        /sbin/killall -HUP syslogd
    endscript
}
        
# 下面的示例section表明按文件大小触发日志自动切分,大小单位除了上面所示的k外,还可以是M或G
# 待切分文件路径可以有多个,多个路径用空格隔开
"/var/log/httpd/access.log" /var/log/httpd/error.log {
    rotate 5
    mail www@my.org
    size=100k
    sharedscripts # 表明HUP信号只需在所有文件均切分完成后发送一次,若无该配置,则每完成一个文件的切分就会执行一次postrotate/endscript之间配置的命令
    postrotate
        /sbin/killall -HUP httpd
    endscript
}
        
# 下面的示例section表明按时间(monthly)触发切分
# 切分后的历史文件会被保存到olddir指定的目录下(该目录需要事先mkdir出来,否则会报错)
/var/log/news/news.crit {
    monthly
    rotate 2
    olddir /var/log/news/old
    missingok # 若section起始处指定的待切分文件不存在,也不会报错(默认会报错)
    postrotate
        kill -HUP 'cat /var/run/inn.pid'
    endscript
    nocompress # 切分时不做压缩,这里改写了配置文件第1行的全局配置
}

上述配置文件中,"#"表示后面是注释,它可以独占一行,也可以与配置项在同一行。
配置项"rotate 5"表明切分后的历史文件最多保存最近的5份,若触发本次切分时已有5份历史文件(默认为messages.1/messages.2/messages.3/messages.4/messages.5),则文件messages.5会被物理删除,剩余文件后缀序号依次加1。
切分的具体执行过程可以参考《鸟哥的Linux私房菜》在这里的说明。
上面的示例配置文件只是展示了logrotate配置文件的基本格式,该工具还支持其它众多配置项,具体可以参考man logrotate的说明。
下面的配置文件说明了在实际项目中如何按文件大小对不允许restart的应用程序进行日志自动切分。

1
2
3
4
5
6
7
8
9
# filename: logrotate.conf
 /home/work/running.log {
    copytruncate # 先copy running.log内容至历史文件,然后清空running.log的内容
    rotate 30    # 保存30份历史日志
    size=1G      # 若日志文件达到1G,则触发切分
    olddir /home/work/history # 指定历史日志存放目录
    notifempty   # 若/home/work/running.log是空文件,则不做切分
    missingok    # 若/home/work/running.log不存在,不报错
}

特别注意copytruncate这个配置项,根据其文档说明(见下面的摘录),它可能会导致部分数据丢失,在不允许日志数据丢失的应用场景下,不应该使用该配置(若日志不允许丢失,则最好在应用程序代码中支持HUP信号来实现优雅重启,这样就可以避免使用copytruncate;当然,也可以用logrotate支持的create配置来达到目的)。
copytruncate
Truncate the original log file in place after creating a copy, instead of moving the old log file and optionally creating a new one, It can be used when some program can not be told to close its logfile and thus might continue writing (appending) to the previous log file forever. Note that there is a very small time slice between copying the file and truncating it, so some logging data might be lost. When this option is used, the create option will have no effect, as the old log file stays in place.=

【转】如何利用logrotate工具自动切分滚动中的日志文件的更多相关文章

  1. 利用logrotate工具对catalina.out进行日志分割实战

    logrotate是linux自带的日志分割工具,如果没有可以用yum安装 yum -y install logrotate 要配置日志分割定时任务,需要在/etc/logrotate.d/下创建一个 ...

  2. 利用logrotate切割nginx的access.log日志

    一.新建一个nginx的logrotate配置文件 /var/log/nginx/access.log { daily rotate compress delaycompress missingok ...

  3. Linux批量清空当前目录中的日志文件

    在Linux中,有时需要批量清空当前目录中的日志文件,同时还要保留日志文件. 其实一行shell命令就可以搞定,一起来看看吧. 在当前目录下,键入如下命令: for i in `find . -nam ...

  4. SQL Server 2008 R2 清空数据库中ldf日志文件

    /************************************************************ * Sql Server 2008 R2 清空数据库中ldf日志文件 * 将 ...

  5. 利用FlashPaper在web页面中显示PDF文件(兼容各浏览器)

    应项目需求要把PDF内嵌到网页中显示,其中有了很多办法,比如用<embed/>元素放入PDF文件,但是效果不理想,浏览器兼容不理想,在ie9/8(其他版本没有测试)显示会提示下载pdf文件 ...

  6. Linux中查看日志文件的正确姿势,求你别tail走天下了!

    作为一个后端开发工程师,在Linux中查看查看文件内容是基本操作了.尤其是通常要分析日志文件排查问题,那么我们应该如何正确打开日志文件呢?对于笔者这种小菜鸡来说,第一反应就是 cat,tail,vi( ...

  7. hadoop集群中的日志文件

    hadoop存在多种日志文件,其中master上的日志文件记录全面信息,包括slave上的jobtracker与datanode也会将错误信息写到master中.而slave中的日志主要记录完成的ta ...

  8. Log4j中配置日志文件相对路径

    方法一. 解决的办法自然是用相对路径代替绝对路径,其实log4j的FileAppender本身就有这样的机制,如:log4j.appender.logfile.File=${WORKDIR}/logs ...

  9. sqlserver中压缩日志文件

    最近在转移数据,sqlserver的日志文件ldf,占用空间特别大,为了还原库,节省空间,所以压缩日志文件迫在眉睫.在网上找了一段代码: USE [master] GO ALTER DATABASE ...

随机推荐

  1. IOS开发证书显示“此证书的签发者无效”解决方法

    今天早上同事说咱们的证书无法使用了,显示“此证书的签发者无效”.一开始以为谁误操作了证书,查看后发现所有证书都无效了.查了会才发下原来是Apple Worldwide Developer Relati ...

  2. 虚拟机安装 Centos6

    1 虚拟机安装 Centos6 1.1 前期配置 New Virtual Machine———Typical(典型安装) 选择镜像文件. 设置文件名,用户名和密码. 设置系统在虚拟机软件的名称, 设置 ...

  3. node.js使用汇总贴

    金天:学习一个新东西,就要持有拥抱的心态,如果固守在自己先前的概念体系,就会有举步维艰的感觉..NET程序员初用node.js最需要适应的就是异步开发,以及弱类型语言难以避免的拼写错误与弱小的语法提示 ...

  4. C#语句1:选择语句一(if else )

    语句是指程序命令,都是按照顺序执行的.语句在程序中的执行顺序称为“控制流”或“执行流”. 根据程序对运行时所收到的输入的响应,在程序每次运行时控制流可能有所不同. 注意,语句间的标点符号必须是英文标点 ...

  5. spring 依赖注入(IOC DI)

    依赖注入(IOC DI) 依赖注入的两种方式: 1. set注入 Spring要求使用set注入方式的时候,Bean需要提供一个无参数的构造方法.并提供一个属性的setter方法.例如: packag ...

  6. MySQL 调优基础(二) Linux内存管理

    进程的运行,必须使用内存.下图是Linux中进程中的内存的分布图: 其中最重要的 heap segment 和 stack segment.其它内存段基本是大小固定的.注意stack是向低地址增长的, ...

  7. mybatis oracle BLOB类型字段保存与读取

    一.BLOB字段 BLOB是指二进制大对象也就是英文Binary Large Object的所写,而CLOB是指大字符对象也就是英文Character Large Object的所写.其中BLOB是用 ...

  8. Javascript字数统计

    字数统计功能,原理是给textarea添加onKeyup事件,事件读取textarea内容并获得长度,并赋值给统计字数的那个文本节点,这里有一点要注意的是添加onKeypress和onKeydown事 ...

  9. 完整卸载 kubuntu-desktop from Ubuntu 14.04 LTS

    系统 ubuntu 14.04 LTS 64Bit 目的:卸载kubuntu-desktop 方法一: sudo apt-get remove libkde3support4 k3b-data ntr ...

  10. AngularJS服务

    在使用AngularJS的路由管理和控制视图加载的时候,当新的视图加载进来,原有视图的控制器会被销毁,这是出于内存占用和性能的考虑.服务提供了一种能在应用的整个生命周期内保持和共享数据的方法,它能够在 ...