linux日志总结
字数 2175 2025-08-09 18:44:03
Linux日志系统全面指南
一、Linux日志系统概述
Linux系统拥有非常灵活和强大的日志功能,可以保存几乎所有的操作记录,并可以从中检索出需要的信息。Linux日志以明文形式存储,便于直接搜索和阅读,也可以编写脚本自动处理日志内容。
1. 日志文件存储位置
- 默认存放位置:
/var/log/ - 查看日志配置:
more /etc/rsyslog.conf
2. 主要日志文件及其功能
| 日志文件 | 功能描述 |
|---|---|
| /var/log/boot.log | 记录系统引导过程中发生的事件 |
| /var/log/syslog | 记录系统警告信息(RedHat默认不生成) |
| /var/log/cron | 记录crontab守护进程crond的动作 |
| /var/log/cups | 记录打印信息 |
| /var/log/dmesg | 记录内核自检信息(也可用dmesg命令查看) |
| /var/log/maillog | 记录电子邮件活动 |
| /var/log/message | 记录系统重要信息(系统问题首要检查) |
| /var/log/btmp | 记录错误登录(二进制,用lastb查看) |
| /var/log/lastlog | 记录最近成功/失败登录(二进制,用lastlog查看) |
| /var/log/wtmp | 永久记录用户登录/注销及系统启停(二进制,用last查看) |
| /var/log/utmp | 记录当前登录用户信息(二进制,用who/w/users查看) |
| /var/log/secure | 记录验证和授权信息(SSH、su、sudo等) |
| /var/log/xferlog | 记录FTP会话信息 |
| /var/log/kernlog | 记录内核消息(RedHat默认不生成) |
3. 关键用户登录日志文件
/var/log/wtmp、/var/run/utmp、/var/log/lastlog是日志子系统的关键文件- 都记录了用户登录情况,包含时间戳
- 二进制格式,需用特定命令查看
4. 相关查看命令
who:查询utmp文件,显示当前登录用户w:查询utmp文件,显示用户及运行进程users:显示当前登录用户last:搜索wtmp显示历史登录记录
5. 日志优先级级别
| 级别 | 英文 | 中文 | 说明 |
|---|---|---|---|
| 0 | EMERG | 紧急 | 系统不可用情况 |
| 1 | ALERT | 警告 | 必须立即解决的问题 |
| 2 | CRIT | 严重 | 严重情况,可能阻碍功能 |
| 3 | ERR | 错误 | 运行错误 |
| 4 | WARNING | 提醒 | 可能影响系统的重要事件 |
| 5 | NOTICE | 注意 | 不影响正常功能但需注意 |
| 6 | INFO | 信息 | 一般信息 |
| 7 | DEBUG | 调试 | 程序或系统调试信息 |
6. 重要日志及查看命令
- 登录失败记录:
/var/log/btmp→lastb - 最后一次登录:
/var/log/lastlog→lastlog - 登录成功记录:
/var/log/wtmp→last - 当前登录用户:
/var/run/utmp→w/who/users - 登录日志记录:
/var/log/secure - 历史命令记录:
history(清理当前用户:history -c)
二、日志分析常用命令
1. grep相关命令
grep -C 5 foo file # 显示匹配行及上下5行
grep -B 5 foo file # 显示匹配行及前5行
grep -A 5 foo file # 显示匹配行及后5行
grep -rn "string" * # 递归查找含字符串的文件
grep -R "string" * # 查找所有文件包含子目录
grep -i "string" # 忽略大小写
2. 显示文件特定行
cat file | tail -n +1000 | head -n 2000 # 显示1000-2999行
3. 系统完整性检查
rpm -Va > rpm.log # 检查所有rpm包是否被修改
输出格式说明:
- S:文件大小改变
- M:文件类型/权限改变
- 5:MD5校验改变
- D:设备代码改变
- L:文件路径改变
- U:文件属主改变
- G:文件属组改变
- T:文件修改时间改变
4. 查看开放端口
ss -tnlp
ss -tnlp | grep ssh
ss -tnlp | grep ":22"
netstat -tnlp
netstat -tnlp | grep ssh
5. 防火墙检查
firewall-cmd --state # 显示状态
firewall-cmd --get-zones # 列出zone
firewall-cmd --get-active-zones # 活动zone
firewall-cmd --get-default-zone # 默认zone
firewall-cmd --get-service # 支持的服务
firewall-cmd --zone=public --list-ports # 列出端口
firewall-cmd --zone=public --list-all # 列出所有设置
6. 用户检查
awk -F: '{if($3==0||$4==0)print $1}' /etc/passwd # 查看UID/GID为0的账号
awk -F: '{if($7!="/usr/sbin/nologin")print $1}' /etc/passwd # 查看可登录账号
lastlog # 所有用户最近登录信息
lastb # 错误登录列表
users # 当前登录用户
7. 计划任务和启动项
chkconfig --list | grep "3:启用\|3:开\|3:on\|5:启用\|5:开\|5:on" # 开机启动服务
ls /etc/init.d # 开机启动配置文件
cat /etc/rc.local # rc启动文件
ls /etc/rc.d/rc[0-6].d
runlevel # 运行级别
crontab -l # 计划任务列表
ls -alh /var/spool/cron # 用户crontab文件位置
ls -al /etc/cron* # 查看cron相关文件
cat /etc/cron* # 查看cron内容
cat /etc/at.allow # at允许用户
cat /etc/at.deny # at拒绝用户
cat /etc/cron.allow # cron允许用户
cat /etc/cron.deny # cron拒绝用户
cat /etc/crontab # 系统crontab
cat /etc/anacrontab # anacron配置
cat /var/spool/cron/crontabs/root # root用户的cron任务
8. 可疑文件检查
find / -ctime -2 # 查找72小时内新增文件
find ./ -mtime 0 -name "*.jsp" # 24小时内修改的JSP文件
find / *.jsp -perm 4777 # 查找777权限的文件
ls -a /tmp # 查看临时目录
strings /usr/sbin/sshd | egrep '[1-9]{1,3}\.[1-9]{1,3}\.' # 分析sshd是否包含IP
三、日志分析技巧
A. /var/log/secure(RedHat)或/var/log/auth.log(Debian)
- 定位爆破root的IP及次数:
# RedHat
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
# Debian
grep "Failed password for root" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | more
- 定位所有爆破IP:
grep "Failed password" /var/log/secure|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" |uniq -c |more
- 爆破用户名统计:
grep "Failed password" /var/log/secure|perl -e 'while(for(.*?) from/; print "$1\n";}' |uniq -c|sort -nr | more
- 爆破失败次数:
grep -o "Failed password" /var/log/secure|uniq -c
- 爆破失败用户名次数:
grep "Failed password" /var/log/secure | awk '{print $9}' | sort | uniq -c | sort -nr
- 爆破失败IP次数:
grep "Failed password for invalid user" /var/log/secure | awk '{print $13}' | sort | uniq -c | sort -nr | more
- 登录成功IP:
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
- 登录成功详情(日期、用户名、IP):
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'
grep "Accepted " /var/log/secure* | awk '{print $1,$2,$3,$9,$11}'
- 用户增删记录:
grep "useradd" /var/log/secure
grep "userdel" /var/log/secure
B. /var/log/yum.log
记录软件安装、升级、卸载日志:
yum install gcc
more /var/log/yum.log
四、日志管理工具
1. logrotate日志分割工具
logrotate用于分割日志文件,删除旧日志并创建新日志,节省磁盘空间。
配置文件
- 主配置文件:
/etc/logrotate.conf - 自定义配置目录:
/etc/logrotate.d/
常用参数
compress # 通过gzip压缩转储日志
nocompress # 不压缩
copytruncate # 先拷贝再清空(可能有数据丢失)
nocopytruncate # 备份但不截断
create mode owner group # 指定新文件属性
nocreate # 不建立新日志文件
delaycompress # 下次转储时才压缩
nodelaycompress # 转储同时压缩
missingok # 日志丢失不报错
errors address # 错误信息发送到指定邮箱
ifempty # 空文件也轮转(默认)
notifempty # 空文件不轮转
mail address # 发送日志到指定邮箱
nomail # 不发送邮件
olddir directory # 转储日志放入指定目录
noolddir # 转储日志与当前日志同目录
sharedscripts # 所有日志轮转后统一执行脚本
prerotate # 转储前执行指令
postrotate # 转储后执行指令
daily # 每天转储
weekly # 每周转储
monthly # 每月转储
rotate count # 保留日志数量
dateext # 使用日期作为后缀
dateformat .%s # 定义文件名格式
size log-size # 日志达到指定大小时转储
示例配置
- Nginx日志分割:
/Data/logs/nginx/*/*log {
daily
rotate 365
missingok
notifempty
compress
dateext
sharedscripts
postrotate
/etc/init.d/nginx reload
endscript
}
- 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
}
- Tomcat日志分割:
/Data/app/tomcat-7-huanqiu/logs/catalina.out {
rotate 14
daily
copytruncate
compress
notifempty
missingok
}
- 系统日志分割:
/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
}
2. logwatch日志分析工具
安装:
yum -y install logwatch
cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/logwatch.conf
默认配置:
LogDir = /var/log
TmpDir = /var/cache/logwatch
MailTo = root
MailFrom = Logwatch
Print =
Range = yesterday
Detail = Low
Service = All
Service = "-zz-network"
Service = "-zz-sys"
Service = "-eximstats"
五、日志清除方法
1. 清除历史命令
histroy -r # 删除当前会话历史
history -c # 删除内存中所有历史
rm .bash_history # 删除历史文件内容
HISTSIZE=0 # 设置历史命令条数为0
2. 完全删除日志文件
cat /dev/null > filename
> filename
echo "" > filename
echo > filename
3. 删除当天日志
sed -i '/当天日期/'d filename
4. 篡改日志
sed -i 's/原IP/新IP/g' 日志文件
5. 一键清除脚本
#!/usr/bin/bash
echo > /var/log/syslog
echo > /var/log/messages
echo > /var/log/httpd/access_log
echo > /var/log/httpd/error_log
echo > /var/log/xferlog
echo > /var/log/secure
echo > /var/log/auth.log
echo > /var/log/user.log
echo > /var/log/wtmp
echo > /var/log/lastlog
echo > /var/log/btmp
echo > /var/run/utmp
rm ~/./bash_history
history -c