日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux系統(tǒng)日志的分析方法和排查技巧

馬哥Linux運(yùn)維 ? 來源:馬哥Linux運(yùn)維 ? 2026-05-14 10:44 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

引言

日志是運(yùn)維工程師排查問題的第一手資料。當(dāng)服務(wù)器出現(xiàn)異常時(shí),系統(tǒng)日志、應(yīng)用日志、安全日志中往往隱藏著問題的答案。然而,很多工程師面對(duì)海量的日志數(shù)據(jù)不知從何看起,要么遺漏關(guān)鍵信息,要么被無關(guān)數(shù)據(jù)淹沒。

本文面向初中級(jí)運(yùn)維工程師,系統(tǒng)講解Linux系統(tǒng)日志的分析方法和排查技巧。文章不追求覆蓋所有日志類型,而是從實(shí)戰(zhàn)出發(fā),講解最重要的日志來源、最常用的分析命令、最典型的故障場(chǎng)景。讀完本文后,讀者應(yīng)該能夠:理解Linux主要日志文件的作用和格式、熟練使用grep、awk、sed等工具進(jìn)行日志分析、快速定位常見的系統(tǒng)異常問題、建立日志分析的基本思路。

假設(shè)讀者具備基本的Linux操作能力,熟悉常用的命令如ls、cat、head、tail等。文中示例基于CentOS/RHEL 7/8系統(tǒng),其他發(fā)行版可能略有差異。

一、Linux日志基礎(chǔ)

1.1 日志系統(tǒng)架構(gòu)

Linux的日志系統(tǒng)主要由三部分組成:syslog守護(hù)進(jìn)程、rsyslog服務(wù)、systemd的journal。

傳統(tǒng)的CentOS 6及更早版本使用syslog作為日志守護(hù)進(jìn)程。CentOS 7及更新版本使用rsyslog,它是syslog的增強(qiáng)版,支持更豐富的過濾規(guī)則和輸出格式。Ubuntu 16.04及更新版本、SUSE系列發(fā)行版也使用rsyslog。

最新的主流Linux發(fā)行版(CentOS 8、Ubuntu 20.04+、Debian 10+)引入了systemd-journald作為日志收集器。journald提供結(jié)構(gòu)化日志、索引搜索、二進(jìn)制日志等特性,比傳統(tǒng)syslog更強(qiáng)大。rsyslog和journald可以協(xié)同工作,也可以單獨(dú)運(yùn)行。

理解這個(gè)架構(gòu)有助于理解日志的存儲(chǔ)位置和格式。

1.2 重要日志文件一覽

Linux系統(tǒng)中最重要的日志文件位于/var/log目錄下:

ls -la /var/log/

主要日志文件的作用:

/var/log/messages:系統(tǒng)主日志,記錄內(nèi)核、應(yīng)用程序的常規(guī)信息。這個(gè)文件是最常用的故障排查日志,幾乎所有系統(tǒng)問題都可以從這里找到線索。在CentOS/RHEL系統(tǒng)中,messages包含系統(tǒng)級(jí)的info、warning、error信息。

/var/log/syslog:系統(tǒng)日志,Ubuntu/Debian系統(tǒng)的主日志。與messages類似,但包含的來源可能更廣。

/var/log/dmesg:內(nèi)核環(huán)緩沖區(qū)日志,記錄系統(tǒng)啟動(dòng)時(shí)的硬件檢測(cè)信息和內(nèi)核模塊加載信息。dmesg對(duì)于排查硬件驅(qū)動(dòng)問題和啟動(dòng)故障特別有用。

/var/log/secure:安全日志,記錄認(rèn)證和授權(quán)相關(guān)的事件。包括SSH登錄、PAM認(rèn)證、sudo使用、cron任務(wù)等信息。這個(gè)日志是排查入侵和安全問題的第一手資料。

/var/log/audit/audit.log:審計(jì)日志,記錄SELinux、審計(jì)規(guī)則匹配等信息。只有安裝了audit服務(wù)才會(huì)生成。

/var/log/yum.log:yum包管理器日志,記錄軟件包的安裝、升級(jí)、刪除操作。

/var/log/cron:crontab任務(wù)執(zhí)行日志,記錄定時(shí)任務(wù)的運(yùn)行情況。

/var/log/maillog:郵件服務(wù)器日志,記錄郵件發(fā)送、接收、投遞情況。

**/var/log/httpd/或/var/log/nginx/**:Web服務(wù)器日志。access_log記錄訪問請(qǐng)求,error_log記錄錯(cuò)誤信息。

**/var/log/mysql/或/var/log/mariadb/**:數(shù)據(jù)庫日志。記錄查詢、錯(cuò)誤、慢查詢等信息。

/var/log/boot.log:系統(tǒng)啟動(dòng)日志,記錄啟動(dòng)過程的服務(wù)初始化情況。

1.3 journalctl基礎(chǔ)用法

systemd-journald提供了強(qiáng)大的日志查詢工具journalctl。

查看所有日志:

journalctl

默認(rèn)使用less分頁顯示,按q退出,j/k上下滾動(dòng)。

查看最新日志并實(shí)時(shí)跟蹤:

journalctl -f

類似tail -f,持續(xù)顯示新產(chǎn)生的日志。

查看指定時(shí)間范圍的日志:

# 查看最近10分鐘的日志
journalctl --since"10 minutes ago"

# 查看指定時(shí)間點(diǎn)的日志
journalctl --since"2026-05-13 1000"

# 查看時(shí)間范圍
journalctl --since"2026-05-13 1000"--until"2026-05-13 1100"

# 昨天的日志
journalctl --since yesterday --until today

查看指定服務(wù)的日志:

journalctl -u nginx.service
journalctl -u sshd.service
journalctl -u kubelet -u containerd # 多個(gè)服務(wù)

查看內(nèi)核日志:

journalctl -k
# 等價(jià)于
dmesg

1.4 日志級(jí)別

Linux系統(tǒng)日志使用標(biāo)準(zhǔn)的日志級(jí)別:

級(jí)別 名稱 說明
0 emerg 系統(tǒng)不可用
1 alert 必須立即處理
2 crit 嚴(yán)重錯(cuò)誤
3 error 錯(cuò)誤
4 warning 警告
5 notice 正常但重要
6 info 信息
7 debug 調(diào)試信息

排查問題時(shí),重點(diǎn)關(guān)注error、warning、crit、alert、emerg級(jí)別的日志。

按級(jí)別過濾:

# 查看error及以上的日志
journalctl -p err

# 查看warning及以上的日志
journalctl -p warning

# 查看特定級(jí)別的日志(等價(jià)于 -p err)
journalctl PRIORITY=3

二、常用日志分析命令

2.1 grep家族

grep是最基礎(chǔ)的日志搜索工具。

基本搜索:

# 在messages中搜索error
grep"error"/var/log/messages

# 搜索多個(gè)關(guān)鍵詞(OR關(guān)系)
grep -E"error|warning|fail"/var/log/messages

# 搜索多個(gè)關(guān)鍵詞(AND關(guān)系)
grep"error"/var/log/messages | grep"mysql"

反向搜索,排除關(guān)鍵詞:

# 不顯示debug日志
grep -v"debug"/var/log/messages

# 排除某些關(guān)鍵詞
grep -v -E"debug|info"/var/log/messages

顯示行號(hào)和上下文:

# 顯示匹配行的行號(hào)
grep -n"error"/var/log/messages

# 顯示匹配行及前后5行
grep -C 5"error"/var/log/messages

# 只顯示匹配行的前面5行
grep -B 5"error"/var/log/messages

# 只顯示匹配行的后面5行
grep -A 5"error"/var/log/messages

統(tǒng)計(jì)匹配行數(shù):

grep -c"error"/var/log/messages
grep"error"/var/log/messages | wc -l

忽略大小寫:

grep -i"error"/var/log/messages

使用正則表達(dá)式:

# 匹配IP地址
grep -E"[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}"/var/log/messages

# 匹配時(shí)間戳格式
grep -E"May [0-9]{1,2} [0-9]{2}:[0-9]{2}:[0-9]{2}"/var/log/messages

2.2 awk基礎(chǔ)

awk是強(qiáng)大的文本分析工具,適合處理結(jié)構(gòu)化日志。

按列提取數(shù)據(jù)。messages日志格式通常是"時(shí)間 主機(jī)名 服務(wù)名[PID]: 消息內(nèi)容":

# 提取第5列及以后的全部?jī)?nèi)容
awk'{print $5, $6, $7, $8, $9, $10}'/var/log/messages

# 提取特定列
awk'{print $1, $2, $5}'/var/log/messages

條件篩選:

# 第5列等于"sshd"的所有行
awk'$5 == "sshd"'/var/log/messages

# 第5列包含"nginx"的所有行
awk'$5 ~ /nginx/'/var/log/messages

# 包含error關(guān)鍵詞的行
awk'/error/'/var/log/messages

統(tǒng)計(jì)出現(xiàn)次數(shù):

# 統(tǒng)計(jì)每個(gè)服務(wù)出現(xiàn)的次數(shù)
awk'{print $5}'/var/log/messages | sort | uniq -c | sort -rn

# 統(tǒng)計(jì)error出現(xiàn)的次數(shù)
awk'/error/'/var/log/messages | wc -l

# 統(tǒng)計(jì)每個(gè)小時(shí)的日志條數(shù)
awk'{print $3}'/var/log/messages | cut -d: -f1 | sort | uniq -c

格式化輸出:

# 格式化輸出
awk'{printf "%-20s %-20s %s
", $1, $2, $5}'/var/log/messages

2.3 sed基礎(chǔ)

sed是流編輯器,適合批量替換和編輯。

替換功能:

# 替換所有匹配內(nèi)容
sed's/error/ERROR/g'/var/log/messages

# 只替換每行第一個(gè)匹配
sed's/error/ERROR/'/var/log/messages

# 原地編輯(危險(xiǎn),建議先不用-i測(cè)試)
sed -i's/error/ERROR/g'/var/log/messages

# 備份后原地編輯
sed -i.bak's/error/ERROR/g'/var/log/messages

刪除功能:

# 刪除匹配行
sed'/debug/d'/var/log/messages

# 刪除空行
sed'/^$/d'/var/log/messages

打印特定行:

# 打印第100行
sed -n'100p'/var/log/messages

# 打印第50到100行
sed -n'50,100p'/var/log/messages

# 打印最后10行
sed -n'$!p'/var/log/messages

2.4 組合命令技巧

管道組合實(shí)現(xiàn)復(fù)雜分析:

# 統(tǒng)計(jì)error出現(xiàn)次數(shù),按小時(shí)分布
grep"error"/var/log/messages | awk'{print $3}'| cut -d: -f1,2 | sort | uniq -c

# 查找最活躍的IP地址
grep"Failed password"/var/log/secure | awk'{print $11}'| sort | uniq -c | sort -rn | head -20

# 統(tǒng)計(jì)每個(gè)用戶的登錄次數(shù)
grep"Accepted password"/var/log/secure | awk'{print $9}'| sort | uniq -c | sort -rn

復(fù)雜分析腳本示例。分析SSH暴力破解情況:

#!/bin/bash
# analyze_ssh.sh

echo"=== SSH登錄失敗統(tǒng)計(jì) ==="
grep"Failed password"/var/log/secure | wc -l

echo""
echo"=== 失敗最多的IP ==="
grep"Failed password"/var/log/secure | awk'{print $11}'| sort | uniq -c | sort -rn | head -10

echo""
echo"=== SSH登錄成功統(tǒng)計(jì) ==="
grep"Accepted password"/var/log/secure | wc -l

echo""
echo"=== 成功登錄的用戶 ==="
grep"Accepted password"/var/log/secure | awk'{print $9}'| sort | uniq -c | sort -rn | head -10

echo""
echo"=== 最近10次失敗登錄 ==="
grep"Failed password"/var/log/secure | tail -10 | awk'{print $1, $2, $3, $11, $13}'

三、常見故障排查場(chǎng)景

3.1 場(chǎng)景一:服務(wù)器無法遠(yuǎn)程連接

服務(wù)器無法SSH連接是最常見的故障之一。排查思路是"從本地到遠(yuǎn)程、從網(wǎng)絡(luò)到服務(wù)"。

第一步:用其他方式(如VNC、IPMI)登錄服務(wù)器。如果無法登錄,說明問題可能在網(wǎng)絡(luò)層面。

第二步:檢查網(wǎng)絡(luò)連通性。從其他機(jī)器測(cè)試:

# 測(cè)試基礎(chǔ)連通性
ping -c 5 

# 測(cè)試端口連通性
nc -zv  22
telnet  22

第三步:檢查SSH服務(wù)狀態(tài)。本地執(zhí)行:

systemctl status sshd

如果服務(wù)未運(yùn)行,嘗試啟動(dòng):

systemctl start sshd
systemctlenablesshd

第四步:檢查SSH配置:

# 檢查配置文件語法
sshd -t

# 查看詳細(xì)日志
tail -50 /var/log/secure | grep sshd
journalctl -u sshd --since"30 minutes ago"

第五步:檢查端口監(jiān)聽:

netstat -tlnp | grep 22
ss -tlnp | grep 22

第六步:檢查防火墻:

# iptables
iptables -L -n | grep 22

# firewalld
firewall-cmd --list-all | grep ssh

# SELinux
getenforce
semanage port -l | grep ssh

第七步:檢查連接數(shù)限制:

# 查看當(dāng)前SSH連接數(shù)
ss -tn | grep :22 | wc -l

# 查看maxsyslogins限制
cat /etc/security/limits.conf

常見問題及解決方案:

問題:sshd服務(wù)無法啟動(dòng)。查看日志:

journalctl -u sshd --no-pager

可能是端口被占用或配置文件錯(cuò)誤。

問題:連接被拒絕。檢查防火墻:

# CentOS/RHEL
systemctl status firewalld
firewall-cmd --add-service=ssh --permanent
firewall-cmd --reload

# 或者直接關(guān)閉防火墻測(cè)試
systemctl stop firewalld

問題:用戶密碼正確但無法登錄。檢查PAM配置和用戶shell:

# 檢查用戶shell
grep  /etc/passwd

# 檢查用戶是否被鎖定
passwd -S 

# 檢查PAM日志
tail -50 /var/log/secure | grep 

3.2 場(chǎng)景二:服務(wù)啟動(dòng)失敗

服務(wù)啟動(dòng)失敗是另一個(gè)常見問題。以Nginx為例講解排查流程。

第一步:確認(rèn)服務(wù)狀態(tài):

systemctl status nginx

第二步:嘗試手動(dòng)啟動(dòng)看錯(cuò)誤信息:

# 停止systemd管理
systemctl stop nginx

# 手動(dòng)啟動(dòng)看錯(cuò)誤輸出
nginx -t # 先檢查配置語法
nginx  # 手動(dòng)啟動(dòng)

第三步:查看詳細(xì)日志:

# Nginx錯(cuò)誤日志
tail -100 /var/log/nginx/error.log

# 系統(tǒng)日志
journalctl -u nginx --no-pager

# messages日志
grep nginx /var/log/messages | tail -50

第四步:檢查常見原因:

檢查端口占用:

netstat -tlnp | grep :80
ss -tlnp | grep :80

檢查配置文件權(quán)限:

ls -la /etc/nginx/nginx.conf
ls -la /etc/nginx/conf.d/

檢查SELinux:

# 檢查SELinux狀態(tài)
getenforce

# 如果是Enforcing模式,檢查nginx相關(guān)權(quán)限
semanage port -l | grep http_port
ps auxZ | grep nginx

常見Nginx啟動(dòng)失敗原因及解決方案:

原因:端口被占用。要么停止占用端口的服務(wù),要么修改Nginx監(jiān)聽端口。

原因:配置文件語法錯(cuò)誤。使用nginx -t檢查:

nginx -t -c /etc/nginx/nginx.conf

原因:權(quán)限問題??赡苁荢ELinux或AppArmor限制。臨時(shí)關(guān)閉SELinux測(cè)試:

setenforce 0

原因:缺少依賴庫。查看nginx錯(cuò)誤日志中是否有"undefined symbol"等錯(cuò)誤。

3.3 場(chǎng)景三:磁盤空間不足

磁盤空間不足會(huì)導(dǎo)致各種服務(wù)異常。排查思路是"定位大文件、清理不必要的文件"。

第一步:查看整體磁盤使用:

df -h

第二步:查找大文件和大目錄:

# 查找大于100MB的文件
find / -typef -size +100M -execls -lh {} ; 2>/dev/null

# 查找最占空間的目錄(根目錄下)
du -sh /*
du -sh /var/*
du -sh /home/*

第三步:重點(diǎn)檢查日志目錄:

du -sh /var/log/*
du -sh /var/log/*/*

# 查找大日志文件
find /var/log-typef -name"*.log"-execls -lh {} ; | sort -k5 -rh | head -20

第四步:檢查是否被攻擊者利用。有些入侵者會(huì)在/tmp、/var/tmp等目錄存放惡意文件:

ls -la /tmp/
ls -la /var/tmp/
find /tmp -typef -newer /tmp/.security -ls 2>/dev/null

第五步:清理方案:

清理日志文件:

# 清空日志文件(保留文件,只清空內(nèi)容)
> /var/log/messages
> /var/log/secure

# 刪除舊日志
find /var/log-name"*.gz"-mtime +30 -delete

# 使用logrotate清理
logrotate -f /etc/logrotate.conf

清理yum緩存:

yum clean all

清理舊的snap版本:

snap list --all
snap remove  --revision=

清理Docker(如果不需要):

docker system prune -af
docker volume prune -f

第六步:防止再次發(fā)生。配置logrotate:

cat /etc/logrotate.conf
cat /etc/logrotate.d/*

確保關(guān)鍵日志已配置自動(dòng)輪轉(zhuǎn)。

3.4 場(chǎng)景四:內(nèi)存泄漏檢測(cè)

內(nèi)存泄漏會(huì)導(dǎo)致可用內(nèi)存越來越少,最終影響系統(tǒng)性能。

第一步:檢查內(nèi)存使用趨勢(shì)。觀察free命令輸出隨時(shí)間的變化:

watch -n 5 free -h

第二步:查看進(jìn)程內(nèi)存占用,找出可疑進(jìn)程:

ps aux --sort=-%mem | head -20

第三步:深入分析特定進(jìn)程。使用pmap查看進(jìn)程內(nèi)存映射:

pmap -x  | sort -k3 -n -r | head -20

第四步:如果是Java進(jìn)程,使用jmap分析:

# 生成堆dump(需要停止應(yīng)用或使用live參數(shù))
jmap -dump:format=b,file=heap.bin 

# 查看堆內(nèi)存使用
jmap -heap 

# 查看對(duì)象統(tǒng)計(jì)
jmap -histo  | head -30

第五步:如果是其他進(jìn)程,使用valgrind檢測(cè):

# 安裝valgrind
yum install valgrind

# 分析進(jìn)程內(nèi)存(注意:這會(huì)顯著降低進(jìn)程性能)
valgrind --leak-check=full --log-file=/tmp/valgrind.log 

內(nèi)存泄漏的常見原因:

C/C++程序中malloc但未free

Java程序中對(duì)象被長(zhǎng)期引用無法回收

配置文件中的緩存設(shè)置過大

連接池未正確關(guān)閉

線程未正確退出

四、安全日志分析

4.1 SSH登錄日志分析

/var/log/secure(CentOS/RHEL)或/var/log/auth.log(Ubuntu/Debian)記錄SSH登錄信息。

分析成功登錄:

# 查看所有成功登錄
grep"Accepted password"/var/log/secure
grep"Accepted publickey"/var/log/secure

# 查看最近的成功登錄
last
lastlog

# 分析成功登錄的來源分布
grep"Accepted password"/var/log/secure | awk'{print $11}'| sort | uniq -c | sort -rn | head -10

分析失敗登錄:

# 查看所有失敗登錄
grep"Failed password"/var/log/secure

# 統(tǒng)計(jì)失敗次數(shù)
grep"Failed password"/var/log/secure | wc -l

# 找出失敗次數(shù)最多的IP
grep"Failed password"/var/log/secure | awk'{print $11}'| sort | uniq -c | sort -rn | head -10

# 找出被攻擊最多的用戶
grep"Failed password"/var/log/secure | awk'{print $9}'| sort | uniq -c | sort -rn | head -10

分析暴力破解特征:

# 同一個(gè)IP大量失敗嘗試
grep"Failed password"/var/log/secure | awk'{print $11}'| sort | uniq -c | sort -rn | head -10

# 同一用戶大量失敗嘗試
grep"Failed password"/var/log/secure | awk'{print $9}'| sort | uniq -c | sort -rn | head -10

4.2 使用fail2ban自動(dòng)防護(hù)

fail2ban可以自動(dòng)分析日志并屏蔽惡意IP。

安裝和配置:

yum install fail2ban -y

# 創(chuàng)建本地配置
cat > /etc/fail2ban/jail.local <

常用命令:

# 查看fail2ban狀態(tài)
fail2ban-client status

# 查看sshd監(jiān)獄狀態(tài)
fail2ban-client status sshd

# 手動(dòng)封禁IP
fail2ban-clientsetsshd banip 1.2.3.4

# 手動(dòng)解封IP
fail2ban-clientsetsshd unbanip 1.2.3.4

# 查看當(dāng)前被封禁的IP
iptables -L -n | grep fail2ban

4.3 sudo使用日志分析

sudo命令的使用情況也記錄在secure日志中:

# 查看sudo使用記錄
grep sudo /var/log/secure

# 查看sudoers配置
visudo

分析哪個(gè)用戶使用了sudo以及執(zhí)行的命令:

grep sudo /var/log/secure | awk -F:'{print $NF}'| sort | uniq -c | sort -rn

4.4 SELinux日志分析

如果系統(tǒng)啟用了SELinux,安全相關(guān)事件會(huì)記錄在/var/log/audit/audit.log:

# 查看SELinux拒絕事件
ausearch -m avc -ts recent

# 查看特定類型的SELinux事件
ausearch -m avc -se nginx

# 將SELinux日志轉(zhuǎn)換為可讀格式
ausearch -m avc --raw | audit2allow

查看SELinux狀態(tài):

getenforce
sestatus

臨時(shí)切換SELinux模式:

setenforce 0 # 設(shè)置為Permissive模式(僅記錄,不阻止)
setenforce 1 # 設(shè)置為Enforcing模式(阻止并記錄)

五、應(yīng)用日志分析

5.1 Nginx日志分析

Nginx日志通常位于/var/log/nginx/目錄下,包括access.log和error.log。

分析error.log:

# 查看最近錯(cuò)誤
tail -100 /var/log/nginx/error.log

# 搜索特定錯(cuò)誤類型
grep"connect() failed"/var/log/nginx/error.log
grep"upstream timed out"/var/log/nginx/error.log
grep"no live upstreams"/var/log/nginx/error.log

# 分析錯(cuò)誤趨勢(shì)
grep"2026/05/13"/var/log/nginx/error.log | awk'{print $NF}'| sort | uniq -c | sort -rn

分析access.log:

# 統(tǒng)計(jì)HTTP狀態(tài)碼
awk'{print $9}'/var/log/nginx/access.log | sort | uniq -c | sort -rn

# 統(tǒng)計(jì)訪問量最高的IP
awk'{print $1}'/var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

# 統(tǒng)計(jì)訪問量最高的URL
awk'{print $7}'/var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

# 統(tǒng)計(jì)響應(yīng)時(shí)間
awk -F'"''{print $NF}'/var/log/nginx/access.log | awk'{sum+=$1; count++} END {print "平均響應(yīng)時(shí)間:", sum/count "ms"}'

# 找出最慢的請(qǐng)求
awk -F'"''{print $NF, $7}'/var/log/nginx/access.log | sort -rn | head -20

5.2 MySQL日志分析

MySQL日志通常位于/var/log/mysql/或/var/log/mariadb/目錄。

查看錯(cuò)誤日志:

tail -100 /var/log/mysql/error.log
grep -E"ERROR|warning"/var/log/mysql/error.log

分析慢查詢?nèi)罩?。首先確認(rèn)慢查詢已開啟:

SHOWVARIABLESLIKE'slow_query%';
SHOWVARIABLESLIKE'long_query_time';

然后分析慢查詢?nèi)罩荆?/p>

cat /var/log/mysql/slow-query.log

# 使用mysqldumpslow工具分析
mysqldumpslow /var/log/mysql/slow-query.log

# 找出最慢的查詢
mysqldumpslow -s t -t 10 /var/log/mysql/slow-query.log

# 找出訪問次數(shù)最多的查詢
mysqldumpslow -s c -t 10 /var/log/mysql/slow-query.log

分析binlog:

# 查看binlog列表
mysql -u root -p -e"SHOW BINARY LOGS;"

# 查看當(dāng)前binlog位置
mysql -u root -p -e"SHOW MASTER STATUS;"

# 使用mysqlbinlog查看內(nèi)容
mysqlbinlog /var/lib/mysql/mysql-bin.000001 | head -100

5.3 Docker日志分析

Docker容器日志通常由containerd或docker處理:

# 查看容器日志(使用docker)
docker logs  --tail 100 -f

# 使用journalctl查看(containerd)
journalctl CONTAINER_NAME= --no-pager

# 查找錯(cuò)誤日志
journalctl CONTAINER_NAME= | grep -i error

# 使用crictl查看(containerd)
crictl logs 

六、日志分析高級(jí)技巧

6.1 編寫分析腳本

一個(gè)實(shí)用的日志分析腳本應(yīng)該具備以下功能:

#!/bin/bash
# analyze_system.sh - 系統(tǒng)日志分析腳本

LOG_FILE="/var/log/messages"
SECURE_LOG="/var/log/secure"
OUTPUT_DIR="/tmp/log_analysis_$(date +%Y%m%d_%H%M%S)"

mkdir -p$OUTPUT_DIR

echo"開始分析日志..."

# 1. 系統(tǒng)錯(cuò)誤統(tǒng)計(jì)
echo"=== 系統(tǒng)錯(cuò)誤和警告 ===">$OUTPUT_DIR/errors.txt
grep -E"error|warning|critical|alert|emerg"$LOG_FILE>>$OUTPUT_DIR/errors.txt

# 2. SSH登錄分析
echo"=== SSH登錄分析 ===">$OUTPUT_DIR/ssh_analysis.txt
echo"成功登錄次數(shù):$(grep 'Accepted' $SECURE_LOG | wc -l)">>$OUTPUT_DIR/ssh_analysis.txt
echo"失敗登錄次數(shù):$(grep 'Failed' $SECURE_LOG | wc -l)">>$OUTPUT_DIR/ssh_analysis.txt
echo"">>$OUTPUT_DIR/ssh_analysis.txt
echo"失敗登錄Top 10 IP:">>$OUTPUT_DIR/ssh_analysis.txt
grep'Failed'$SECURE_LOG| awk'{print $11}'| sort | uniq -c | sort -rn | head -10 >>$OUTPUT_DIR/ssh_analysis.txt

# 3. 磁盤空間分析
echo"=== 磁盤使用情況 ===">$OUTPUT_DIR/disk_usage.txt
df -h >>$OUTPUT_DIR/disk_usage.txt
echo"">>$OUTPUT_DIR/disk_usage.txt
echo"大目錄 (>1GB):">>$OUTPUT_DIR/disk_usage.txt
du -sh /var/* 2>/dev/null | sort -rh | awk'$1 ~ /G/ {print}'>>$OUTPUT_DIR/disk_usage.txt

# 4. 內(nèi)存和CPU狀態(tài)
echo"=== 系統(tǒng)資源狀態(tài) ===">$OUTPUT_DIR/resources.txt
echo"內(nèi)存使用:">>$OUTPUT_DIR/resources.txt
free -h >>$OUTPUT_DIR/resources.txt
echo"">>$OUTPUT_DIR/resources.txt
echo"CPU和負(fù)載:">>$OUTPUT_DIR/resources.txt
uptime >>$OUTPUT_DIR/resources.txt

# 5. 服務(wù)狀態(tài)
echo"=== 服務(wù)狀態(tài) ===">$OUTPUT_DIR/services.txt
systemctl list-units --type=service --state=failed --no-pager >>$OUTPUT_DIR/services.txt

echo""
echo"分析完成,結(jié)果保存在:$OUTPUT_DIR"
ls -la$OUTPUT_DIR

6.2 使用logwatch進(jìn)行自動(dòng)化分析

logwatch是一個(gè)日志分析工具,可以自動(dòng)生成日志摘要:

# 安裝
yum install logwatch -y

# 手動(dòng)運(yùn)行
logwatch --output mail --mailto admin@example.com --detail high

# 輸出到文件
logwatch --output file --filename /tmp/logwatch.txt --detail high

# 只分析特定服務(wù)
logwatch --service sshd --detail high

配置logwatch定期運(yùn)行:

# 創(chuàng)建定時(shí)任務(wù)
crontab -e

# 每天早上8點(diǎn)運(yùn)行日志分析
0 8 * * * /usr/sbin/logwatch --output mail --mailto admin@example.com

6.3 日志集中管理

生產(chǎn)環(huán)境中,建議將日志集中管理,便于分析和告警。

使用rsyslog遠(yuǎn)程日志。配置客戶端發(fā)送日志到遠(yuǎn)程服務(wù)器:

# /etc/rsyslog.conf
*.* @@remote-server:514

配置服務(wù)器接收日志:

# /etc/rsyslog.conf
module(load="imtcp")
input(type="imtcp"port="514")
template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs

使用ELK Stack分析日志。Elasticsearch + Logstash + Kibana是流行的日志分析平臺(tái):

Filebeat:采集日志文件

Logstash:解析和轉(zhuǎn)換日志

Elasticsearch:存儲(chǔ)和索引

Kibana:可視化和查詢

6.4 日志實(shí)時(shí)監(jiān)控和告警

使用inotifywait實(shí)時(shí)監(jiān)控日志變化:

# 安裝
yum install inotify-tools -y

# 監(jiān)控日志文件變化并告警
inotifywait -m -e modify /var/log/secure |whilereadpath action file;do
 ifgrep -q"Failed password""$path$file";then
   echo"檢測(cè)到SSH失敗登錄:$(tail -1 $path$file)"| mail -s"SSH登錄告警"admin@example.com
 fi
done

七、常見日志模式識(shí)別

7.1 識(shí)別OOM Killer

當(dāng)系統(tǒng)內(nèi)存不足時(shí),內(nèi)核會(huì)觸發(fā)OOM Killer,殺死進(jìn)程以釋放內(nèi)存。

查找OOM Killer日志:

# 在dmesg中查找
dmesg | grep -i"out of memory"
dmesg | grep -i"killed process"

# 在messages中查找
grep -i"oom"/var/log/messages

# 查找具體的被殺進(jìn)程
dmesg -T | grep"killed process"

OOM Killer日志格式:

[Mon May 13 1000 2024] Out of memory: Kill process 12345 (java) score 900 or sacrifice child
[Mon May 13 1000 2024] Killed process 12345 (java) total-vm: 8000000kB, anon-rss: 7500000kB, file-rss: 0kB

分析OOM原因:

# 查看被殺進(jìn)程的詳細(xì)信息
ps -eo pid,ppid,user,%mem,cmd --sort=-%mem | head -10

# 查看內(nèi)存使用趨勢(shì)
free -h
vmstat 2 5

7.2 識(shí)別磁盤IO問題

查看IO等待相關(guān)的日志:

grep -i"io timeout"/var/log/messages
grep -i"ext4"/var/log/messages | grep -i error

查看dmesg中的IO錯(cuò)誤:

dmesg | grep -i"sd[a-z]"| grep -i error
dmesg | grep -i"ata"| grep -i error

7.3 識(shí)別網(wǎng)絡(luò)問題

查找網(wǎng)絡(luò)相關(guān)的錯(cuò)誤:

# TCP連接問題
netstat -s | grep -i"retransmit"
netstat -s | grep -i"failed"

# 網(wǎng)卡狀態(tài)
dmesg | grep -i"eth0"
ip -s link show eth0

# 網(wǎng)絡(luò)丟包
netstat -i
ip -s link show

7.4 識(shí)別服務(wù)崩潰

查找服務(wù)崩潰的日志模式:

# 查找core dump
ls -la /var/crash/
find /var/crash -name"core.*"-ls

# 查找段錯(cuò)誤
grep -i"segfault"/var/log/messages
dmesg | grep -i segfault

# 查找ABRT報(bào)告
ls -la /var/spool/abrt/

八、實(shí)戰(zhàn)案例

8.1 案例:定位服務(wù)器頻繁重啟的根本原因

背景:某臺(tái)服務(wù)器經(jīng)常自動(dòng)重啟,平均每天重啟2-3次,嚴(yán)重影響業(yè)務(wù)。

排查過程:

第一步,查看系統(tǒng)日志中的重啟記錄:

last reboot
who -b
last | head -20

第二步,查看messages日志中的關(guān)鍵時(shí)間點(diǎn):

# 查看重啟前的系統(tǒng)日志
grep -E"May 1[0-9]"/var/log/messages | tail -200

發(fā)現(xiàn)重啟前有大量OOM Killer日志。

第三步,查看dmesg中的內(nèi)核日志:

dmesg | grep -i"oom"
dmesg | grep -i"kill"

確認(rèn)是被OOM Killer殺死導(dǎo)致系統(tǒng)不穩(wěn)定。

第四步,分析是哪個(gè)進(jìn)程被殺死:

dmesg | grep -A 2"killed process"

發(fā)現(xiàn)是MySQL數(shù)據(jù)庫進(jìn)程被殺死。

第五步,分析內(nèi)存使用情況:

free -h
ps aux --sort=-%mem | head -10

發(fā)現(xiàn)可用內(nèi)存很少,mysqld占用內(nèi)存過大。

根因:MySQL配置了過大的內(nèi)存緩沖(innodb_buffer_pool_size設(shè)置為16GB),而服務(wù)器總內(nèi)存只有32GB,還運(yùn)行了其他服務(wù)。內(nèi)存不足觸發(fā)OOM Killer,系統(tǒng)不穩(wěn)定。

修復(fù)方案:

降低MySQL的innodb_buffer_pool_size:

SETGLOBALinnodb_buffer_pool_size =8589934592; -- 8GB

永久修改/etc/my.cnf:

innodb_buffer_pool_size = 8G

重啟MySQL驗(yàn)證:

systemctl restart mariadb

監(jiān)控系統(tǒng)內(nèi)存:

watch -n 5 free -h

總結(jié):服務(wù)器頻繁重啟往往與硬件(電源、散熱)、內(nèi)核(內(nèi)核panic)、服務(wù)(OOM)有關(guān)。通過分析系統(tǒng)日志可以快速定位原因。

8.2 案例:從日志中發(fā)現(xiàn)入侵痕跡

背景:安全掃描發(fā)現(xiàn)某臺(tái)服務(wù)器可能存在入侵,需要排查。

排查過程:

第一步,檢查SSH登錄日志:

# 查看失敗的登錄嘗試
grep"Failed password"/var/log/secure | tail -100

# 統(tǒng)計(jì)失敗次數(shù)最多的IP
grep"Failed password"/var/log/secure | awk'{print $11}'| sort | uniq -c | sort -rn | head -20

發(fā)現(xiàn)某個(gè)IP有上萬次失敗登錄,說明可能在嘗試暴力破解。

第二步,檢查是否有成功的異常登錄:

grep"Accepted password"/var/log/secure | awk'{print $9, $11, $12}'| sort | uniq -c | sort -rn

發(fā)現(xiàn)有一個(gè)陌生的用戶登錄過,但該用戶在/etc/passwd中不存在。

第三步,檢查用戶操作歷史:

# 查看bash歷史
cat /var/spool/mail/ # 如果有郵件
grep  /var/log/secure | tail -50

第四步,檢查是否有可疑文件:

# 檢查新增的setuid文件
find / -typef -perm -4000 -ls 2>/dev/null

# 檢查/tmp目錄的可疑文件
ls -la /tmp/
find /tmp -typef -newer /tmp/.security -ls 2>/dev/null

# 檢查隱藏文件
ls -la / | grep"^."
find / -name".*"-typef -ls 2>/dev/null | head -20

根因:攻擊者通過SSH暴力破解獲得了一個(gè)低權(quán)限用戶的訪問權(quán)限,并嘗試提權(quán)。

修復(fù)方案:

立即斷開該IP的連接:

iptables -I INPUT -s  -j DROP

檢查是否有新增的惡意文件或進(jìn)程:

ps aux | grep suspicious
lsof | grep suspicious

備份重要數(shù)據(jù),重裝系統(tǒng)。

加強(qiáng)SSH安全:

# 禁用密碼登錄,使用密鑰
# 編輯 /etc/ssh/sshd_config
PasswordAuthentication no
PermitRootLogin no

systemctl restart sshd

配置fail2ban防護(hù)。

總結(jié):安全排查需要仔細(xì)分析日志,發(fā)現(xiàn)異常行為。關(guān)鍵是平時(shí)要做好日志留存和定期審計(jì)。

九、總結(jié)

日志分析是運(yùn)維工程師最基本但也是最重要的技能之一。

核心要點(diǎn):

熟悉日志位置。知道/var/log/下各個(gè)文件的用途,messages、secure、dmesg是最常用的三個(gè)。

掌握分析工具。grep、awk、sed是最基礎(chǔ)的日志分析工具,journalctl是systemd時(shí)代的強(qiáng)大工具。

建立分析思路。從時(shí)間、關(guān)鍵詞、頻率、趨勢(shì)等多個(gè)維度分析日志。

形成排查閉環(huán):發(fā)現(xiàn)異常 → 定位根因 → 修復(fù)問題 → 驗(yàn)證結(jié)果 → 總結(jié)復(fù)盤。

常用命令速查:

# 查看日志
cat /var/log/messages
tail -f /var/log/messages
journalctl -f
journalctl -u  --since"1 hour ago"

# 搜索
grep"error"/var/log/messages
grep -E"error|warning|fail"/var/log/messages
awk'/error/ {print $0}'/var/log/messages

# 統(tǒng)計(jì)
grep"error"/var/log/messages | wc -l
awk'{print $5}'/var/log/messages | sort | uniq -c | sort -rn

# 分析
last
lastlog
dmesg | grep -i error
ss -s

# 安全分析
grep"Failed password"/var/log/secure
grep"Accepted"/var/log/secure
ausearch -m avc -ts recent

日志分析能力的提升靠的是長(zhǎng)期實(shí)踐。遇到問題時(shí)多分析日志,積累經(jīng)驗(yàn),形成自己的排查思路和方法論。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11844

    瀏覽量

    219706
  • 命令
    +關(guān)注

    關(guān)注

    5

    文章

    763

    瀏覽量

    24060
  • 日志
    +關(guān)注

    關(guān)注

    0

    文章

    152

    瀏覽量

    11102

原文標(biāo)題:靠日志搞定問題!Linux 系統(tǒng)日志分析與異常快速排查

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux日志分析工具logwatch的安裝及使用

    日志是非常重要的系統(tǒng)文件,管理員每天的重要工作就是分析和查看服務(wù)器的日志,判斷服務(wù)器的健康狀態(tài)。但是日志管理又是一項(xiàng)非??菰锏墓ぷ?,如果需要
    發(fā)表于 08-24 10:08 ?826次閱讀

    Linux系統(tǒng)日志的管理

    Linux-系統(tǒng)日志
    發(fā)表于 06-04 17:24

    Linux日志系統(tǒng)Journald

      Toradex從V2.0 Linux BSP 開始,使用Journald作為默認(rèn)的日志管理系統(tǒng)。下面將基于Toradex Colibri iMX6DL ARM嵌入式平臺(tái)介紹Journald的基本使用
    發(fā)表于 09-18 09:36 ?5次下載

    Linux日志文件系統(tǒng)解析

    在近代歷史上,日志文件系統(tǒng)被認(rèn)為十分奇特,主要是處于研究階段。而如今,日志文件系統(tǒng)(ext3)已經(jīng)成為 Linux的缺省文件
    發(fā)表于 11-01 15:23 ?0次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>日志</b>文件<b class='flag-5'>系統(tǒng)</b>解析

    linux系統(tǒng)日志在哪里

    Linux系統(tǒng)擁有非常靈活和強(qiáng)大的日志功能,可以保存幾乎所有的操作記錄,并可以從中檢索出我們需要的信息。日志文件的默認(rèn)路徑是:/var/log下面是幾個(gè)重要的
    發(fā)表于 11-03 12:25 ?4447次閱讀
    <b class='flag-5'>linux</b><b class='flag-5'>系統(tǒng)</b><b class='flag-5'>日志</b>在哪里

    對(duì)于大規(guī)模系統(tǒng)日志日志模式提煉算法的優(yōu)化

    LARGE框架是部署在中國(guó)科學(xué)院超級(jí)計(jì)算環(huán)境中的日志分析系統(tǒng),通過日志收集、集中分析、結(jié)果反饋等步驟對(duì)環(huán)境中的各種
    發(fā)表于 11-21 14:54 ?7次下載
    對(duì)于大規(guī)模<b class='flag-5'>系統(tǒng)</b><b class='flag-5'>日志</b>的<b class='flag-5'>日志</b>模式提煉算法的優(yōu)化

    Linux系統(tǒng)日志文件中的JFS文件系統(tǒng)

    嵌入式linux中文站向大家介紹一下JFS文件系統(tǒng)。Linux系統(tǒng)日志文件中的JFS系統(tǒng), JF
    發(fā)表于 05-05 14:10 ?5794次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)</b><b class='flag-5'>日志</b>文件中的JFS文件<b class='flag-5'>系統(tǒng)</b>

    學(xué)會(huì)用日志了解你的 Linux 系統(tǒng)

    Linux 系統(tǒng)日志非常重要,后臺(tái)運(yùn)行的程序(通常被稱為守護(hù)進(jìn)程或者服務(wù)進(jìn)程)處理了你 Linux 系統(tǒng)中的大部分任務(wù)。
    發(fā)表于 05-06 16:39 ?1050次閱讀

    嵌入式Linux系統(tǒng)時(shí)間設(shè)置

    Linux系統(tǒng)的很多功能都需要讀取時(shí)間為基礎(chǔ)。比如:日志系統(tǒng)需要時(shí)間戳以記錄log,為后期的問題排查提供支撐;cron服...
    發(fā)表于 11-01 16:58 ?1次下載
    嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)</b>時(shí)間設(shè)置

    如何使用journalctl來讀取、監(jiān)控和分析Linux中的日志

    Systemd是大多數(shù)主要Linux發(fā)行版的默認(rèn)的初始化程序。Systemd的主要功能之一收集日志以及為分析日志提供工具。
    的頭像 發(fā)表于 12-23 16:44 ?6145次閱讀

    解析Linux系統(tǒng)日志

    日志記錄了系統(tǒng)每天發(fā)生的各種各樣的事情,比如監(jiān)測(cè)系統(tǒng)狀況、排查系統(tǒng)故障等。你可以通過日志來檢查錯(cuò)
    的頭像 發(fā)表于 01-05 09:41 ?3256次閱讀

    Linux日志管理經(jīng)驗(yàn)總結(jié)

    日志內(nèi)容,合理的日志內(nèi)容(日志錨點(diǎn),內(nèi)容格式,等)可以為應(yīng)用服務(wù)的執(zhí)行記錄、問題排查提供最有力的幫助。
    的頭像 發(fā)表于 10-24 17:36 ?1065次閱讀

    如何在CentOS系統(tǒng)中部署ELK日志分析系統(tǒng)

    日志分析已成為企業(yè)監(jiān)控、故障排查和性能優(yōu)化的重要組成部分。ELK(Elasticsearch、Logstash 和 Kibana)堆棧作為一種強(qiáng)大的開源解決方案,提供了高效的日志收集、
    的頭像 發(fā)表于 05-08 11:47 ?1203次閱讀
    如何在CentOS<b class='flag-5'>系統(tǒng)</b>中部署ELK<b class='flag-5'>日志</b><b class='flag-5'>分析</b><b class='flag-5'>系統(tǒng)</b>

    利用Last Log(Ramoops)排查系統(tǒng)問題:配置與實(shí)踐指南

    Linux 內(nèi)核的ramoops機(jī)制實(shí)現(xiàn))可在系統(tǒng)異常時(shí)保存核心日志,為事后故障分析提供關(guān)鍵依據(jù)。本文將詳細(xì)介紹其配置方法與問題
    的頭像 發(fā)表于 02-05 13:54 ?577次閱讀
    利用Last Log(Ramoops)<b class='flag-5'>排查</b><b class='flag-5'>系統(tǒng)</b>問題:配置與實(shí)踐指南

    Nginx日志分析命令實(shí)踐和常見問題排查思路

    日常運(yùn)維工作中,日志分析排查問題最直接的手段。Nginx 作為入口層代理,幾乎所有請(qǐng)求都要經(jīng)過它。當(dāng)網(wǎng)站出現(xiàn)響應(yīng)慢、500 錯(cuò)誤、502 網(wǎng)關(guān)超時(shí)、限流失效等問題時(shí),第一反應(yīng)應(yīng)該是查 Nginx
    的頭像 發(fā)表于 04-15 14:12 ?293次閱讀
    陇南市| 石阡县| 龙岩市| 遵义县| 揭西县| 筠连县| 都安| 江阴市| 梨树县| 乌审旗| 隆昌县| 甘泉县| 偏关县| 惠东县| 革吉县| 阿尔山市| 雷波县| 鸡西市| 英吉沙县| 迭部县| 霍山县| 辛集市| 漾濞| 都匀市| 民勤县| 衡南县| 正蓝旗| 彭州市| 沈阳市| 鄱阳县| 威海市| 民乐县| 若尔盖县| 县级市| 虎林市| 汕尾市| 芜湖市| 岫岩| 西丰县| 白山市| 同德县|