Linux日志切割神器Logrotate

logrotate 程序是一个日志文件管理工具。用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到“转储”作用。可以节省磁盘空间。下面就对logrotate 日志轮转操作做一梳理记录。

为什么要切割日志文件?

  • 大文件被切割后,访问速度大大加快
  • 按天切割后,方便定位程序问题
  • 删除旧的日志文件(比如2个月之前的),可以节省磁盘空间

1、配置文件介绍

Linux系统默认安装logrotate工具,它默认的配置文件在:

logrotate --version

/etc/logrotate.conf
/etc/logrotate.d/

logrotate.conf 才主要的配置文件,logrotate.d 是一个目录,该目录里的所有文件都会被主动的读入/etc/logrotate.conf中执行。另外,如果/etc/logrotate.d/里面的文件中没有设定一些细节,则会以/etc/logrotate.conf这个文件的设定来作为默认值。Logrotate是基于CRON来运行的,其脚本是/etc/cron.daily/logrotate,日志轮转是系统自动完成的。实际运行时,Logrotate会调用配置文件/etc/logrotate.conf。可以在/etc/logrotate.d目录里放置自定义好的配置文件,用来覆盖Logrotate的缺省值。

[root@huanqiu_web1 ~]# cat /etc/cron.daily/logrotate
#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

2、切割介绍

比如以系统日志/var/log/message做切割来简单说明下: 

  • 第一次执行完rotate(轮转)之后,原本的messages会变成messages.1,而且会制造一个空的messages给系统来储存日志;
  • 第二次执行之后,messages.1会变成messages.2,而messages会变成messages.1,又造成一个空的messages来储存日志!

如果仅设定保留三个日志(即轮转3次)的话,那么执行第三次时,则 messages.3这个档案就会被删除,并由后面的较新的保存日志所取代!也就是会保存最新的几个日志。

日志究竟轮换几次,这个是根据配置文件中的dateext参数来判定的。

所以,如果独立出来一个目录,那么每个要切割日志的服务, 就可以独自成为一个文件,并且放置到/etc/logrotate.d/ 当中。

其他重要参数说明:

compress                            #通过gzip 压缩转储以后的日志
nocompress                          #不做gzip压缩处理
copytruncate                        #用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。
nocopytruncate                      #备份日志文件不过不截断
create mode owner group             #轮转时指定创建新文件的属性,如create 0777 nobody nobody
nocreate                            #不建立新的日志文件
delaycompress                      #和compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress                    #覆盖 delaycompress 选项,转储同时压缩。
missingok                          #如果日志丢失,不报错继续滚动下一个日志
errors address                     #专储时的错误信息发送到指定的Email 地址
ifempty                            #即使日志文件为空文件也做轮转,这个是logrotate的缺省选项。
notifempty                         #当日志文件为空时,不进行轮转
mail address                       #把转储的日志文件发送到指定的E-mail 地址
nomail                             #转储时不发送日志文件
olddir directory                   #转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir                           #转储后的日志文件和当前日志文件放在同一个目录下
sharedscripts                      #运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本
prerotate                          #在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行
postrotate                         #在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行
daily                              #指定转储周期为每天
weekly                             #指定转储周期为每周
monthly                            #指定转储周期为每月
rotate count                       #指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
dateext                            #使用当期日期作为命名格式
dateformat .%s                     #配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %s 这四个参数
size(或minsize) log-size           #当日志文件到达指定的大小时才转储,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem).
当日志文件 >= log-size 的时候就转储。 以下为合法格式:(其他格式的单位大小写没有试过)
size = 5 或 size 5 (>= 5 个字节就转储)
size = 100k 或 size 100k
size = 100M 或 size 100M

java程序日志切割实例

cat /etc/logrotate.d/java
/data/app/logs/*.log{
    create 0640 www-data www-data
    daily
    rotate 20
    copytruncate
    delaycompress
    compress
    notifempty
    missingok
}

nginx日志切割一例

[root@huanqiu_web1 ~]# cat /etc/logrotate.d/nginx
/var/log/nginx/*log
/data/logs/nginx/*/*log {
    daily
    rotate 365
    missingok
    notifempty
    compress
    dateext
    sharedscripts
    postrotate
    /etc/init.d/nginx reload
    endscript
}

[root@huanqiu_web1 ~]# ll /data/logs/nginx/www.huanqiu.com/
..........
-rw-r--r-- 1 root root      1652 Jan  1 00:00 error.log-20170101.gz
-rw-r--r-- 1 root root      1289 Jan  2 00:00 error.log-20170102.gz
-rw-r--r-- 1 root root      1633 Jan  3 00:00 error.log-20170103.gz
-rw-r--r-- 1 root root      3239 Jan  4 00:00 error.log-20170104.gz

手动强制切割

logrotate --force /etc/logrotate.d/*.log
logrotate --force /etc/logrotate.d/java

linux按时间查询日志

在系统应用集中部署的时候,很多日志因为太多难以定位,获取某段时间的日志是对运维人员非常关键的事情

cat | grep

grep 后面带上-A -B -C 参数可以多显示几行内容
grep -A 5 可以显示匹配内容以及后面的5行内容
grep -B 5 可以显示匹配内容以及前面的5行内容
grep -C 5 可以显示匹配内容以及前后面的5行内容

首先看一下日志的格式:
[2022-01-05 03:19:03] console.ERROR: Error thrown while running command

cat /var/log/size.txt | grep '[2022-01-05 03:19:03]' -C 5

sed 截选时间段日志

首先看一下日志的格式:

2010-11-17 09:25:55,606 [catalina-exec-74] INFO org.springframework.jdbc.datasource.JdbcTransactionObjectSupport  - JDBC 3.0 Savepoint class is available
2010-11-17 09:25:55,658 [catalina-exec-74] WARN org.hibernate.util.JDBCExceptionReporter  - SQL Error: 0, SQLState: null
2010-11-17 09:25:55,606 [catalina-exec-74] INFO org.springframework.jdbc.datasource.JdbcTransactionObjectSupport  - JDBC 3.0 Savepoint class is available2010-11-17 09:25:55,658 [catalina-exec-74] WARN org.hibernate.util.JDBCExceptionReporter  - SQL Error: 0, SQLState: null
……
ession for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Cannot open connection
at org.springframework.util.ReflectionUtils.handleReflectionException(ReflectionUtils.java:58)
at com.lottery.common.action.CommonAction.init(CommonAction.java:110)
2010-11-17 09:28:08,227 [main] INFO org.springframework.web.filter.CharacterEncodingFilter – Initializing filter ‘CharacterEncodingFilter

使用sed命令如下

#将11-17的09:25:55 和09:28:08 之间的日志截取出来
sed -n '/2010-11-17 09:25:55/,/2010-11-17 09:25:55/p' logfile
#正则表达式
sed -n '/2010-11-17 09:[0-9][0-9]:[0-9][0-9]/,/2010-11-17 16:[0-9][0-9]:[0-9][0-9]/p' logfile

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值