1. Linux系统日志概述运维人员的黑匣子在Linux系统中日志文件就像飞机的黑匣子完整记录了系统运行的每一个细节。作为运维人员我每天打交道最多的就是各种日志文件。不同于Windows系统将日志集中存储在事件查看器中Linux采用分散存储策略不同类型的日志由不同服务生成分布在系统的各个角落。常见的日志存储位置包括/var/log/messages系统常规日志RedHat系/var/log/syslog系统常规日志Debian系/var/log/auth.log认证相关日志/var/log/kern.log内核日志/var/log/dmesg硬件和驱动日志/var/log/nginx/Nginx服务日志其他服务类似提示不同Linux发行版的日志文件路径可能略有差异建议先用ls -l /var/log/查看当前系统的日志结构。2. 核心日志查询工具详解2.1 基础命令三剑客grep文本搜索利器作为最常用的日志过滤工具grep的强大之处在于其灵活的正则表达式支持。我常用的几个实战参数组合# 显示匹配行及前后5行内容关键错误上下文 grep -A5 -B5 error /var/log/syslog # 忽略大小写搜索适用于不确定大小写的场景 grep -i connection refused /var/log/nginx/access.log # 统计错误出现次数用于量化问题严重性 grep -c segmentation fault /var/log/messagesawk字段处理大师当需要按列提取日志信息时awk是无可替代的工具。比如分析Nginx访问日志# 统计访问量前10的IP awk {print $1} /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10 # 计算平均响应时间假设日志第10列为响应时间 awk {sum$10; count} END {print Avg:,sum/count,ms} /var/log/nginx/access.logsed流编辑器虽然学习曲线较陡但sed在批量处理日志时效率惊人# 替换日志中的敏感信息如手机号 sed -i s/[0-9]\{3\}-[0-9]\{4\}/***-****/g access.log # 提取特定时间段的日志配合grep更高效 sed -n /10:00:00/,/11:00:00/p /var/log/syslog2.2 高级工具组合技journalctlsystemd日志分析现代Linux发行版普遍采用systemd其日志查询命令journalctl提供了强大的过滤功能# 查看最近20条内核日志 journalctl -k -n 20 # 追踪特定服务的实时日志 journalctl -u nginx -f # 显示带有优先级的错误日志priority 0-3为错误 journalctl -p 0..3 --since 1 hour agologrotate日志轮转配置防止日志爆盘的必备工具典型配置示例/etc/logrotate.d/nginx/var/log/nginx/*.log { daily missingok rotate 14 compress delaycompress notifempty create 0640 www-data adm sharedscripts postrotate [ -f /var/run/nginx.pid ] kill -USR1 cat /var/run/nginx.pid endscript }3. 实战场景解析3.1 服务器故障排查流程定位问题时间窗口# 查看最近重启记录 last reboot | head -5 # 检查关键服务状态 systemctl list-units --typeservice --statefailed分析内存/CPU异常# 检索OOM killer记录 dmesg | grep -i killed process # 查找高CPU进程历史记录 grep CPU overload /var/log/syslog磁盘问题诊断# 检查文件系统错误 grep EXT4-fs error /var/log/kern.log # 查找磁盘空间告警 grep disk full /var/log/syslog3.2 安全事件分析SSH暴力破解分析# 统计失败登录尝试 grep Failed password /var/log/auth.log | awk {print $11} | sort | uniq -c | sort -nr # 提取攻击者IP grep Invalid user /var/log/auth.log | awk {print $10} | sort | uniq -c可疑进程追踪# 查找被删除但仍在运行的进程 ls -l /proc/*/exe 2/dev/null | grep deleted # 检查异常cron任务 grep CRON /var/log/syslog | grep -v root | awk {print $6,$7,$8}4. 性能优化技巧4.1 日志查询加速方案建立常用日志索引# 使用mlocate加速日志查找 updatedb --localpaths/var/log # 创建按日期分割的日志软链接 ln -s /var/log/nginx/access.log /var/log/nginx/access_$(date %Y%m%d).log使用内存盘处理大日志# 将日志临时加载到tmpfs mount -t tmpfs tmpfs /mnt/logtmp -o size512M cp /var/log/large.log /mnt/logtmp/ grep pattern /mnt/logtmp/large.log4.2 日志收集与分析架构对于分布式系统推荐采用ELKElasticsearchLogstashKibana方案Filebeat配置示例filebeat.inputs: - type: log paths: - /var/log/nginx/*.log fields: type: nginx output.logstash: hosts: [logstash:5044]Logstash过滤规则filter { if [type] nginx { grok { match { message %{COMBINEDAPACHELOG} } } date { match [ timestamp, dd/MMM/yyyy:HH:mm:ss Z ] } } }5. 高级应用场景5.1 日志实时监控报警使用PrometheusGrafana构建监控看板Promtail配置示例scrape_configs: - job_name: system static_configs: - targets: [localhost] labels: job: varlogs __path__: /var/log/*logGrafana告警规则{ alert: HighErrorRate, expr: rate(log_entries_total{level\error\}[5m]) 0.5, for: 10m, annotations: { summary: High error rate detected } }5.2 日志长期存储方案对于需要长期保留的日志建议冷热数据分层存储# 使用S3存储归档日志 aws s3 cp /var/log/nginx/access.log.1.gz s3://logs-bucket/$(date %Y/%m)/nginx/ClickHouse日志分析-- 创建日志表 CREATE TABLE nginx_logs ( timestamp DateTime, ip String, method String, status UInt16 ) ENGINE MergeTree() ORDER BY timestamp;6. 避坑指南与经验分享时区问题确保所有服务器使用统一的UTC时间避免日志时间错乱。我曾遇到过因为时区不一致导致无法追踪跨服务器请求的惨痛教训。日志轮转陷阱在处理正在被写入的日志文件时先用cp复制而非直接mv否则可能丢失正在写入的数据。多行日志处理Java堆栈跟踪等多行日志需要使用特殊处理# 使用zgrep处理压缩日志 zgrep -A5 NullPointerException /var/log/app/*.gz # 或者使用multiline插件Logstash配置示例 filter { multiline { pattern ^\[ negate true what previous } }敏感信息过滤在分享日志前务必处理敏感数据# 移除身份证号等敏感信息 sed -E s/[0-9]{6}([0-9]{8})[0-9]{4}/******\1****/g error.log日志采样策略当日志量过大时可以采用采样分析# 每100行取1行分析 awk NR % 100 0 /var/log/huge.log | grep error在多年的运维生涯中我发现最有效的日志分析方法是建立标准化的标签体系。比如在所有应用日志中强制包含[RequestID]、[UserID]等统一字段这样在追踪具体请求链路时会事半功倍。另外养成定期检查日志配置的习惯避免磁盘被日志写满导致系统崩溃——这种低级错误我见过太多次了。
阅读完成 · 觉得有帮助?