- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Linux中logrotate日志轮询操作总结由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
对于Linux系统安全来说,日志文件是极其重要的工具。不知为何,我发现很多运维同学的服务器上都运行着一些诸如每天切分Nginx日志之类的CRON脚本,大家似乎遗忘了Logrotate,争相发明自己的轮子,这真是让人沮丧啊!就好比明明身边躺着现成的性感美女,大家却忙着自娱自乐,罪过!logrotate程序是一个日志文件管理工具。用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到“转储”作用。可以节省磁盘空间.
下面就对logrotate日志轮转操作做一梳理记录:
1)配置文件介绍 。
Linux系统默认安装logrotate工具,它默认的配置文件在:
/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的缺省值.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
[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
|
如果等不及cron自动执行日志轮转,想手动强制切割日志,需要加-f参数;不过正式执行前最好通过Debug选项来验证一下(-d参数),这对调试也很重要 。
1
2
|
# /usr/sbin/logrotate -f /etc/logrotate.d/nginx
# /usr/sbin/logrotate -d -f /etc/logrotate.d/nginx
|
logrotate命令格式:
根据日志切割设置进行操作,并显示详细信息 。
1
2
|
[root@huanqiu_web1 ~]
# /usr/sbin/logrotate -v /etc/logrotate.conf
[root@huanqiu_web1 ~]
# /usr/sbin/logrotate -v /etc/logrotate.d/php
|
根据日志切割设置进行执行,并显示详细信息,但是不进行具体操作,debug模式 。
1
2
|
[root@huanqiu_web1 ~]
# /usr/sbin/logrotate -d /etc/logrotate.conf
[root@huanqiu_web1 ~]
# /usr/sbin/logrotate -d /etc/logrotate.d/nginx
|
查看各log文件的具体执行情况 。
1
|
[root@fangfull_web1 ~]
# cat /var/lib/logrotate.status
|
2)切割介绍 。
比如以系统日志/var/log/message做切割来简单说明下:
第一次执行完rotate(轮转)之后,原本的messages会变成messages.1,而且会制造一个空的messages给系统来储存日志; 。
第二次执行之后,messages.1会变成messages.2,而messages会变成messages.1,又造成一个空的messages来储存日志! 。
如果仅设定保留三个日志(即轮转3次)的话,那么执行第三次时,则 messages.3这个档案就会被删除,并由后面的较新的保存日志所取代!也就是会保存最新的几个日志.
日志究竟轮换几次,这个是根据配置文件中的dateext 参数来判定的.
看下logrotate.conf配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# cat /etc/logrotate.conf
# 底下的设定是 "logrotate 的默认值" ,如果別的文件设定了其他的值,
# 就会以其它文件的设定为主
weekly //默认每一周执行一次rotate轮转工作
rotate 4 //保留多少个日志文件(轮转几次).默认保留四个.就是指定日志文件删除之前轮转的次数,0 指没有备份
create //自动创建新的日志文件,新的日志文件具有和原来的文件相同的权限;因为日志被改名,因此要创建一个新的来继续存储之前的日志
dateext //这个参数很重要!就是切割后的日志文件以当前日期为格式结尾,如xxx.log-20131216这样,如果注释掉,切割出来是按数字递增,即前面说的 xxx.log-1这种格式
compress //是否通过gzip压缩转储以后的日志文件,如xxx.log-20131216.gz ;如果不需要压缩,注释掉就行
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/ 当中 。
其他重要参数说明 。
--------------------------------------------------------------------------------------------------------- 。
小示例:下面一个切割nginx日志的配置 。
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
|
[root@master-server ~]
# vim /etc/logrotate.d/nginx
/usr/local/nginx/logs/
*.log {
daily
rotate 7
missingok
notifempty
dateext
sharedscripts
postrotate
if
[ -f
/usr/local/nginx/logs/nginx
.pid ];
then
kill
-USR1 `
cat
/usr/local/nginx/logs/nginx
.pid`
fi
endscript
}
|
--------------------------------------------------分享一例曾经使用过的nginx日志切割处理脚本----------------------------------------------- 。
1)logrotate日志分割配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
[root@bastion-IDC ~
# vim /etc/logrotate.d/nginx
/data/nginx_logs/
*.access_log
{
nocompress
daily
copytruncate
create
ifempty
olddir
/data/nginx_logs/days
rotate 0
}
|
2)日志分割脚本 。
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
42
43
44
45
|
[root@bastion-IDC ~
# vim /usr/local/sbin/logrotate-nginx.sh
#!/bin/bash
#创建转储日志压缩存放目录
mkdir
-p
/data/nginx_logs/days
#手工对nginx日志进行切割转换
/usr/sbin/logrotate
-vf
/etc/logrotate
.d
/nginx
#当前时间
time
=$(
date
-d
"yesterday"
+
"%Y-%m-%d"
)
#进入转储日志存放目录
cd
/data/nginx_logs/days
#对目录中的转储日志文件的文件名进行统一转换
for
i
in
$(
ls
./ |
grep
"^\(.*\)\.[[:digit:]]$"
)
do
mv
${i} ./$(
echo
${i}|
sed
-n
's/^\(.*\)\.\([[:digit:]]\)$/\1/p'
)-$(
echo
$
time
)
done
#对转储的日志文件进行压缩存放,并删除原有转储的日志文件,只保存压缩后的日志文件。以节约存储空间
for
i
in
$(
ls
./ |
grep
"^\(.*\)\-\([[:digit:]-]\+\)$"
)
do
tar
jcvf ${i}.bz2 ./${i}
rm
-rf ./${i}
done
#只保留最近7天的压缩转储日志文件
find
/data/nginx_logs/days/
* -name
"*.bz2"
-mtime 7 -
type
f -
exec
rm
-rf {} \;
|
3)crontab定时执行 。
1
2
3
4
5
|
[root@bastion-IDC ~
# crontab -e
#logrotate
0 0 * * *
/bin/bash
-x
/usr/local/sbin/logrotate-nginx
.sh >
/dev/null
2>&1
|
手动执行脚本,测试下看看:
1
2
3
4
5
6
7
|
[root@bastion-IDC ~
# /bin/bash -x /usr/local/sbin/logrotate-nginx.sh
[root@bastion-IDC ~
# cd /data/nginx_logs/days
[root@bastion-IDC days
# ls
huantest.access_log-2017-01-18.bz2
|
----------------------------------php脚本切割一例---------------------------------- 。
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
[root@huanqiu_web1 ~]
# cat /etc/logrotate.d/php
/Data/logs/php/
*log {
daily
rotate 365
missingok
notifempty
compress
dateext
sharedscripts
postrotate
if
[ -f
/Data/app/php5
.6.26
/var/run/php-fpm
.pid ];
then
kill
-USR1 `
cat
/Data/app/php5
.6.26
/var/run/php-fpm
.pid`
fi
endscript
postrotate
/bin/chmod
644
/Data/logs/php/
*gz
endscript
}
[root@huanqiu_web1 ~]
# ll /Data/app/php5.6.26/var/run/php-fpm.pid
-rw-r--r-- 1 root root 4 Dec 28 17:03
/Data/app/php5
.6.26
/var/run/php-fpm
.pid
[root@huanqiu_web1 ~]
# cd /Data/logs/php
[root@huanqiu_web1 php]
# ll
total 25676
-rw-r--r-- 1 root root 0 Jun 1 2016 error.log
-rw-r--r-- 1 nobody nobody 182 Aug 30 2015 error.log-20150830.gz
-rw-r--r-- 1 nobody nobody 371 Sep 1 2015 error.log-20150901.gz
-rw-r--r-- 1 nobody nobody 315 Sep 7 2015 error.log-20150907.gz
.........
.........
|
----------------------------------nginx日志切割一例----------------------------------- 。
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
|
[root@huanqiu_web1 ~]
# cat /etc/logrotate.d/nginx
/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
|
----------------------------------系统日志切割一例----------------------------------- 。
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
[root@huanqiu_web1 ~]
# cat /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
sharedscripts
postrotate
/bin/kill
-HUP `
cat
/var/run/syslogd
.pid 2>
/dev/null
` 2>
/dev/null
||
true
endscript
}
[root@huanqiu_web1 ~]
# ll /var/log/messages*
-rw------- 1 root root 34248975 Jan 19 18:42
/var/log/messages
-rw------- 1 root root 51772994 Dec 25 03:11
/var/log/messages-20161225
-rw------- 1 root root 51800210 Jan 1 03:05
/var/log/messages-20170101
-rw------- 1 root root 51981366 Jan 8 03:36
/var/log/messages-20170108
-rw------- 1 root root 51843025 Jan 15 03:40
/var/log/messages-20170115
[root@huanqiu_web1 ~]
# ll /var/log/cron*
-rw------- 1 root root 2155681 Jan 19 18:43
/var/log/cron
-rw------- 1 root root 2932618 Dec 25 03:11
/var/log/cron-20161225
-rw------- 1 root root 2939305 Jan 1 03:06
/var/log/cron-20170101
-rw------- 1 root root 2951820 Jan 8 03:37
/var/log/cron-20170108
-rw------- 1 root root 3203992 Jan 15 03:41
/var/log/cron-20170115
[root@huanqiu_web1 ~]
# ll /var/log/secure*
-rw------- 1 root root 275343 Jan 19 18:36
/var/log/secure
-rw------- 1 root root 2111936 Dec 25 03:06
/var/log/secure-20161225
-rw------- 1 root root 2772744 Jan 1 02:57
/var/log/secure-20170101
-rw------- 1 root root 1115543 Jan 8 03:26
/var/log/secure-20170108
-rw------- 1 root root 731599 Jan 15 03:40
/var/log/secure-20170115
[root@huanqiu_web1 ~]
# ll /var/log/spooler*
-rw------- 1 root root 0 Jan 15 03:41
/var/log/spooler
-rw------- 1 root root 0 Dec 18 03:21
/var/log/spooler-20161225
-rw------- 1 root root 0 Dec 25 03:11
/var/log/spooler-20170101
-rw------- 1 root root 0 Jan 1 03:06
/var/log/spooler-20170108
-rw------- 1 root root 0 Jan 8 03:37
/var/log/spooler-20170115
|
----------------------------------tomcat日志切割一例----------------------------------- 。
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
|
[root@huanqiu-backup ~]
# cat /etc/logrotate.d/tomcat
/Data/app/tomcat-7-huanqiu/logs/catalina
.out {
rotate 14
daily
copytruncate
compress
notifempty
missingok
}
[root@huanqiu-backup ~]
# ll /Data/app/tomcat-7-huanqiu/logs/catalina.*
-rw-r--r--. 1 root root 0 Jan 19 19:11
/Data/app/tomcat-7-huanqiu/logs/catalina
.out
-rw-r--r--. 1 root root 95668 Jan 19 19:11
/Data/app/tomcat-7-huanqiu/logs/catalina
.out.1.gz
|
---------------------------------早期用过的nginx日志处理一例---------------------------------- 。
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
|
[root@letv-backup ~]
# vim /letv/sh/cut_nginx_log.sh
#!/bin/bash
# 你的日志文件存放目录
logs_path=
"/letv/logs/"
# 日志文件的名字,多个需要空格隔开
logs_names=(error access pv_access)
dates=`
date
-d
"yesterday"
+
"%Y%m%d"
`
mkdir
-p ${logs_path}$dates/
num=${
#logs_names[@]}
for
((i=0;i<num;i++));
do
mv
${logs_path}${logs_names[i]}.log ${logs_path}$dates/${logs_names[i]}.log
done
#nginx平滑重启
kill
-USR1 `
cat
/letv/logs/nginx/nginx
.pid`
结合
crontab
定时执行
[root@letv-backup ~]
# crontab -e
#nginx日志切割
00 00 * * *
cd
/letv/logs
;
/bin/bash
/letv/sh/cut_nginx_log
.sh >
/dev/null
2>$1
|
3)尝试解决logrotate无法自动轮询日志的办法 。
现象说明:
使用logrotate轮询nginx日志,配置好之后,发现nginx日志连续两天没被切割,这是为什么呢??
然后开始检查日志切割的配置文件是否有问题,检查后确定配置文件一切正常.
于是怀疑是logrotate预定的cron没执行,查看了cron的日志,发现有一条Dec 7 04:02:01 www crond[18959]: (root) CMD (run-parts /etc/cron.daily)这样的日志,证明cron在04:02分时已经执行/etc/cron.daily目录下的程序.
接着查看/etc /cron.daily/logrotate(这是logrotate自动轮转的脚本)的内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
[root@huanqiu_test ~]
# 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
|
没有发现异常,配置好的日志轮转操作都是由这个脚本完成的,一切运行正常,脚本应该就没问题.
直接执行命令:
1
|
[root@huanqiu_test ~]
# /usr/sbin/logrotate /etc/logrotate.conf
|
这些系统日志是正常轮询了,但nginx日志却还是没轮询 。
接着强行启动记录文件维护操作,纵使logrotate指令认为没有需要,应该有可能是logroate认为nginx日志太小,不进行轮询.
故需要强制轮询,即在/etc/cron.daily/logrotate脚本中将 -t 参数替换成 -f 参数 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
[root@huanqiu_test ~]
# 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
-f logrotate
"ALERT exited abnormally with [$EXITVALUE]"
fi
exit
0
|
最后最后重启下cron服务:
1
2
3
|
[root@huanqiu_test ~]
# /etc/init.d/crond restart
Stopping crond: [ OK ]
Starting crond: [ OK ]
|
总结 。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我的支持.
原文链接:http://www.cnblogs.com/kevingrace/p/6307298.html 。
最后此篇关于Linux中logrotate日志轮询操作总结的文章就讲到这里了,如果你想了解更多关于Linux中logrotate日志轮询操作总结的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
Linux 管道可以缓冲多少数据?这是可配置的吗? 如果管道的两端在同一个进程中,但线程不同,这会有什么不同吗? 请注意:这个“同一个进程,两个线程”的问题是理论上的边栏,真正的问题是关于缓冲的。 最
我找到了here [最后一页] 一种有趣的通过 Linux 启动 Linux 的方法。不幸的是,它只是被提及,我在网上找不到任何有用的链接。那么有人听说过一种避免引导加载程序而使用 Linux 的方法
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我试图了解 ld-linux.so 如何在 Linux 上解析对版本化符号的引用。我有以下文件: 测试.c: void f(); int main() { f(); } a.c 和 b.c:
与 RetroPie 的工作原理类似,我可以使用 Linux 应用程序作为我的桌面环境吗?我实际上并不需要像实际桌面和安装应用程序这样的东西。我只需要一种干净简单的方法来在 RaspberryPi 上
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
有什么方法可以覆盖现有的源代码,我应该用 PyQt、PyGTK、Java 等从头开始构建吗? 最佳答案 如果您指的是软件本身而不是它所连接的存储库,那么自定义应用程序的方法就是 fork 项目。据我所
我的情况是:我在一个磁盘上安装了两个 linux。我将第一个安装在/dev/sda1 中,然后在/dev/sda2 中安装第二个然后我运行第一个系统,我写了一个脚本来在第一个系统运行时更新它。
我在 i2c-0 总线上使用地址为 0x3f 的系统监视器设备。该设备在设备树中配置有 pmbus 驱动程序。 问题是,加载 linux 内核时,这个“Sysmon”设备没有供电。因此,当我在总线 0
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
我正试图在 linux 模块中分配一大块内存,而 kalloc 做不到。 我知道唯一的方法是使用 alloc_bootmem(unsigned long size) 但我只能从 linux 内核而不是
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我有 .sh 文件来运行应用程序。在该文件中,我想动态设置服务器名称,而不是每次都配置。 我尝试了以下方法,它在 CentOS 中运行良好。 nohup /voip/java/jdk1.8.0_71/
我是在 Linux 上开发嵌入式 C++ 程序的新手。我有我的 Debian 操作系统,我在其中开发和编译了我的 C++ 项目(一个简单的控制台进程)。 我想将我的应用程序放到另一个 Debian 操
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
我使用4.19.78版本的稳定内核,我想找到带有企鹅二进制数据的C数组。系统启动时显示。我需要在哪里搜索该内容? 我在 include/linux/linux_logo.h 文件中只找到了一些 Log
我知道可以使用 gdb 的服务器模式远程调试代码,我知道可以调试针对另一种架构交叉编译的代码,但是是否可以更进一步,从远程调试 Linux 应用程序OS X 使用 gdbserver? 最佳答案 当然
是否有任何可能的方法来运行在另一个 Linux 上编译的二进制文件?我知道当然最简单的是在另一台机器上重建它,但假设我们唯一能得到的是一个二进制文件,那么这可能与否? (我知道这可能并不容易,但我只是
我是一名优秀的程序员,十分优秀!