Access Log คือบันทึกทุก HTTP Request ที่เข้ามายังเว็บไซต์ของคุณ ตั้งแต่ IP ต้นทาง เวลา URL ที่ขอ Status Code ที่ตอบกลับ ไปจนถึง User-Agent ของผู้เข้าชม ถ้าเว็บของคุณทำงานช้าลงผิดปกติ มีการโจมตี หรือต้องการรู้ว่า Bot ไหนกำลัง crawl อยู่ การวิเคราะห์ Access Log คือจุดเริ่มต้นที่ดีที่สุด บทความนี้จะพาคุณอ่านและวิเคราะห์ Access Log บน Hosting แบบ DirectAdmin ตั้งแต่พื้นฐานไปจนถึงการหา Security Issues จริง

Access Log คืออะไร และอยู่ที่ไหนใน DirectAdmin

Apache Web Server ซึ่งเป็น engine หลักของ Hosting ส่วนใหญ่จะบันทึก HTTP Request ทุกรายการลงใน Access Log โดยอัตโนมัติ ทุกครั้งที่มีคนเปิดหน้าเว็บ โหลดรูปภาพ เรียก API หรือแม้แต่ Bot ที่มา scan เว็บ ทุกอย่างจะปรากฏในไฟล์นี้

ใน DirectAdmin Hosting สามารถเข้าถึง Log ได้หลายวิธี:

ตัวอย่าง path ของ log ใน DirectAdmin:

/home/username/logs/domainname.com-access_log
/home/username/logs/domainname.com-error_log

รูปแบบของ Access Log — อ่านแต่ละ Field

Access Log มาตรฐานใช้ Combined Log Format ซึ่งมีโครงสร้างดังนี้:

IP - - [DATE TIME +ZONE] "METHOD URL PROTOCOL" STATUS BYTES "REFERER" "USER-AGENT"

ตัวอย่าง Log จริง:

203.150.45.12 - - [09/Jun/2026:10:23:41 +0700] "GET /about.html HTTP/1.1" 200 8452 "https://google.com" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
185.220.101.5 - - [09/Jun/2026:10:24:02 +0700] "GET /wp-login.php HTTP/1.1" 404 1234 "-" "python-requests/2.28.0"

คำอธิบาย field แต่ละตัว:

Field ความหมาย ตัวอย่าง
IP Address IP ของผู้ส่ง request 203.150.45.12
Date/Time วันเวลาและ timezone ของ server [09/Jun/2026:10:23:41 +0700]
Method + URL HTTP method และ path ที่ขอ "GET /about.html HTTP/1.1"
Status Code HTTP response code ที่ server ตอบกลับ 200, 404, 403, 500
Bytes ขนาด response ที่ส่งกลับ (bytes) 8452
Referer URL ที่ผู้ใช้คลิกมา (หรือ "-" ถ้าพิมพ์ตรง) "https://google.com"
User-Agent Browser หรือ Bot ที่ส่ง request "Mozilla/5.0..."

คำสั่ง grep และ AWK พื้นฐานสำหรับวิเคราะห์ Log

เมื่อรู้โครงสร้างแล้ว เราสามารถใช้คำสั่ง Linux มาตรฐานในการกรองและนับข้อมูลจาก log ได้ทันที โดยเฉพาะ grep, awk, sort และ uniq ซึ่งมีติดมากับ server ทุกตัวโดยไม่ต้องติดตั้งเพิ่ม

ดู 20 บรรทัดล่าสุดของ log

tail -n 20 ~/logs/domainname.com-access_log

นับจำนวน Request แยกตาม IP (Top 20)

awk '{print $1}' ~/logs/domainname.com-access_log | sort | uniq -c | sort -rn | head -20

ดู Request ทั้งหมดจาก IP เฉพาะ

grep "^185.220.101.5" ~/logs/domainname.com-access_log

หา 404 Error ทั้งหมด

grep '" 404 ' ~/logs/domainname.com-access_log | awk '{print $7}' | sort | uniq -c | sort -rn | head -20

หา Request ที่มาจาก User-Agent ผิดปกติ

grep -v "Mozilla\|Googlebot\|Bingbot\|Twitterbot\|facebookexternalhit" ~/logs/domainname.com-access_log | grep -v "^$" | awk '{print $NF}' | sort | uniq -c | sort -rn | head -20

วิธีหา Bot ที่แย่ (Bad Bot) ใน Access Log

ไม่ใช่ทุก Bot ที่เป็นอันตราย แต่มี Bot บางประเภทที่กินทรัพยากร server โดยไม่มีประโยชน์หรือมีเจตนาไม่ดี เช่น vulnerability scanner, content scraper หรือ brute force tool ลักษณะที่พบใน log:

ตัวอย่างการหา IP ที่ส่ง 404 มาก (สัญญาณ scanner):

grep '" 404 ' ~/logs/domainname.com-access_log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10

ตัวอย่างการหา Bad Bot จาก User-Agent:

awk -F'"' '{print $6}' ~/logs/domainname.com-access_log | sort | uniq -c | sort -rn | grep -i "python\|curl\|go-http\|libwww\|scan\|bot\|crawler" | head -20

ตรวจสอบ Brute Force Attack บน WordPress

ถ้าเว็บใช้ WordPress ควรตรวจสอบ log ที่ path /wp-login.php และ /xmlrpc.php เป็นพิเศษ เพราะเป็นจุดที่ถูก Brute Force บ่อยที่สุด ลักษณะ Brute Force ที่เห็นใน log คือ IP เดียว (หรือหลาย IP ในช่วง subnet เดียวกัน) ส่ง POST request ไปยัง URL นั้นซ้ำๆ หลายร้อยครั้งในช่วงเวลาสั้น

# นับ POST request ที่ wp-login.php แยกตาม IP
grep '"POST /wp-login.php' ~/logs/domainname.com-access_log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10

# หา request ที่ xmlrpc.php
grep '"POST /xmlrpc.php' ~/logs/domainname.com-access_log | awk '{print $1}' | sort | uniq -c | sort -rn

ถ้าพบ IP ใดส่ง POST มาเกิน 20 ครั้งใน 10 นาที ให้ block ทันทีผ่าน .htaccess:

# Block IP เดี่ยวใน .htaccess
Order allow,deny
Allow from all
Deny from 185.220.101.5

# หรือ block ทั้ง subnet (Class C)
Deny from 185.220.101.0/24

หา Security Issues อื่นๆ จาก Log

นอกจาก Brute Force แล้ว Access Log ยังช่วยตรวจสอบการโจมตีประเภทอื่นได้ด้วย ได้แก่:

Path Traversal — พยายาม access ไฟล์นอก web root

grep "\.\./\.\." ~/logs/domainname.com-access_log | head -20

SQL Injection Attempt — หา keyword ใน URL

grep -i "union\|select\|from\|where\|drop\|insert\|update\|delete\|cast(" ~/logs/domainname.com-access_log | head -20

Sensitive File Scan — พยายามเข้าถึงไฟล์สำคัญ

grep -E "\.env|config\.php|wp-config\.php|\.git|backup\.zip|database\.sql|phpinfo\.php" ~/logs/domainname.com-access_log

Shell Upload Attempt — หาการ upload ไฟล์ PHP

grep -i "\.php.*upload\|upload.*\.php\|POST.*shell\|cmd=\|exec=\|system=" ~/logs/domainname.com-access_log

เคล็ดลับ: ถ้าไฟล์ Log ใหญ่มาก (หลาย GB) ให้ใช้ zcat กับไฟล์ที่ถูก compress แล้ว (.gz) หรือใช้ awk กรองตาม date ก่อนเพื่อลด load บน server ตัวอย่าง: awk '/09\/Jun\/2026/' access_log | grep "404" จะกรองเฉพาะ request วันที่ 9 มิ.ย. ที่ตอบ 404 เท่านั้น ทำให้ประมวลผลเร็วขึ้นมาก

วิเคราะห์ Traffic Pattern และ Resource Usage

Access Log ไม่ได้ใช้แค่หาภัยคุกคาม แต่ยังช่วยวิเคราะห์ Traffic Pattern เพื่อ optimize เว็บได้ด้วย เช่น หาหน้าที่ถูกเข้าชมมากที่สุด, ช่วงเวลา peak traffic, รูปภาพที่มีขนาดใหญ่ที่สุด หรือ URL ที่ทำให้ server ช้า

หน้าที่ถูกเข้าชมมากที่สุด (Top Pages)

awk '{print $7}' ~/logs/domainname.com-access_log | grep -v "\.jpg\|\.png\|\.css\|\.js\|\.ico\|\.woff" | sort | uniq -c | sort -rn | head -20

Traffic แยกตามชั่วโมง

awk '{print $4}' ~/logs/domainname.com-access_log | cut -d: -f2 | sort | uniq -c

นับจำนวน Request ตาม HTTP Status Code

awk '{print $9}' ~/logs/domainname.com-access_log | sort | uniq -c | sort -rn

หา Request ที่ตอบกลับข้อมูลขนาดใหญ่ผิดปกติ (อาจเป็น data exfiltration)

awk '{if($10 > 1000000) print $1, $7, $10}' ~/logs/domainname.com-access_log | sort -k3 -rn | head -10

ผลลัพธ์จะแสดง IP, URL และขนาด response (bytes) ที่เกิน 1MB — ถ้าพบ request ไปยัง URL ที่ไม่ควรใหญ่แต่ส่ง data ออกเยอะ อาจเป็นสัญญาณว่า attacker ดึงข้อมูลออกไป

Automate การ Monitor ด้วย Shell Script

แทนที่จะรัน command ทีละอัน เราสามารถสร้าง Shell Script เพื่อสรุปข้อมูลสำคัญจาก log ทุกวันแบบอัตโนมัติได้ ตัวอย่าง script สรุปรายวัน:

#!/bin/bash
LOGFILE="$HOME/logs/domainname.com-access_log"
TODAY=$(date "+%d/%b/%Y")
echo "=== Log Report: $TODAY ==="
echo ""
echo "--- Top 10 IPs ---"
grep "$TODAY" "$LOGFILE" | awk '{print $1}' | sort | uniq -c | sort -rn | head -10
echo ""
echo "--- Status Code Summary ---"
grep "$TODAY" "$LOGFILE" | awk '{print $9}' | sort | uniq -c | sort -rn
echo ""
echo "--- 404 Errors (Top 10 URL) ---"
grep "$TODAY" "$LOGFILE" | grep '" 404 ' | awk '{print $7}' | sort | uniq -c | sort -rn | head -10
echo ""
echo "--- Suspicious UA (non-browser) ---"
grep "$TODAY" "$LOGFILE" | grep -v "Mozilla" | awk -F'"' '{print $6}' | sort | uniq -c | sort -rn | head -10

บันทึก script นี้ที่ ~/scripts/log-report.sh แล้วตั้ง cron ให้รันทุกวันตอนเที่ยงคืน:

0 0 * * * /bin/bash ~/scripts/log-report.sh >> ~/logs/daily-report.txt 2>&1

ความแตกต่างระหว่าง Access Log กับ Error Log

Hosting ทุกแพ็กเกจมักมีไฟล์ log สองประเภทที่สำคัญ คือ Access Log และ Error Log ซึ่งมีวัตถุประสงค์ต่างกัน ไม่ควรสับสนกัน

หลักการง่ายๆ คือ Access Log ตอบคำถาม "ใครมา ทำอะไร เมื่อไร" ส่วน Error Log ตอบคำถาม "มีอะไรพัง และพังตรงไหน" ในทางปฏิบัติเมื่อเว็บมีปัญหา ให้เริ่มจาก Error Log ก่อนเพื่อหาต้นเหตุ แล้วจึงมาดู Access Log ประกอบเพื่อดูว่า request ไหนที่ trigger ให้เกิด error นั้น

path ของ Error Log ใน DirectAdmin:

/home/username/logs/domainname.com-error_log

ดู Error ล่าสุด 50 บรรทัด:

tail -n 50 ~/logs/domainname.com-error_log

กรองเฉพาะ PHP Fatal Error:

grep "PHP Fatal error" ~/logs/domainname.com-error_log | tail -20

Log Rotation และการจัดการ Log ระยะยาว

ไฟล์ Access Log บนเว็บไซต์ที่มีผู้เข้าชมจำนวนมากสามารถโตได้เร็วมาก บางเว็บ log โตวันละ 100–500 MB ถ้าไม่มีการจัดการ disk จะเต็มในไม่ช้า กลไกที่ใช้จัดการปัญหานี้เรียกว่า Log Rotation ซึ่ง Hosting ส่วนใหญ่ตั้งค่าไว้ให้อัตโนมัติ แต่ก็ควรทำความเข้าใจว่ามันทำงานอย่างไร

Log Rotation ทำงานโดยการ:

ปัญหาของ Log Rotation ที่มากเกินไปคือทำให้ข้อมูลย้อนหลังน้อยเกินไปสำหรับ Security Investigation ถ้า hosting ลบ log ที่เก่ากว่า 14 วันอัตโนมัติ แต่คุณต้องการดูว่าเกิดการโจมตีเมื่อ 1 เดือนก่อนหรือเปล่า ก็จะไม่มีข้อมูลให้ดู

วิธีแก้คือตั้ง cron job สำรอง log ไว้เองก่อนที่ hosting จะลบ ตัวอย่าง script สำรอง log ทุกคืน:

#!/bin/bash
# สำรอง access log ทุกวัน เก็บไว้ใน backup/ 90 วัน
LOG_DIR="$HOME/logs"
BACKUP_DIR="$HOME/log_backup"
mkdir -p "$BACKUP_DIR"
YESTERDAY=$(date -d "yesterday" "+%Y%m%d")
for logfile in "$LOG_DIR"/*-access_log; do
    domain=$(basename "$logfile" -access_log)
    dest="$BACKUP_DIR/${domain}-${YESTERDAY}.log.gz"
    if [ ! -f "$dest" ]; then
        cp "$logfile" /tmp/access_log_tmp && gzip -c /tmp/access_log_tmp > "$dest"
    fi
done
# ลบ backup เก่าเกิน 90 วัน
find "$BACKUP_DIR" -name "*.log.gz" -mtime +90 -delete

บันทึกที่ ~/scripts/backup-logs.sh แล้วตั้ง cron:

0 1 * * * /bin/bash ~/scripts/backup-logs.sh

เคล็ดลับสำหรับเว็บที่ต้องปฏิบัติตาม Compliance: ถ้าเว็บของคุณเก็บข้อมูลส่วนบุคคล (ตาม พ.ร.บ. PDPA) การเก็บ Access Log ที่มี IP Address นานเกินความจำเป็นอาจเข้าข่ายเก็บข้อมูลส่วนบุคคลโดยไม่มีฐานทางกฎหมาย ควรกำหนดนโยบายว่าเก็บได้นานแค่ไหน และลบอย่างปลอดภัยเมื่อหมดความจำเป็น โดยทั่วไป 90 วันถือว่าสมเหตุสมผลสำหรับ Security purpose

คำถามที่พบบ่อย (FAQ)

Access Log อยู่ที่ไหนใน DirectAdmin Hosting

ใน DirectAdmin ไปที่ Advanced Features → Apache Logs หรือดู Error/Access logs โดยตรงผ่าน File Manager ที่ path ~/logs/ หรือ ~/access-logs/ ขึ้นอยู่กับ server config นอกจากนี้ยังสามารถ SSH เข้าไปดูที่ /var/log/httpd/ หรือ /home/username/logs/ ได้โดยตรง

Bot ที่ดีกับ Bot ที่แย่ต่างกันอย่างไรใน Access Log

Bot ที่ดี (Googlebot, Bingbot ฯลฯ) มักระบุ User-Agent ชัดเจน ทำ request ตาม robots.txt และมา IP ที่ verify ได้จาก reverse DNS Bot ที่แย่มักมี User-Agent ปลอมหรือว่างเปล่า ทำ request ผิดปกติเช่น scan path ที่ไม่มีจริง ส่ง request ซ้ำในอัตราสูง หรือมา IP จาก datacenter ที่ไม่มีชื่อเสียง

ทำไม IP เดียวกันจึงส่ง Request มาหลายพันครั้งต่อวัน

อาจเกิดจาก 3 สาเหตุหลัก คือ 1) Bot scan ความปลอดภัย (vulnerability scanner) ที่กำลังทดสอบ path และ parameter ต่างๆ 2) Brute Force Attack ที่พยายามเดา password เช่นที่ /wp-login.php หรือ /xmlrpc.php 3) DDoS จากบอตเน็ตที่ใช้ IP จำนวนมาก แต่บางตัว request ซ้ำมาก วิธีรับมือคือ block IP ที่ผิดปกติผ่าน .htaccess หรือติดตั้ง fail2ban

ต้องเก็บ Access Log นานแค่ไหนเพื่อความปลอดภัย

โดยทั่วไปแนะนำเก็บอย่างน้อย 90 วันสำหรับ Security Investigation และ 1 ปีสำหรับ Compliance บาง industry ถ้า hosting มี log rotation อัตโนมัติที่ลบ log เร็ว ควรตั้ง cron job เพื่อ backup log ไปเก็บที่อื่นด้วย เช่น compress และส่งไป remote storage ทุกวัน เพื่อให้มีข้อมูลย้อนหลังเพียงพอเมื่อเกิดเหตุการณ์ผิดปกติ

Hosting DirectAdmin ครบชุดของ AsiaGB

AsiaGB Hosting รองรับ DirectAdmin เต็มรูปแบบ PHP 8.3 MySQL เริ่มต้น 500 บาท/ปี

ดูแพ็กเกจ Hosting