logrotate
logrotate是个十分有用的工具,它可以自动对日志进行截断(或轮循),压缩以及删除旧的日志文件.
仔细观察log文件,会发现有许多*.log
,*.log.1
等.这其实就是logrotate的轮循,它的运行流程如下:1
2
3
4
5第一次:log -> log.1
第二次:log(新的log) -> log.1(第一次的log) -> log.2(第一次的log.1)
第三次:log -> log.1 -> log.2 -> log.3
第四次:log -> log.1 -> log.2 -> log.3 -> log.4
第五次:log -> log.1 -> log.2 -> log.3 -> log.4(第四次的log.4被删除,因为默认是4循环,即保留四个日志)
配置
配置文件在/etc/logrotate.conf
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# see "man logrotate" for details
# rotate log files weekly
weekly #默认每个礼拜对登录文件进行一次 rotate 的工作
# use the syslog group by default, since this is the owning group
# of /var/log/syslog.
su root syslog
# keep 4 weeks worth of backlogs
rotate 4 #保留几个登录文件
# create new (empty) log files after rotating old ones
create #由於登录文件被更名,因此创建一个新的来继续储存之意
# uncomment this if you want your log files compressed
#compress #被更动的登录文件是否需要压缩?如果登录文件太大则可考虑此参数启动
# packages drop log rotation information into this directory
include /etc/logrotate.d #将 /etc/logrotate.d/ 这个目录中的所有文件都读进来运行 rotate 的工作!
# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp { #仅针对 /var/log/wtmp 所配置的参数
missingok #如果日志文件丢失,不要显示错误
monthly
create 0664 root utmp #指定新建文件的权限与所属帐号/群组
其他参数:1
2
3
4
5
6
7
8
9
10
11
12
13compress --> 压缩日志文件的所有非当前版本
daily,weekly,monthly --> 按指定计划轮换日志文件
delaycompress --> 压缩所有版本,除了当前和下一个最近的
endscript --> 标记 prerotate 或 postrotate 脚本的结束
errors "emailid" --> 给指定邮箱发送错误通知
missingok --> 如果日志文件丢失,不要显示错误
notifempty --> 如果日志文件为空,则不轮换日志文件
olddir "dir" --> 指定日志文件的旧版本放在 “dir” 中
postrotate --> 引入一个在日志被轮换后执行的脚本
prerotate --> 引入一个在日志被轮换前执行的脚本
rotate 'n' --> 在轮换方案中包含日志的 n 个版本
sharedscripts --> 对于整个日志组只运行一次脚本
size='logsize' --> 在日志大小大于 logsize(例如 100K,4M)时轮换
grep
grep是一个最初用于Unix操作系统的命令行工具.在给出文件列表或标准输入后,grep会对匹配一个或多个正则表达式的文本进行搜索,并只输出匹配(或者不匹配)的行或文本.
输出所有ssh连接失败的记录:1
grep "Failed password for root" /var/log/secure
awk
awk是一种处理文本文件的语言,是一个强大的文本分析工具.
awk是以列为划分计数的,$0表示所有列,$1表示第一列,$2表示第二列.
输出列
1
awk '{print $1,$4}' log.txt
指定变量
1
awk -va=1 '{print $1,$1+a}' log.txt
指定脚本
1
awk -f cal.awk log.txt
使用正则
1
awk '/re/ ' log.txt #输出包含re的行
例子
找出ssh攻击者
先筛选登陆失败的ip排序后去重计数再排序.1
2
3
4
5grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
998 47.101.42.58
12 41.232.216.155
5 47.101.155.144
sort -n:以数字大小排序
sort -r:以相反顺序排序
uniq -c:去重并计数