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:

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:

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 ý
- 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.
--log-levelchỉ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.--log-sqlin mọi câu SQL kèm thời gian để truy tìm truy vấn chậm; production nên đặtlogfilevà 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.