Linux系统日志是排查故障、监控系统状态、审计安全事件的核心依据------无论是服务器宕机、应用报错,还是黑客暴力破解,都会在日志中留下痕迹。本文从"日志基础认知→本地日志管理→日志轮转→集中收集分析→安全审计"逐步拆解,结合企业级运维实战,提供可直接复用的命令和配置,覆盖搜索引擎高频检索需求(如Linux日志查看命令、logrotate配置、ELK日志收集、/var/log日志解读),适合运维新手和进阶用户系统掌握。
一、Linux日志基础:先搞懂"日志存在哪里、记录了什么"
1. 核心日志目录与文件
Linux系统日志默认集中在 /var/log/ 目录下,核心文件对应不同功能,记住这几个就能解决80%的日常问题:
| 日志文件路径 | 核心作用 | 高频使用场景 |
|---|---|---|
/var/log/messages |
系统全局日志(内核、服务、硬件) | 系统宕机、硬件故障、服务启动失败 |
/var/log/secure |
安全日志(SSH登录、用户认证、sudo操作) | 暴力破解、非法登录排查 |
/var/log/nginx/access.log |
Nginx访问日志(请求IP、URL、状态码) | 网站访问统计、404/500错误排查 |
/var/log/nginx/error.log |
Nginx错误日志(配置错误、连接超时) | Nginx启动失败、访问报错 |
/var/log/mysql/error.log |
MySQL错误日志(启动失败、SQL执行错误) | 数据库无法启动、慢查询关联 |
/var/log/boot.log |
系统启动日志(开机自启服务、硬件初始化) | 开机黑屏、服务自启失败 |
/var/log/cron |
定时任务(crontab)日志 | 定时脚本执行失败排查 |
2. 日志的基本格式(以secure为例)
日志条目通常包含"时间戳、主机名、进程名、事件详情",看懂格式能快速提取关键信息:
csharp
Mar 15 08:30:45 localhost sshd[12345]: Accepted publickey for root from 192.168.1.100 port 54321 ssh2: RSA SHA256:xxxx
- 时间戳:
Mar 15 08:30:45(事件发生时间); - 主机名:
localhost(日志所在服务器名称); - 进程名:
sshd[12345](产生日志的进程,12345是PID); - 事件详情:
Accepted publickey...(SSH公钥登录成功)。
二、本地日志查看:高效检索关键信息
日常排查问题时,需快速从海量日志中筛选有用信息,掌握这几个命令组合能大幅提升效率。
1. 基础查看命令(cat/tail/head)
bash
# 查看完整日志文件(适合小日志)
cat /var/log/secure
# 查看日志最后10行(实时故障排查常用)
tail -n 10 /var/log/messages
# 实时跟踪日志(类似"直播",适合看动态产生的日志)
tail -f /var/log/nginx/access.log # -f:实时刷新
tail -F /var/log/nginx/error.log # -F:日志轮转后自动续追
# 查看日志前20行(适合看启动日志开头的错误)
head -n 20 /var/log/boot.log
2. 高级筛选命令(grep/awk/sed)
(1)按关键词筛选(grep)
bash
# 搜索secure日志中"登录失败"的记录(忽略大小写)
grep -i "failed password" /var/log/secure
# 搜索nginx访问日志中"404错误"的记录,并显示行号
grep -n " 404 " /var/log/nginx/access.log
# 搜索messages日志中"内存溢出(OOM)"的记录,且显示前后5行上下文
grep -C 5 "out of memory" /var/log/messages
# 排除指定关键词(如排除grep自身进程的日志)
ps aux | grep nginx | grep -v grep
(2)按时间筛选(结合grep/awk)
bash
# 筛选3月15日的secure日志(按日期关键词)
grep "Mar 15" /var/log/secure
# 筛选3月15日08:00-09:00之间的nginx访问日志(awk按时间字段匹配)
awk '$4 ~ /\[15\/Mar\/2024:08:/' /var/log/nginx/access.log
# 说明:nginx日志的第4字段是时间(格式:[15/Mar/2024:08:30:45])
(3)提取关键字段(awk)
比如从nginx访问日志中提取"访问IP、请求URL、状态码",便于统计:
bash
# nginx访问日志格式(默认):$1=IP,$7=URL,$9=状态码
awk '{print "IP:"$1, "URL:"$7, "状态码:"$9}' /var/log/nginx/access.log
# 统计访问量最高的前10个IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
3. 日志内容格式化查看(less/more)
处理大日志文件时,用less分页查看,支持搜索、翻页:
bash
# 分页查看大日志(按空格键翻页,按/输入关键词搜索,按q退出)
less /var/log/messages
# 查看日志时实时筛选关键词(进入less后输入)
/error # 搜索包含error的行
三、日志轮转:防止日志占满磁盘(logrotate实战)
日志会持续增长,若不处理会占满磁盘(尤其是Web服务器的访问日志),logrotate 是Linux内置的日志轮转工具,能自动切割、压缩、删除旧日志。
1. logrotate核心原理
- 切割:将大日志按"时间/大小"拆分成多个小文件(如每天生成一个nginx日志);
- 压缩:对旧日志进行gzip压缩,节省磁盘空间;
- 删除:自动删除超过保留期限的日志(如保留7天);
- 触发:默认每天由crond服务执行(
/etc/cron.daily/logrotate)。
2. 全局配置(/etc/logrotate.conf)
全局配置定义默认规则,所有日志的轮转都会继承这些配置:
bash
vi /etc/logrotate.conf
# 核心默认配置(无需修改,了解即可)
weekly # 轮转周期(weekly:每周;daily:每天;monthly:每月)
rotate 4 # 保留4个轮转文件(超过则删除)
create # 切割后创建新的空日志文件
dateext # 日志文件名添加日期后缀(如access.log-20240315)
compress # 压缩旧日志(gzip格式)
include /etc/logrotate.d # 加载应用自定义的轮转配置(重点)
3. 应用自定义轮转配置(以Nginx为例)
不同应用的日志路径、轮转需求不同,需在 /etc/logrotate.d/ 目录下创建自定义配置文件:
bash
# 创建Nginx日志轮转配置
vi /etc/logrotate.d/nginx
# 添加以下配置(逐行解读)
/var/log/nginx/*.log { # 要轮转的日志文件(所有nginx日志)
daily # 每天轮转一次(Web日志增长快,推荐daily)
rotate 7 # 保留7天的日志(7天后自动删除)
missingok # 若日志文件不存在,不报错(避免误删后报错)
notifempty # 日志为空时,不执行轮转(节省磁盘)
compress # 压缩旧日志(如access.log-20240315.gz)
delaycompress # 延迟压缩(下次轮转时再压缩上次的日志,便于临时查看)
sharedscripts # 所有日志切割完成后,只执行一次后续脚本(避免重复操作)
postrotate # 轮转后执行的命令(关键:让Nginx重新写入新日志)
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid` # 向Nginx发送信号,重新打开日志
fi
endscript
}
4. 测试与手动执行
bash
# 调试模式:模拟轮转,不实际执行(无报错则配置正常)
logrotate -d /etc/logrotate.d/nginx
# 强制执行轮转(无需等待crond,手动触发)
logrotate -f /etc/logrotate.d/nginx
# 查看轮转结果(生成带日期后缀的压缩文件)
ls -l /var/log/nginx/
# 输出示例:access.log access.log-20240315.gz error.log error.log-20240315.gz
四、日志集中管理:ELK Stack实战(企业级必备)
单台服务器日志查看方便,但多台服务器(如100台Web服务器)分散查看效率极低,企业级环境常用 ELK Stack(Elasticsearch+Logstash+Kibana)集中收集、存储、分析日志,此处提供轻量版部署方案(Filebeat替代Logstash,更省资源)。
1. ELK核心组件作用
- Filebeat:部署在每台服务器上,采集本地日志并发送到Elasticsearch;
- Elasticsearch:存储日志数据,提供高效检索功能;
- Kibana:可视化界面,通过图表、筛选条件快速分析日志。
2. 部署步骤(CentOS 7+)
(1)安装Elasticsearch(日志存储)
bash
# 1. 安装Java(Elasticsearch依赖Java)
yum install -y java-1.8.0-openjdk-devel
# 2. 配置Elasticsearch yum源
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
cat > /etc/yum.repos.d/elastic.repo << EOF
[elastic-7.x]
name=Elastic repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
EOF
# 3. 安装并启动Elasticsearch
yum install -y elasticsearch
systemctl start elasticsearch
systemctl enable elasticsearch
# 4. 验证(默认端口9200)
curl http://localhost:9200
# 输出包含"name":"xxx","cluster_name":"elasticsearch"即正常
(2)安装Kibana(日志可视化)
bash
# 1. 安装Kibana
yum install -y kibana
# 2. 配置Kibana(允许外部访问)
vi /etc/kibana/kibana.yml
server.host: "0.0.0.0" # 监听所有网卡
elasticsearch.hosts: ["http://localhost:9200"] # 连接本地Elasticsearch
# 3. 启动Kibana
systemctl start kibana
systemctl enable kibana
# 4. 验证(默认端口5601)
# 浏览器访问:http://服务器IP:5601,能打开Kibana界面即正常
(3)安装Filebeat(日志采集)
在需要采集日志的服务器上安装Filebeat:
bash
# 1. 安装Filebeat
yum install -y filebeat
# 2. 配置Filebeat采集Nginx日志
vi /etc/filebeat/filebeat.yml
# 核心配置(注释掉默认内容,添加以下)
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log # 要采集的日志路径
- /var/log/nginx/error.log
output.elasticsearch:
hosts: ["192.168.1.100:9200"] # Elasticsearch服务器IP
setup.kibana:
host: "192.168.1.100:5601" # Kibana服务器IP
# 3. 启动Filebeat
systemctl start filebeat
systemctl enable filebeat
3. Kibana日志分析实战
- 创建索引模式 :
登录Kibana → 左侧菜单栏「Management」→「Index Patterns」→「Create index pattern」→ 输入filebeat-*(Filebeat默认索引前缀)→ 选择时间字段 → 完成。 - 日志筛选与搜索 :
进入「Discover」页面,可通过关键词搜索(如输入status:404查看Nginx 404错误)、时间范围筛选(如近1小时)。 - 可视化统计 :
进入「Visualize Library」→ 新建柱状图 → 选择索引模式 → X轴选择「status」(Nginx状态码),Y轴选择「Count」→ 生成图表,直观查看不同状态码的访问量。
五、关键日志解读:故障排查实战案例
1. 案例1:SSH暴力破解排查(/var/log/secure)
bash
# 1. 搜索失败登录记录
grep "Failed password" /var/log/secure
# 2. 统计暴力破解的IP(按尝试次数排序,前10个)
grep "Failed password" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | head -10
# 3. 封禁恶意IP(结合firewalld)
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.200" reject'
firewall-cmd --reload
2. 案例2:Nginx 500错误排查(/var/log/nginx/error.log)
bash
# 1. 实时查看Nginx错误日志
tail -f /var/log/nginx/error.log
# 2. 搜索"500"相关错误,定位代码问题
grep "500" /var/log/nginx/error.log
# 3. 结合访问日志,查看报错的URL和IP
grep " 500 " /var/log/nginx/access.log | awk '{print "IP:"$1, "URL:"$7}'
3. 案例3:系统宕机排查(/var/log/messages)
bash
# 1. 查看宕机前的系统日志(按时间倒序)
tac /var/log/messages | grep -m 100 "kernel" # tac:倒序输出,m 100:取前100行
# 2. 搜索内存溢出(OOM)日志
grep -i "out of memory" /var/log/messages
# 3. 搜索磁盘相关错误(如磁盘满、IO错误)
grep -i "disk" /var/log/messages
六、日志安全与优化:企业级最佳实践
1. 日志安全加固
- 禁止普通用户访问敏感日志(如/var/log/secure):
chmod 600 /var/log/secure; - 日志备份:将关键日志(如数据库日志、安全日志)同步到异地存储,防止日志被篡改;
- 开启日志审计:通过
auditd服务监控日志文件的修改(如auditctl -w /var/log/secure -p rwxa -k log_secure)。
2. 日志优化建议
- 日志分级:应用日志按"INFO/WARN/ERROR/FATAL"分级,减少冗余日志;
- 调整轮转策略:高并发Web服务器的访问日志,可设置为"每12小时轮转一次,保留3天";
- 避免日志冗余:关闭不必要的服务日志(如不需要的系统服务日志,通过
systemctl mask 服务名禁用)。
总结
Linux日志管理的核心是"能找到、能看懂、能分析"------本地日志通过tail/grep/awk快速检索,日志轮转通过logrotate防止磁盘占满,集中管理通过ELK实现多服务器日志统一分析。作为运维工程师,要养成"遇到问题先查日志"的习惯,同时通过日志分析提前发现潜在风险(如频繁的SSH登录失败、磁盘使用率持续上涨),从"被动排查"转变为"主动监控"。
掌握日志管理,不仅能快速解决故障,还能为系统安全、性能优化提供数据支撑,是Linux运维的核心技能之一。建议多结合实际场景实操,逐步形成自己的日志排查思路。