Khi có sự cố, câu đầu tiên luôn là: "log nói gì?". Nhưng log Odoo trôi rất nhanh và trộn lẫn đủ thứ — cron, request web, ORM, SQL. Biết đọc một dòng log và biết bật đúng thứ cần soi là kỹ năng tách người gỡ lỗi nhanh khỏi người ngồi đoán. Sau khi đã quen odoo shell, đây là công cụ chẩn đoán thứ hai.

Một dòng log gồm 6 phần

Mọi dòng log Odoo theo cùng một khuôn. Tách ra thì dễ đọc hẳn:

Giải phẫu một dòng log Odoo 19 và cách chỉnh cấp log: một dòng log gồm sáu phần là thời gian, PID, cấp log, tên database, tên logger tức module, và thông điệp; chỉnh cấp toàn cục bằng log-level bằng debug; chỉnh theo từng module bằng log-handler dạng MODULE hai chấm LEVEL lặp được nhiều lần ví dụ odoo.sql_db DEBUG và werkzeug CRITICAL; lối tắt log-sql bằng odoo.sql_db DEBUG và log-web bằng odoo.http DEBUG; thứ tự cấp DEBUG nhỏ hơn INFO nhỏ hơn WARNING nhỏ hơn ERROR nhỏ hơn CRITICAL

Hình 1: Sáu phần của một dòng log — thời gian, PID (id tiến trình), cấp (INFO/DEBUG/...), database (blog19), tên logger (chính là đường dẫn module, ví dụ odoo.addons.base...ir_cron), và thông điệp. Phần "tên logger" là chìa khoá: nó cho biết dòng log đến từ đâu, và cũng là thứ ta dùng để lọc.

Năm cấp log

Từ thấp đến cao: DEBUG < INFO < WARNING < ERROR < CRITICAL. Đặt cấp nào thì thấy từ cấp đó trở lên. Mặc định là INFO — nên bình thường bạn không thấy DEBUG.

# Toàn cục về DEBUG (rất ồn — thấy mọi thứ)
odoo --log-level=debug
# Chỉ muốn thấy cảnh báo trở lên (yên tĩnh)
odoo --log-level=warn

--log-level Odoo 19 nhận các giá trị: info (mặc định), debug, warn, error, critical, và vài mức đặc biệt như debug_sql, debug_rpc.

Chìa khoá thật sự: --log-handler=MODULE:LEVEL

Vấn đề của --log-level=debug là quá ồn — hàng nghìn dòng của mọi module đổ ra, thứ bạn cần chìm nghỉm. Giải pháp gọn hơn nhiều: bật DEBUG chỉ cho đúng module cần soi, còn lại giữ INFO.

# Soi SQL nhưng bịt bớt log request web
odoo --log-handler=odoo.sql_db:DEBUG --log-handler=werkzeug:CRITICAL

--log-handler nhận dạng MODULE:LEVEL và lặp được nhiều lần. MODULE chính là phần "tên logger" ở Hình 1. Vài lối tắt có sẵn:

  • --log-sql = --log-handler=odoo.sql_db:DEBUG — in mọi câu SQL kèm thời gian.
  • --log-web = --log-handler=odoo.http:DEBUG — chi tiết xử lý request HTTP.

Log SQL thật — thấy được truy vấn chậm

Đây là log thật khi tôi bật --log-handler=odoo.sql_db:DEBUG trên chính máy chủ của loạt bài này:

Log thật từ container odoo19 database blog19: phần trên là các dòng INFO bình thường gồm cron job Payment Post-process transactions chạy xong trong 0.01s và một dòng werkzeug ghi request GET web login trả 200; phần dưới sau khi bật log-handler odoo.sql_db DEBUG hiện các dòng DEBUG của odoo.sql_db gồm create cursor tới database postgres host odoo19-db, ConnectionPool tạo backend PID mới, và một câu query SELECT datname FROM pg_database kèm thời gian 0.427 ms

Hình 2: Log thật. Phần trên là các dòng INFO bình thường (cron job xong trong 0.01s, request GET /web/login trả 200). Phần dưới, sau khi bật DEBUG cho odoo.sql_db, mỗi câu SQL hiện ra kèm thời gian thực thi — ví dụ [0.427 ms] query: SELECT datname FROM pg_database .... Chính con số mili-giây này giúp bạn tìm ra truy vấn nào đang chậm.

Để ý: ở các dòng DEBUG SQL, cột database là ? vì lúc đó cursor còn đang kết nối tới database hệ thống postgres, chưa gắn vào blog19.

Cấu hình cố định trong odoo.conf

Không muốn gõ cờ mỗi lần, bạn đặt thẳng vào file odoo.conf:

[options]
log_level = info
; nhiều handler cách nhau bằng dấu phẩy
log_handler = odoo.sql_db:INFO,werkzeug:WARNING
logfile = /var/log/odoo/odoo.log

Trên production nên đặt logfile để log ghi vào file (xoay vòng bằng logrotate), và giữ werkzeug ở mức WARNING để không phình log vì mỗi request đều ghi một dòng.

Xem log trong Docker

Cả loạt bài này chạy Odoo trong Docker nên log ra stdout, xem bằng:

docker logs -f odoo19          # theo dõi trực tiếp
docker logs odoo19 | tail -50  # 50 dòng cuối
docker logs odoo19 2>&1 | grep -i error   # lọc lỗi

Nhớ ba ý

  1. Một dòng log Odoo gồm 6 phần; tên logger (đường dẫn module) là thứ cho biết dòng log đến từ đâu và dùng để lọc.
  2. --log-level chỉnh toàn cục; --log-handler=MODULE:LEVEL (lặp được) bật DEBUG chỉ cho module cần soi — gọn hơn nhiều.
  3. --log-sql in mọi câu SQL kèm thời gian để truy tìm truy vấn chậm; production nên đặt logfile và giữ werkzeug ở WARNING.

Đọc log rồi, bạn sẽ tò mò Odoo bên trong làm gì. Phần sau bàn một kỹ năng ít người dạy nhưng cực giá trị: đọc chính mã nguồn core của Odoo để học nhanh nhất.