SEO.BANGKOK
// LOG ANALYSIS · 2026-02-18 · อ่าน 14 นาที

สืบสวน Log File: 7 Pattern ที่เราเจอในทุกการตรวจสอบ

Server log คือแหล่งความจริงเพียงแหล่งเดียวที่บอกได้ว่า Googlebot crawl เว็บไซต์ของคุณอย่างไรจริง ๆ Search Console แค่รวบยอดข้อมูล ส่วน log ไม่โกหก หลังจากรันการตรวจสอบทางเทคนิคบน 62 เว็บไซต์ ตลอดปี 2025-2026 pattern ผิดปกติ 7 แบบเดิมโผล่ขึ้นมาเกือบทุกครั้ง นี่คือ pattern เหล่านั้นพร้อม snippet awk และ Python ที่คุณเอาไปรันกับ log ของตัวเองได้เลยคืนนี้

โดย Yunmin Shin · เผยแพร่ 2026-02-18 · อัปเดต 2026-03-12

การตั้งค่า: จะได้ log ที่ใช้งานได้อย่างไร

บน Hostinger, AWS Lightsail และ managed WordPress host ส่วนใหญ่ raw access log มักอยู่ที่ประมาณ /var/log/nginx/access.log หรือดาวน์โหลดได้จาก cPanel ภายใต้ "Raw Access" Cloudflare เพิ่มเลเยอร์เฉพาะของตัวเองเข้ามา คุณจะต้องการ log ทั้งจาก origin ของคุณ และจาก Logpush ของ Cloudflare (แพ็กเกจ Enterprise) หรือ Logpull (Pro+ ขึ้นไป) ถ้า origin ของคุณอยู่หลัง Cloudflare

สำหรับ snippet ด้านล่าง เราสมมติว่าใช้ Apache/Nginx combined log format:

66.249.66.1 - - [18/Feb/2026:08:14:22 +0700] "GET /products/shoes?color=red&sort=price HTTP/1.1" 200 8423 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

ถ้า format ของคุณแตกต่างออกไป ให้สลับตำแหน่ง field ใน snippet ของ awk ให้เหมาะสม ตลอดบทความนี้ $1 คือ IP, $7 คือ request URI, $9 คือ status code, $10 คือ bytes และ user-agent เริ่มที่ $12

ขั้นตอนแรก: กรองหา Googlebot ที่ยืนยันแล้ว

User-agent string โกหกได้ Googlebot ตัวจริง reverse-resolve ไปที่ googlebot.com หรือ google.com วิธีกรองแบบง่ายและถูกต้องเกือบทุกครั้ง:

# Quick filter — UA-only (good enough for triage)
awk '/Googlebot/' access.log > gbot.log

# Verified — reverse DNS check (Python)
import socket
def is_verified_googlebot(ip):
    try:
        host = socket.gethostbyaddr(ip)[0]
        if not host.endswith(('.googlebot.com', '.google.com')):
            return False
        return socket.gethostbyname(host) == ip
    except: return False

สำหรับ ~1.4% ของ hit ที่อ้างว่าเป็น "Googlebot" ใน dataset ของเรา การเช็ก reverse-DNS ล้มเหลว นั่นคือ traffic ปลอมที่คุณควร block ที่ firewall ด้วยเช่นกัน

Pattern 1: การสูญเสีย crawl budget จากการรวม parameter

Faceted navigation (สี × ขนาด × ราคา × การเรียงลำดับ) สร้างจำนวน URL แบบ exponential เราเคยเห็นเว็บไซต์ e-commerce ที่ Googlebot ใช้ 74% ของ crawl budget ไปกับ URL ที่มี parameter ซึ่งไม่ควรถูก index เลย

การตรวจจับ

# Top 20 parameterized URLs Googlebot is hammering
awk '/Googlebot/ && $7 ~ /\?/ {print $7}' access.log | \
  sort | uniq -c | sort -rn | head -20

วิธีแก้

สามชั้น: (1) robots.txt Disallow สำหรับ parameter ที่รู้อยู่แล้วว่าไร้ประโยชน์; (2) rel="canonical" บนหน้าที่มี parameter ชี้ไปยัง URL สะอาด; (3) เครื่องมือ URL Parameters ใน Search Console (ถ้ายังใช้ได้) การรวมทั้งสามชั้นเข้าด้วยกันคือสิ่งที่ได้ผล — ใช้แค่อันเดียวก็ยังรั่วไหล crawl budget อยู่ดี

Pattern 2: soft-404 ระเบิดจำนวนจาก internal search

หน้า internal search ที่ return 200 OK พร้อมเนื้อหา "ไม่พบผลลัพธ์" คือ soft-404 ในที่สุด Google จะจับได้และเริ่มเพิกเฉยต่อ URL เหล่านั้น แต่ระหว่างช่วงที่ Google กำลังหาคำตอบ crawl budget ของคุณจะไหลออกไปเรื่อย ๆ

การตรวจจับ

# Bytes-served distribution for /search/ URLs
# Empty result pages tend to cluster at low byte counts
awk '/Googlebot/ && $7 ~ /\/search/ {print $10}' access.log | \
  sort -n | uniq -c | head -20

ถ้าคุณเห็นการกระจายแบบ bimodal — request จำนวนมากอยู่ที่ ~12KB และหางยาวที่ ~28KB — ตัวที่เล็กมักเป็นหน้าที่ผลลัพธ์ว่างเปล่า

วิธีแก้

Return HTTP 404 (หรือ 410) เมื่อการค้นหาไม่พบผลลัพธ์เลย ใส่ noindex บนหน้า search ทั้งหมดไว้ก่อนเช่นกัน block /search/ ใน robots.txt เพื่อความปลอดภัยสูงสุด แต่ทำหลังจากยืนยันแล้วว่าคุณไม่ได้ block หน้า landing page ที่เกี่ยวข้องกับ organic traffic

Pattern 3: parameter loop (กับดัก spider ไม่รู้จบ)

กรณีคลาสสิก: widget ปฏิทินที่ให้ผู้ใช้เลื่อนไปข้างหน้าได้ไม่รู้จบ (?date=2099-04-22) หรือลิงก์ "ดูรายการถัดไป" ที่ไม่มีหน้าสุดท้าย Googlebot จะตามลิงก์เหล่านี้ไปเป็นพัน URL ก่อนจะยอมแพ้

การตรวจจับ

# Find URL patterns where Googlebot has hit >500 distinct values
import re
from collections import Counter

patterns = Counter()
with open('gbot.log') as f:
    for line in f:
        m = re.search(r'GET (\S+)', line)
        if not m: continue
        url = m.group(1)
        # strip the parameter VALUE, keep the parameter NAME
        normalized = re.sub(r'=[^&]+', '=*', url)
        patterns[normalized] += 1

for url, count in patterns.most_common(20):
    if count > 500:
        print(f"{count:6d}  {url}")

วิธีแก้

ใส่ nofollow บนลิงก์ที่เป็นปัญหา บวกกับ robots.txt Disallow บน pattern ของ parameter นั้น widget ปฏิทิน/navigation ควรมีขอบเขตบนที่ชัดเจน — ไม่มีลิงก์ "เดือนถัดไป" เกิน +12 จากวันนี้

Pattern 4: การหมด render budget (SPA ที่หนัก JS)

Googlebot มี "render budget" แยกต่างหากที่เล็กกว่า สำหรับหน้าที่ต้องรัน JS เราเจอ SPA เป็นประจำที่ HTML ส่งกลับมาเร็ว แต่เวอร์ชันที่ render แล้วใช้เวลา 4-8 วินาที กว่าจะนิ่ง Googlebot crawl HTML, เข้าคิวรอ render และมีเปอร์เซ็นต์หนึ่งของหน้าที่ไม่เคย render สำเร็จก่อนคิวจะหมุนเวียนไปหน้าถัดไป

การตรวจจับ

# Compare crawl frequency between known-rendered URLs (have unique content
# in HTML) vs known-JS-rendered URLs (content only after JS)
# A working render pipeline shows similar crawl freq; a broken one shows
# JS pages crawled 2-4x less often.
awk '/Googlebot/ {print $7}' access.log | sort | uniq -c | \
  sort -rn > crawl_freq.txt

ตรวจสอบไขว้กับ sitemap ของคุณ URL ที่อยู่ใน sitemap แต่มี Googlebot เข้ามาน้อยกว่า 1 ครั้งต่อสัปดาห์ ในขณะที่ URL ใกล้เคียงมี 5-10 ครั้ง มักเป็นสัญญาณว่า render ค้าง

วิธีแก้

Server-side render หรือ static-generate เนื้อหาสำคัญ Hydration ทำได้ไม่มีปัญหา แต่ markup ที่ first-paint ต้องมี title, meta และเนื้อหาหลักอยู่แล้ว เราย้าย SPA ของลูกค้า 4 ราย จาก CSR ไปเป็น Next.js SSG/ISR ในปี 2025 และความถี่ในการ crawl บน URL ที่เคยค้างเพิ่มขึ้น 4-9 เท่า ภายใน 2 สัปดาห์ เราจัดการงาน migration แบบนี้เองในบริษัทเมื่องาน SEO ต้องการการ rebuild

Pattern 5: redirect chain และ 301 ที่ไร้ปลายทาง

301 ทุกตัวใน chain มีค่าใช้จ่ายทั้ง link equity และประสิทธิภาพการ crawl หลังจาก migration เว็บไซต์มาพอสมควร เว็บไซต์ขนาดใหญ่ส่วนใหญ่จะสะสม chain ยาว 5-7 hop สำหรับ URL ที่คาดไม่ถึง

การตรวจจับ

# All 301s, sorted by frequency
awk '/Googlebot/ && $9 == 301 {print $7}' access.log | \
  sort | uniq -c | sort -rn > redirects.txt

# Then for each top redirect, follow the chain manually:
curl -sIL https://yoursite.com/path/that/redirects | grep -i "^location\|^http"

วิธีแก้

301 ทุกตัวควรชี้ตรงไปยังปลายทางสุดท้าย ตรวจสอบทุกไตรมาส หลังการ migration ทุกครั้ง รัน script หา chain บน redirect map เพื่อจับสถานการณ์ A → B → C แล้วเขียนใหม่เป็น A → C

Pattern 6: การ crawl ที่เสียเปล่าบน staging, dev และ subdomain ที่ถูกลืม

Staging environment ที่ถูก index โดยไม่ตั้งใจ หน้า admin ของ Drupal ที่ถูกลืม /wp-json/ ที่ถูกสำรวจหา API endpoint /feed/ ที่ถูก crawl 200 ครั้งต่อวัน

การตรวจจับ

# Top hosts in Googlebot traffic — should ONLY be your canonical
awk '/Googlebot/ {print $2}' access.log | sort | uniq -c | sort -rn

# (If you log Host header — adjust field number for your log format)

วิธีแก้

Staging ต้องมี HTTP basic auth หรือ header X-Robots-Tag: noindex อย่างชัดเจน /wp-json/ ควรถูก block เว้นแต่คุณใช้ REST API แบบสาธารณะจริง ๆ subdomain ที่ตายแล้วควร redirect ไปยัง canonical หรือ return 410

Pattern 7: อัตราการ crawl ที่ดิ่งลงโดยไม่มีใครสังเกต

Pattern ที่อันตรายที่สุด: Googlebot เคย crawl เว็บไซต์ของคุณ 8,000 ครั้งต่อวัน ตอนนี้เหลือ 2,000 และคุณไม่ทันสังเกตเพราะอันดับยังโอเคอยู่ชั่วคราว พอถึงตอนที่อันดับตก คุณจะช้ากว่าการวินิจฉัยไปแล้ว 6 สัปดาห์

การตรวจจับ

# Daily Googlebot hit count over 30 days
awk '/Googlebot/ {
  match($4, /\[([0-9]+)\/([A-Za-z]+)\/([0-9]+)/, d);
  print d[3]"-"d[2]"-"d[1]
}' access.log | sort | uniq -c | tail -30

ลองพล็อตกราฟดู ถ้าเส้นกราฟราบเรียบ คุณสบายใจได้ ถ้ามันค่อย ๆ ลดลงเป็นขั้นบันได ให้ขุดหาสาเหตุทันที — ทุกขั้นที่ลดลงคือ signal ด้านคุณภาพจาก Google ที่คุณพลาดไป

วิธีแก้

วิธีแก้ขึ้นอยู่กับสาเหตุ แต่ flow การวินิจฉัยคือ: (1) เช็ก Search Console หา crawl error; (2) เช็กประวัติ robots.txt หา Disallow ที่เพิ่มเข้ามาโดยไม่ตั้งใจ; (3) เช็กแนวโน้ม response rate ของ 5xx; (4) เช็ก Core Web Vitals ทั้งเว็บไซต์; (5) ตรวจสอบการเปลี่ยนแปลงเนื้อหาใหญ่ ๆ ใน 8 สัปดาห์ที่ผ่านมา INP ที่แย่ลง มักมีความสัมพันธ์กับ crawl rate ที่ตกด้วยเช่นกัน — Google ลดความสำคัญของเว็บไซต์ที่ช้า

"Server log คือสิ่งที่เทียบเท่ากับผลตรวจเลือดของหมอในโลก SEO ส่วน Search Console คือคนไข้ที่บรรยายอาการ ทั้งสองอย่างสำคัญ แต่มีแค่อันเดียวที่บอกคุณว่าเกิดอะไรขึ้นจริง ๆ"

Python pipeline ที่เรารันให้ลูกค้าทุกราย

สำหรับลูกค้าที่ทำงานต่อเนื่อง เรา automate ทั้ง 7 pattern ให้เป็นการตรวจสอบทุกคืน นี่คือโครงร่าง:

import re
from collections import Counter, defaultdict
from datetime import datetime

GBOT_RE = re.compile(r'^(\S+) .* \[([^\]]+)\] "(\w+) (\S+) HTTP/[\d.]+" (\d+) (\d+) ".*" "([^"]+)"')

class LogAuditor:
    def __init__(self):
        self.daily_count = Counter()
        self.param_loops = Counter()
        self.status_dist = Counter()
        self.redirects = Counter()
        self.search_pages = []

    def ingest(self, line):
        m = GBOT_RE.match(line)
        if not m or 'Googlebot' not in m.group(7): return
        ip, ts, method, url, status, bytes_, ua = m.groups()
        date = datetime.strptime(ts.split()[0], '%d/%b/%Y:%H:%M:%S').date()
        self.daily_count[date] += 1
        self.status_dist[int(status)] += 1
        if int(status) == 301: self.redirects[url] += 1
        if '/search' in url: self.search_pages.append((url, int(bytes_)))
        normalized = re.sub(r'=[^&]+', '=*', url)
        self.param_loops[normalized] += 1

    def report(self):
        # ... emit slack/email summary
        pass

script ตัวเดียวกันนี้ขับเคลื่อนระบบตรวจจับความผิดปกติทุกคืนที่ทำงานคู่ขนานไปกับscraper ที่รัน 10,000 คำค้นหาทุกคืนของเรา เมื่ออัตรา crawl ของลูกค้าลดลงมากกว่า 20% เทียบสัปดาห์ต่อสัปดาห์ เราจะได้รับการแจ้งเตือนก่อนที่พวกเขาจะสังเกตเห็นว่ามีอะไรผิดปกติ

สิ่งที่ log บอกคุณไม่ได้

Log ทรงพลังแต่ก็มีข้อจำกัด มันบอกไม่ได้ว่า Googlebot index สิ่งที่มัน crawl ไปหรือเปล่า — มีแค่ Search Console เท่านั้นที่รู้ มันยังบอกไม่ได้ว่าคีย์เวิร์ดไหนที่นำ traffic เข้ามา สำหรับเรื่องนั้นคุณต้องใช้ Performance API ของ GSC stack การวินิจฉัยที่ครบถ้วนคือ log + Search Console + SERP scraper + JavaScript-rendering crawler ข้ามอันใดอันหนึ่งไป คุณจะขาดเลเยอร์หนึ่งไปทันที

บริการ technical SEO ของเรารวม log analysis ไว้เป็น deliverable มาตรฐานในทุก retainer มันคือจุดแรกที่เรามองหาเมื่อลูกค้าบอกว่า "อันดับตกและเราไม่รู้ว่าทำไม" สำหรับลูกค้าที่มี log อยู่แล้วแต่ไม่รู้จะทำอะไรกับมัน เรารับตรวจ log audit แบบครั้งเดียวในราคาคงที่ — ปกติจะพบ 3-6 pattern จากที่กล่าวมาข้างต้น

อ่านเพิ่มเติม

การสืบสวน log file เป็นจุดเริ่มต้นหนึ่งเข้าสู่ technical surface ทั้งหมด จุดเริ่มต้นอื่น ๆ ได้แก่ คุณภาพของ schema graph (สิ่งที่ AI engine มองเห็น), การเพิ่มประสิทธิภาพ INP (สิ่งที่ผู้ใช้รู้สึกได้), pattern การอ้างอิงจาก AEO (สิ่งที่ถูกนำขึ้นมาแสดง) และquality gate สำหรับ programmatic (สิ่งที่ขยายขนาดได้โดยไม่พัง) รวมกันแล้วสิ่งเหล่านี้ครอบคลุมงานวิศวกรรมส่วนใหญ่ที่ขยับอันดับได้จริงในปี 2026 งาน editorial, CRO และเลเยอร์เทคนิคทั้งหมดถูกจัดการโดยทีมในบริษัททีมเดียวกัน

แท็ก: log-files googlebot crawl-budget awk python technical-seo
// คำถามที่พบบ่อย

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

จะหา raw access log ของเซิร์ฟเวอร์เพื่อวิเคราะห์ SEO ได้ที่ไหน?

+

บน Hostinger, AWS Lightsail และ managed WordPress host ส่วนใหญ่ raw access log มักอยู่ที่ประมาณ /var/log/nginx/access.log หรือดาวน์โหลดได้จาก cPanel ภายใต้ "Raw Access" Cloudflare เพิ่มเลเยอร์เฉพาะของตัวเองเข้ามา คุณจะต้องการ log ทั้งจาก origin ของคุณ และจาก Logpush ของ Cloudflare (แพ็กเกจ Enterprise) หรือ Logpull (Pro+ ขึ้นไป) ถ้า origin ของคุณอยู่หลัง Cloudflare

parameter ของ faceted-navigation URL สามารถทำให้ crawl budget สูญเสียไปได้มากแค่ไหน?

+

Faceted navigation (สี × ขนาด × ราคา × การเรียงลำดับ) สร้างจำนวน URL แบบ exponential เราเคยเห็นเว็บไซต์ e-commerce ที่ Googlebot ใช้ 74% ของ crawl budget ไปกับ URL ที่มี parameter ซึ่งไม่ควรถูก index เลย

หน้าแสดงผลการค้นหาภายในเว็บไซต์ถูกมองว่าเป็น soft 404 หรือไม่?

+

หน้า internal search ที่ return 200 OK พร้อมเนื้อหา "ไม่พบผลลัพธ์" คือ soft-404 ในที่สุด Google จะจับได้และเริ่มเพิกเฉยต่อ URL เหล่านั้น แต่ระหว่างช่วงที่ Google กำลังหาคำตอบ crawl budget ของคุณจะไหลออกไปเรื่อย ๆ

Googlebot parameter loop คืออะไร และทำไมถึงเป็นกับดัก?

+

กรณีคลาสสิก: widget ปฏิทินที่ให้ผู้ใช้เลื่อนไปข้างหน้าได้ไม่รู้จบ ( ?date=2099-04-22 ) หรือลิงก์ "ดูรายการถัดไป" ที่ไม่มีหน้าสุดท้าย Googlebot จะตามลิงก์เหล่านี้ไปเป็นพัน URL ก่อนจะยอมแพ้

ทำไมหน้าเว็บที่ render ด้วย JavaScript ของฉันถึงไม่ถูก crawl และ index?

+

Googlebot มี "render budget" แยกต่างหากที่เล็กกว่า สำหรับหน้าที่ต้องรัน JS เราเจอ SPA เป็นประจำที่ HTML ส่งกลับมาเร็ว แต่เวอร์ชันที่ render แล้วใช้เวลา 4-8 วินาที กว่าจะนิ่ง Googlebot crawl HTML, เข้าคิวรอ render และมีเปอร์เซ็นต์หนึ่งของหน้าที่ไม่เคย render สำเร็จก่อนคิวจะหมุนเวียนไปหน้าถัดไป

// บทความที่เกี่ยวข้อง
// SCHEMA · 2026-04-10

Schema.org @graph สำหรับเครือข่าย Authority หลายโดเมน

ระบบ 3 กฎสำหรับเชื่อม entity Organization ข้ามเว็บไซต์พี่น้อง

// CWV · 2026-03-22

เพิ่มประสิทธิภาพ INP บน Hostinger LiteSpeed

21 เทคนิคเฉพาะสำหรับผ่านเกณฑ์ INP <200ms บน shared hosting

// AEO · 2026-01-25

อะไรทำให้ AI Assistant เลือกอ้างอิงแบรนด์คุณ แทนคู่แข่ง

4,200 prompt. AI engine หลัก 4 ตัว pattern ที่วัดผลได้ของสิทธิ์การถูกอ้างอิง

// PROGRAMMATIC · 2025-12-08

ขยาย Programmatic SEO ให้ครอบคลุมกว่า 47,000 หน้า

ระบบ quality-gate สำหรับ deploy ระบบ programmatic ขนาด 1,000-50,000 หน้าอย่างปลอดภัย

ตรวจสอบ log file ฟรี จาก traffic ย้อนหลัง 14 วันของคุณ

ส่ง raw access log ของคุณมาให้เรา (หรือให้สิทธิ์อ่านข้อมูล) เราจะส่งรายงานเป็นลายลักษณ์อักษรเทียบกับ 7 pattern ข้างต้นภายใน 5 วันทำการ ไม่มีการ pitch ขาย

ติดต่อเรา →

© 2026 · ดำเนินการโดย Yunmin Co., Ltd. · จดทะเบียนบริษัทไทย (อยู่ระหว่างดำเนินการ) · 3rd Floor, 272 Than Thip 3 Alley, Phlabphla, Wang Thonglang, Bangkok 10310

ความเป็นส่วนตัว · ข้อกำหนด