首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >linux日志循环

linux日志循环

原创
作者头像
zero000
发布2019-04-29 18:39:13
4.1K0
发布2019-04-29 18:39:13
举报
文章被收录于专栏:程序员菜谱程序员菜谱

linux存在很好的日志机制,大到系统,小到应用都可以记录日志。

为什么需要日志循环

操作系统(Windows,Unix),应用一般都会记录日志,方便使用者常看系统或应用使用情况,或者排查故障。

单纯的记录日志不加干预,日志不断累积,时间长了,磁盘空间就被占满了。

所以,在linux中,日志一般会按一定的规则进行循环,保证日志量控制在一定的范围内。

日志循环的方法

日志循环的原理一般是:在特定的时间点,或日志达到一定大小,就触发循环脚本。

循环脚本通过新增新日志,备份老日志,调度应用重新加载配置(重新写日志)达到日志循环的目的。

日志循环的方法

1. 手工创建脚本实现

通过脚本执行的日志循环,常见的方法一般分为有损循环无损循环两种形式。

以nginx日志循环为例,nginx作为常用的代理转发服务器,每天承载上万级甚至百万级的量,正常情况下几天就可能把100G的磁盘打满。

据了解,nginx没有内置的日志循环配置(apache好像有)。

1.1 有损循坏

直接清理日志

cp /usr/local/nginx/logs/access.log /usr/local/nginx/logs/access_$(date -d '-1day' '+%Y-%m-%d').log
echo > /usr/local/nginx/logs/access.log

配合定时任务

0 0 * * * cp /usr/local/nginx/logs/access.log /usr/local/nginx/logs/access.log.1 && echo > /usr/local/nginx/logs/access.log

该方法通过cp+echo的方式到达日志循环的效果。

好处是:

  • 简单地把日志置空,可以达到快速清理日志的效果
  • 历史日志通过cp进行了备份
  • echo置空相比笨方法(停止nginx,rm日志,启动nginx)快很多,当日志到达GB级别,效果更明显,nginx也无需重启

坏处是:

  • 日志过大时,cp时间过长
  • 日志短时间需要占用size*2的磁盘容量

之所以称之为有损循环,是因为echo >命令执行时,nginx工作进程依然在打印日志,这时候会出现两种可能:

  1. 0时0分前几秒的日志被清除了,丢了部分日志;
  2. nginx工作进程无法写入日志,进程报错甚至挂掉。

因此,不推荐使用该方法

1.2 无损循环

crontab设置

crontab -e

0 0 * * * /data/op_shell/nginx_log_division.sh

nginx_log_division.sh

#!/bin/bash
#设置日志文件存放目录  
logs_path="/usr/local/nginx/logs/"  
#设置pid文件(也有可能在/var/run中)
pid_path="/usr/local/nginx/logs/nginx.pid"  
#日志文件
filepath=${logs_path}"access.log"  
#重命名日志文件  
mv ${logs_path}access.log ${logs_path}access_$(date -d '-1 day' '   +%Y-%m-%d'.log  
#向nginx主进程发信号重新打开日志  
kill -USR1 `cat ${pid_path}`  

该方法通过mv+kill的方式进行日志循环,因为linux中,日志打开底层原理是通过inode信息寻址找到对应的block进行内容读取,mv操作不改变文件的inode值。

首先日志mv重命名,期间nginx依然打印日志到重命名的文件中,通过kill向nginx master进程发送信号,nginx重新读取配置文件,触发新的access日志重新打印。


两种方法存在以下问题:

  1. 循环保存的日志,需要再通过crontab任务清理,例如只保留最新7天的日志;
  2. 日志如果按size循环,需要重新编写脚本。

2. logrotate循环

logrotate是一个日志循环的工具,linux内置的syslog也是使用它进行日志循环。

logrotate的配置存放于/etc/logrotate.d

[root@zero /etc/logrotate.d]# ll /etc/logrotate.d/
total 32
-rw-r--r-- 1 root root 289 Jun 22  2016 conman
-rw-r--r-- 1 root root 194 Jul 18  2016 httpd
-rw-r--r-- 1 root root 136 Jun 22  2016 iptraf-ng
-rw-r--r-- 1 root root 893 Aug 12  2016 mariadb
-rw-r--r-- 1 root root 140 Oct 23  2014 mgetty
-rw-r--r-- 1 root root 409 Jun 22  2016 psacct
-rw-r--r-- 1 root root 224 Nov  5  2016 syslog
-rw-r--r-- 1 root root 100 Oct 12  2017 yum

添加nginx配置

/data/log/nginx/*log {
    hourly
    rotate 5
    missingok
    notifempty
    nocompress
    sharedscripts
    postrotate
        [ -f /data/log/nginx/nginx.pid ] && kill -USR1 `cat /data/log/nginxnginx.pid`
    endscript
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么需要日志循环
  • 日志循环的方法
  • 日志循环的方法
    • 1. 手工创建脚本实现
      • 1.1 有损循坏
      • 1.2 无损循环
    • 2. logrotate循环
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档