Log file ที่ควรรู้จัก และว่างๆ ก็ควรเปิดดูบ้าง พร้อมวิธีอ่าน

พบว่าหลายคน เวลาระบบมีปัญหาไม่รู้ว่าจะหาปัญหาที่ไหนดี ก็ขอเอารายการ log file ของแต่ละ service พร้อมวิธีอ่านคร่าวๆ มาให้ดูครับ

จริงๆ แล้วเรื่อง log กับเรื่อง monitor แบบเป็นกราฟ หรือประวัติย้อนหลัง (mrtg/munin/zabbix/cacti/… สารพัดจะใช้) ค่อนข้างเป็นเรื่องคู่กันพอสมควร เพราะจากที่ทำมา เวลาระบบมีปัญหา ก็จะใช้ตัว monitor ในการหาช่วงเวลาที่น่าจะเริ่มมีปัญหา ดูว่า “น่าจะ” เกิดปัญหาจาก service ไหนด้วยการไล่หลายๆ กราฟพร้อมๆ กัน (apache / mysql / traffic / load) แล้วก็ไปดู log ย้อนหลังอีกที…

ซึ่ง ต่อให้ดูขนาดนี้ก็ยังไม่ได้รับประกันว่าจะหาสาเหตุเจอหรอกนะ (อ้าว) แต่มันช่วยตัดบางประเด็นออกไปได้ครับ ส่วนมากการดู log พวกนี้จะใช้กรณีโดน hack / spam มากกว่า
ส่วนการ optimize เวลา server overload ให้ใช้ monitor คู่กับเครื่องมือดูสถานะแบบละเอียดของแต่ละ service (apache status / mytop / iostat อะไรพวกนี้) ครับ

[SIZE=6]1) Apache Web Server (httpd)[/SIZE]

ของ apache “โดยปกติ” (รวมถึงกรณีที่ติดตั้งผ่าน directadmin) จะอยู่ที่ /var/log/httpd ครับ ไฟล์สำคัญสุดเลยคือ /var/log/httpd/error_log ซึ่งเป็นการบอกสถานะการทำงานหลักของ apache ที่ไม่เกี่ยวกับโดเมนไหนครับ

ทีนี้ไอ้ไฟล์นี้เนี่ย บางทีใน log มันจะมีคำประมาณว่า [notice] กับ [warning] อยู่พอควร ไอ้พวกนั้นตัดๆ ไปได้เลยครับ ส่วนที่ควรดูคือพวก [error] ต่างๆ
แต่ทีนี้ไอ้ [error] บางทีจะมีประมาณว่า Directory index forbidden ไม่ก็ File does not exist อยู่บ้างพอควร ก็ช่างหัวมันไปเหมือนกัน ตัดๆ ออก แล้วจะเห็นอาการ error ชัดเจนขึ้น (ถ้ามันมีปัญหาน่ะนะ)

ส่วนกรณีที่มีปัญหาเป็นรายโดเมน (เช่นเว็บ error) ก็ต้องเข้าไปดูเป็นรายเว็บครับ สำหรับของ directadmin จะอยู่ที่ /var/log/httpd/domains/DOMAIN.COM.error.log
กรณีที่เป็น subdomain ก็เติมชื่อ sub ต่อท้ายไปอีกทีเป็น /var/log/httpd/domains/DOMAIN.COM.SUBDOMAIN.error.log ประมาณนี้ครับ วิธีดูก็เหมือนๆ กันแหละ อย่าไปสนใจไอ้พวก notice / warning เอามาเฉพาะ error ก็พอ

และถ้าจะดูการใช้งาน สำหรับ apache จะอยู่ที่ /var/log/httpd/access_log หรือแยกรายโดเมนของ directadmin ที่ /var/log/httpd/domains/DOMAIN.COM.log ครับ

[SIZE=6]2) Mail log หรือประวัติการส่งเมล[/SIZE]

อ่า อันนี้อาจต้องแยกเป็น mail server รายตัวเลย แต่ขอหลักๆ แค่ postfix กับ exim ละกันครับ

[SIZE=4]2.1) Postfix[/SIZE]

โดยปกติแล้ว postfix จะยิงเข้า syslog ครับ ซึ่งจะไปเก็บในไฟล์ชื่อ /var/log/maillog หรือบน debian ที่ /var/log/mail.log (ต่างกันแค่มีจุดกับไม่มี)
โดยจะมี prefix ระบุนำหน้าว่าเป็นของ service ย่อยตัวไหนใน postfix ตัวสำคัญๆ ก็มี

[LIST]
[]postfix/smtp : สำหรับเมลขาออก
[
]postfix/qmgr : เป็นการทำงานของการ enqueue email เข้าในรายการคิวที่จะส่ง รวมถึงจัดสถานะสำหรับเมลที่ส่งไม่ผ่านเพื่อที่จะรอส่งซ้ำ
[*]postfix/smtpd : service ตัวที่ listen port 25 สำหรับรับเมลจาก server อื่นๆ (รวมถึง client ด้วย)
[/LIST]

โดยเมลแต่ละฉบับจะมีหมายเลข Queue ID กำกับตามหลังชื่อ service หลังจากนั้นจะเป็นรายละเอียดของ log ประจำ service นั้นๆ ครับ
ตัวอย่างเบื้องต้นสำหรับคิวการรับ แล้วส่งต่ออีเมล (forward) ไปที่อื่นก็ประมาณนี้ (อันนี้ grep มาเฉพาะ ID ของ email อันนี้เลย)

[SIZE=4]2.2) Exim[/SIZE]

Log ของ Exim อ่านยากพอควรครับ (เกลียดมัน) ไม่ใช่ดูปุ๊ปรู้ปั๊บแบบของ Postfix สำหรับ directadmin จะเก็บ log ไว้ที่ /var/log/exim/mainlog ครับ ซึ่งจะรวมทุกอย่างอยู่ในนี้หมดเลย และไม่ได้มีคำอธิบายชัดเจนมาก ส่วนมากเป็นตัวย่อทำให้อ่านยาก และต้องเดาพอสมควร

โดยโครงสร้าง log file จะเป็น <วันที่> <เวลา> <หมายเลขคิว> <ทิศทางการส่ง> แล้วตามด้วยรายละเอียดประจำ action นั้นๆ ครับ
ทิศทางการส่งหลักๆ จะมี 2 อันคือ <= (ลูกศรชี้ไปด้านซ้าย) หมายความว่าส่งเข้าหาเครื่องตัวเอง (เมลภายนอก รวมถึง mail ที่มาจาก outlook พวกนั้นด้วย ส่งเข้ามา)
กับ => (ลูกศรชี้ไปด้านขวา) เป็นเมลที่ส่งออกจาก exim (จากในคิว) ไปหา mailbox ของ user (กรณีส่งหาเครื่องตัวเอง) หรือไปหา mail server ภายนอกครับ

(จริงๆ มันมี == กับ ** ด้วย แต่นานๆ ทีโผล่ที ส่วนมากเป็นพวก mail ที่ตีกลับ หรือ รอส่งซ้ำอีกครั้ง)

ใน log จะบอกรายละเอียดให้พอสมควร สำหรับเมลขาเข้าจะบอกว่ารับจาก service ไหน ,ต้นทาง ip อะไร ,วิธีไหน ,subject ว่าอะไร ,ส่งจากใคร ,ถึงใคร
ส่วนเมลขาออก ก็จะบอกว่าส่งไปหาใคร ,จากใคร ,ส่งด้วยวิธีไหน (R=), ส่งผ่านอะไร (T=), ส่งไปหา ip ไหน (H=), และสถานะการส่ง (C=)

[SIZE=6]3) สถานะการทำงานของเครื่อง[/SIZE] (ปัญหา hardware ที่ไม่ได้เกิดที่ harddisk ลูกที่ใช้เก็บไฟล์ log)

ไฟล์นี้สำคัญมากครับ และส่วนมากทุก distro จะไว้ที่เดียวกันเลยคือ /var/log/messages ครับ
log ไฟล์นี้โดยปกติแล้วค่อนข้างไร้สาระพอสมควร คือมันจะมีอะไรก็ไม่รู้สารพัดสารเพปนไปมาเต็มไปหมดให้ดูยากเล่นๆ เพราะมันรวมข้อความจาก service เกือบทุกตัวที่ใช้ syslog เข้ามาด้วย แต่เวลามีปัญหาเกี่ยวกับอุปกรณ์อะไรก็ตาม (ที่ไม่ใช่ harddisk ลูกที่เก็บไฟล์นี้) มีปัญหา แนะนำให้เข้ามาดูไฟล์นี้ครับ เพราะอย่างเคสล่าสุดที่เพิ่งเจอ คือ อยู่ดีๆ การ์ด lan ก็ drop speed ลงมาเหลือ 100mbps ก็อาศัย log มาหาว่าเริ่มเป้นตั้งแต่เมื่อไหร่ และในเวลานั้นมีใครเข้าไปทำอะไรมาหน้าเครื่องรึเปล่าครับครับ

วิธีง่ายๆ ก็ grep ชื่ออุปกรณ์ที่มีปัญหาดูในไฟล์เลย มันก็จะแสดง log ที่เกี่ยวข้องกับอุปกรณ์ตัวนั้นออกมาเลยครับ

[root@someserver log]# cat messages|grep eth
Jan 29 14:09:58 someserver kernel: tg3 0000:20:00.0: eth0: Link is down
Jan 29 14:10:08 someserver kernel: tg3 0000:20:00.0: eth0: Link is up at 1000 Mbps, full duplex
Jan 29 14:10:08 someserver kernel: tg3 0000:20:00.0: eth0: Flow control is on for TX and on for RX
Jan 29 14:10:35 someserver kernel: tg3 0000:20:00.0: eth0: Link is down
Jan 29 14:10:58 someserver kernel: tg3 0000:20:00.0: eth0: Link is up at 100 Mbps, full duplex
Jan 29 14:10:58 someserver kernel: tg3 0000:20:00.0: eth0: Flow control is on for TX and on for RX
Jan 29 14:11:48 someserver kernel: tg3 0000:20:00.0: eth0: Link is down
Jan 29 14:12:06 someserver kernel: tg3 0000:20:00.0: eth0: Link is up at 100 Mbps, full duplex
Jan 29 14:12:06 someserver kernel: tg3 0000:20:00.0: eth0: Flow control is on for TX and on for RX
Jan 29 14:12:43 someserver kernel: tg3 0000:20:00.0: eth0: Link is down
Jan 29 14:13:02 someserver kernel: tg3 0000:20:00.0: eth0: Link is up at 100 Mbps, full duplex
Jan 29 14:13:02 someserver kernel: tg3 0000:20:00.0: eth0: Flow control is on for TX and on for RX

(tg3 คือชื่อ driver ที่ใช้ควบคุมการ์ดแลน eth0)

หรืออีกเคสนึง อันนี้ harddisk ใกล้จะพังแล้ว ก็จะเจออะไรประมาณนี้

Feb 2 23:28:31 rhea kernel: [2434610.975008] sd 4:0:2:0: [sdd] Unhandled sense code
Feb 2 23:28:31 rhea kernel: [2434610.975010] sd 4:0:2:0: [sdd] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
Feb 2 23:28:31 rhea kernel: [2434610.975013] sd 4:0:2:0: [sdd] Sense Key : Medium Error [current]
Feb 2 23:28:31 rhea kernel: [2434610.975018] sd 4:0:2:0: [sdd] Add. Sense: Unrecovered read error
Feb 2 23:28:31 rhea kernel: [2434610.975021] sd 4:0:2:0: [sdd] CDB: Read(10): 28 00 06 9f 1b d0 00 00 10 00
Feb 2 23:28:31 rhea kernel: [2434610.975028] end_request: I/O error, dev sdd, sector 111090640
Feb 2 23:28:33 rhea kernel: [2434612.782247] sd 4:0:2:0: [sdd] Unhandled sense code
Feb 2 23:28:33 rhea kernel: [2434612.782249] sd 4:0:2:0: [sdd] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
Feb 2 23:28:33 rhea kernel: [2434612.782252] sd 4:0:2:0: [sdd] Sense Key : Medium Error [current]
Feb 2 23:28:33 rhea kernel: [2434612.782256] sd 4:0:2:0: [sdd] Add. Sense: Unrecovered read error
Feb 2 23:28:33 rhea kernel: [2434612.782260] sd 4:0:2:0: [sdd] CDB: Read(10): 28 00 06 9f 1b d0 00 00 08 00
Feb 2 23:28:33 rhea kernel: [2434612.782267] end_request: I/O error, dev sdd, sector 111090640

เจ้ยยยย นี่มันสดๆ ร้อนๆ เลยนี่หว่า … ว่าแล้วก็ขอตัววิ่งไปเปลี่ยน harddisk ที่ idc ก่อนนะครับ ชะแว๊บ T_T

จองที่ไว้อีกหน่อย


แค่จองที่ก็ยังมากด Thanks เทพจริงๆ :07baa27a:

บทความมีประโยชน์มากๆ ผมว่าคงมีตามมาอีกเยอะเลย

ขอบคุณครับ

ถามเทพไอซ์ครับว่าพวก log ที่ไม่มีประโยชน์ของ httpd เช่น file not found แบบนี้ สามารถสั่งให้ ignore คือไม่บันทึก log ประเภทนี้ได้ไหมครับ. น่าจะช่วยลด i/o ได้พอดู.

อย่าเลยครับ
อย่างน้อยก็ทำให้เรารู้ว่าคนพยามเจาะเครื่องเราอยู่
อย่างเครื่องมี เปลี่ยน phpmyadmin เป็นชื่ออื่น ก็ยังมี error 404 ของตัวนี้อยู่ เลยทำให้รู้ว่ามีคนพยามเจาะเครื่องผมผ่าน phpmyadmin
และยังมี 404 ของ cms อีกอย่างตัวที่ปรากฏทั้งๆที่ในเครื่องผมมันไม่มีหรือเปลี่ยนเป็นชื่ออื่น

ดีครับน้องไอซ์:one:

หาวิธีปิดอยู่เหมือนกันครับ T_T

ตัวนี้ช่วยได้ครับ mod_log_config - Apache HTTP Server Version 2.2

แลก io กับ cpu

มันอยู่ใน error log อะครับ พวกนี้ไม่มีผลเลย

เขียน mode rewrite ดัก ได้ไหม ครับ
ของผมไม่โผลมาเลย 404

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) index.php

มันจะกลายเป็น เอะอะอะไรก็เข้า php หมด เปลือง cpu ครับ -*-’ ยอมปล่อย 404 ไปยังดีกว่า

เปลี่ยนเป็นหน้า html ว่างๆสิครับ

httpd log นี่นั่งดู realtime ไม่ไหว มันวิ่งยังกับดอกเบี้ยธนาคาร ดูแล้วเครียด

log ที่เจอประจำ ทุกเว็บคือ not found favicon.ico

-*-

จริงครับ ถ้ามีวิธีเลือก log ได้จะดีมาก -.-

ถ้าไม่อยากจเอก้ต้องหา favicon.icoมาใส่เอาไว้

ผมก็หามาใส่ไว้เหมือนกัน

ใส่ใน /var/www/html/

ก็ยังเจออยู่ ไม่งั้นคงต้องใส่ไปกับทุก domain เลย ?

ทำ alias ให้ชี้ไปที่เดียวดิครับ

กำ อ่านไม่หมดถ้าจะปิดแต่ 404 ใน log อย่างเดียวไม่ทราบเหมือนกันครับ

ErrorLog ผมใช้อยู่ 2 แบบครับ
ใช้ [FONT=Courier New][COLOR=#000000]LogLevel[/COLOR][/FONT] ให้สูงกว่า error
http://httpd.apache.org/docs/2.2/mod/core.html#loglevel

[COLOR=#000000][FONT=Courier New]LogLevel crit
[/FONT][/COLOR]
กับ

ErrorLog /dev/null