Ghi Log Hệ Thống Linux Toàn Tập: Từ Syslog, Rsyslog đến Journalctl và Logrotate

·

9 min read

Cover Image for Ghi Log Hệ Thống Linux Toàn Tập: Từ Syslog, Rsyslog đến Journalctl và Logrotate

Trong thế giới phức tạp của hệ điều hành Linux, việc ghi log (nhật ký) hệ thống đóng vai trò vô cùng quan trọng. Giống như một cuốn nhật ký chi tiết, log lưu giữ lại mọi sự kiện, thông báo lỗi, và hoạt động quan trọng, trở thành công cụ không thể thiếu cho việc truy vết sự cố, gỡ lỗi ứng dụng và giám sát an ninh.

Syslog / Rsyslog: Nền Tảng Ghi Log Của Linux

Syslog là một giao thức client/server tiêu chuẩn được sử dụng để chuyển thông điệp log từ thiết bị gửi đến một máy chủ nhận log tập trung. Trong khi đó, Rsyslog là một dịch vụ ghi log mạnh mẽ, được cải tiến từ syslog truyền thống và được cài đặt mặc định trên hầu hết các hệ điều hành Linux hiện nay. Rsyslog không chỉ thực hiện chức năng của syslog mà còn cung cấp nhiều tính năng mở rộng như lọc log, ghi log vào cơ sở dữ liệu, và truyền log qua TCP.

Các Tệp Log Quan Trọng Cần Biết

Khi bắt đầu làm việc với một hệ thống Linux, việc làm quen với các tệp log mặc định là rất cần thiết:

  • /var/log/messages (trên CentOS/RHEL) hoặc /var/log/syslog (trên Ubuntu/Debian): Đây là nơi lưu trữ hầu hết các thông báo và sự kiện chung của hệ thống. Bạn có thể theo dõi tệp log này theo thời gian thực bằng lệnh tail -f /var/log/syslog (hoặc messages).

  • /var/log/secure (trên CentOS/RHEL) hoặc /var/log/auth.log (trên Ubuntu/Debian): Lưu trữ thông tin liên quan đến xác thực và bảo mật, bao gồm lịch sử đăng nhập SSH, sử dụng quyền sudo. (Lưu ý: tài liệu ghi /var/log/secure.log cho cả CentOS và Ubuntu, nhưng tên phổ biến trên Ubuntu là auth.log.)

  • /var/log/wtmp: Ghi lại tất cả các phiên đăng nhập (login) và đăng xuất (logout) vào hệ thống.

Cấu Hình Rsyslog

Để tùy chỉnh cách Rsyslog hoạt động, bạn cần chỉnh sửa các tệp cấu hình:

  • Trên CentOS/RHEL: /etc/rsyslog.conf. Tệp này cũng chứa các quy tắc về quyền ghi log.

  • Trên Ubuntu/Debian: /etc/rsyslog.conf là tệp chính, nhưng để chỉnh sửa quyền và các quy tắc mặc định, bạn thường làm việc với /etc/rsyslog.d/50-default.conf.

Một quy tắc ghi log trong Rsyslog thường bao gồm hai phần chính:

  1. Phần 1 (Selector): Chỉ ra nguồn tạo ra log (facility) và mức độ ưu tiên/cảnh báo của log (priority), cách nhau bởi dấu chấm ".".

  2. Phần 2 (Action): Nơi lưu trữ log, có thể là một tệp cục bộ hoặc một máy chủ syslog từ xa.

Các nguồn tạo log (Facility) phổ biến:

  • kernel: Log từ nhân hệ điều hành.

  • user: Log từ các tiến trình ở cấp độ người dùng.

  • mail: Log từ hệ thống mail.

  • daemon: Log từ các tiến trình dịch vụ (daemon).

  • auth (hoặc authpriv): Log từ quá trình đăng nhập và xác thực.

  • syslog: Log từ chính dịch vụ syslogd/rsyslogd.

  • lpr: Log từ hệ thống in ấn.

  • cron: Log từ cron daemon.

  • ftp: Log từ ftp daemon.

  • ntp: Log từ dịch vụ NTP.

  • security: Log liên quan đến an ninh (thường trùng với auth).

  • console: Log cảnh báo từ console.

  • local0local7: Dành riêng cho quản trị viên sử dụng cho các log tùy chỉnh.

Các mức cảnh báo (Priority/Severity):

  • emerg (0): Tình trạng khẩn cấp, hệ thống không thể sử dụng.

  • alert (1): Cần can thiệp ngay lập tức (ví dụ: CSDL hỏng).

  • crit (2): Lỗi nghiêm trọng, thường liên quan đến thiết bị phần cứng.

  • err (3): Lỗi hệ thống.

  • warn (4): Cảnh báo.

  • notice (5): Thông báo quan trọng nhưng không phải lỗi.

  • info (6): Thông tin hoạt động.

  • debug (7): Thông tin gỡ lỗi.

  • none: Không ghi log từ facility này.

Ví dụ về cách khai báo Selector:

  • mail.info: Lưu log từ dịch vụ mail với mức cảnh báo info trở lên (từ 6 đến 0). (Hình ảnh: Ví dụ mail.info trong cấu hình)

  • mail.=info: Chỉ lưu log từ mail với mức info. (Hình ảnh: Ví dụ mail.=info)

  • mail.!info: Lưu tất cả log từ mail trừ mức info.

  • mail.*: Lưu tất cả các log từ dịch vụ mail. (Hình ảnh: Ví dụ mail.)*

Đọc File Log

Có nhiều cách để đọc nội dung các tệp log:

  • cat /path/to/logfile hoặc vi /path/to/logfile: Hiển thị toàn bộ nội dung (không khuyến khích với file lớn).

  • tail -f /path/to/logfile: Hiển thị các dòng cuối của file và theo dõi log mới được ghi theo thời gian thực.

  • grep "keyword" /path/to/logfile: Tìm kiếm các dòng chứa từ khóa cụ thể.

Lưu Log Tập Trung Với Rsyslog

Quản lý log trên từng máy chủ riêng lẻ có thể trở nên khó khăn. Thiết lập một hệ thống lưu log tập trung giúp đơn giản hóa việc theo dõi, phân tích và lưu trữ log từ nhiều nguồn.

Cấu hình trên Syslog Server:

  1. Chỉnh sửa tệp /etc/rsyslog.conf.

  2. Bỏ dấu # ở các dòng module imudp (cho UDP) và/hoặc imtcp (cho TCP) và các dòng input tương ứng để cho phép nhận log từ xa. Rsyslog hỗ trợ cả UDP và TCP (port mặc định 514). (Hình ảnh: Cấu hình module imtcp để nhận log qua TCP)

  3. Để máy chủ log tự động tạo thư mục riêng cho từng client, thêm dòng sau vào cuối file cấu hình (ví dụ lưu theo hostname, có thể thay HOSTNAME bằng fromhost-ip để lưu theo IP): $template RemoteServer, "/var/log/%HOSTNAME%/%SYSLOGFACILITY-TEXT%.log" *.* ?RemoteServer

  4. Mở port 514 trên firewall (ví dụ: sudo ufw allow 514). (Hình ảnh: Mở port 514 bằng ufw)

  5. Nạp lại dịch vụ rsyslog: sudo systemctl reload rsyslog.

Cấu hình trên các máy Client:

  1. Chỉnh sửa tệp cấu hình rsyslog (thường là /etc/rsyslog.conf hoặc trong /etc/rsyslog.d/).

  2. Thêm dòng sau vào phần RULES để gửi tất cả log (*.*) đến IP của Syslog Server qua port 514: *.* @@IP_SERVER_LOG:514 (sử dụng @@ cho TCP, @ cho UDP ). (Hình ảnh: Cấu hình client gửi log đến server)

  3. Khởi động lại dịch vụ rsyslog trên client.

Sau khi cấu hình, log từ client sẽ được gửi đến server và lưu vào các thư mục tương ứng, ví dụ /var/log/client_hostname/.

Lệnh "logger": Ghi Log Thủ Công

logger là một tiện ích dòng lệnh cho phép bạn gửi các thông điệp log vào hệ thống ghi log từ shell hoặc script. Điều này rất hữu ích để kiểm tra cấu hình log hoặc ghi lại các sự kiện tùy chỉnh.

Cú pháp: logger [OPTION] [LOG_MESSAGE].

Các tùy chọn phổ biến:

  • -f file: Ghi nội dung của file vào nhật ký.

  • -p priority: Ghi thông điệp với mức ưu tiên cụ thể (ví dụ local3.info). Mặc định là user.notice.

  • --size N: Giới hạn kích thước tối đa của một thông điệp là N ký tự.

  • -T: Sử dụng giao thức TCP (khi gửi đến server từ xa).

  • -d: Sử dụng giao thức UDP (khi gửi đến server từ xa).

  • -n server: Khai báo IP của log server (cho log tập trung).

Ví dụ: logger -p "local3.info" "Hello World from logger".

Logrotate: Quản Lý và Xoay Vòng File Log

logrotate là một công cụ tự động hóa việc quản lý các tệp log, giúp chúng không chiếm quá nhiều dung lượng ổ đĩa. Nó thực hiện việc xoay vòng log bằng cách đổi tên, nén, xóa, hoặc di chuyển các tệp log cũ theo các quy tắc đã định sẵn. Logrotate thường chạy tự động hàng ngày thông qua cron (/etc/cron.daily/logrotate).

  • Cấu hình chính: /etc/logrotate.conf (chứa các thiết lập toàn cục).

  • Cấu hình cho từng dịch vụ: Các tệp trong thư mục /etc/logrotate.d/. Ví dụ, tạo tệp /etc/logrotate.d/sshd để cấu hình xoay vòng log cho dịch vụ sshd.

Các từ khóa cấu hình phổ biến trong Logrotate:

  • daily, weekly, monthly, yearly: Tần suất xoay vòng.

  • rotate N: Giữ lại N bản log cũ.

  • compress / nocompress: Nén (mặc định gzip) hoặc không nén log cũ.

  • delaycompress: Hoãn việc nén đến lần xoay vòng tiếp theo.

  • missingok: Không báo lỗi nếu file log không tồn tại.

  • notifempty: Không xoay vòng nếu file log trống.

  • create mode owner group: Tạo file log mới với quyền và chủ sở hữu cụ thể sau khi xoay vòng.

  • postrotate script ... endscript: Chạy script sau khi xoay vòng (thường dùng để khởi động lại dịch vụ).

  • prerotate script ... endscript: Chạy script trước khi xoay vòng.

  • sharescripts: Chỉ chạy script trong postrotate một lần sau khi tất cả các log trong cùng một khối cấu hình đã được xoay vòng, giúp giảm thời gian chạy.

Kiểm tra cấu hình Logrotate: logrotate -d /etc/logrotate.d/your_config_file (chế độ debug, không thực hiện xoay vòng thật).

Journalctl: Ghi Log Với Systemd

Trên các hệ thống Linux sử dụng systemd làm hệ thống init, journald (Systemd Journal Daemon) là dịch vụ quản lý log trung tâm. journalctl là công cụ dòng lệnh để truy vấn và hiển thị các log này.

  • File cấu hình: /etc/systemd/journald.conf.

  • Lưu trữ log: Log được lưu ở định dạng nhị phân, thường trong /var/log/journal.

  • Xem log cơ bản: journalctl (hiển thị tất cả log, từ cũ nhất đến mới nhất, có thể bất tiện với hệ thống nhiều log ).

Các tùy chọn journalctl hữu ích:

  • journalctl -p priority: Lọc log theo mức cảnh báo (0-emerg, 1-alert, 2-crit, 3-err, 4-warn, 5-notice, 6-info, 7-debug).

  • journalctl --list-boots: Liệt kê các lần khởi động của hệ thống (Boot Track Number, Boot ID, thời gian).

  • journalctl -b <boot_track_number_or_boot_id>: Xem log của một lần khởi động cụ thể.

  • journalctl --since "YYYY-MM-DD HH:MM:SS" (hoặc yesterday, today, now): Xem log từ một thời điểm cụ thể.

  • journalctl -u <service_name>: Xem log của một dịch vụ cụ thể (ví dụ: journalctl -u cron.service). Nếu chưa biết tên service, có thể dùng systemctl list-units --type=service để liệt kê.

  • journalctl /path/to/executable: Xem log liên quan đến một chương trình thực thi cụ thể.

Kết Luận

Ghi log hệ thống là một phần không thể thiếu trong việc quản trị và duy trì sự ổn định của bất kỳ hệ thống Linux nào. Từ Rsyslog truyền thống đến Journald hiện đại, cùng với các công cụ hỗ trợ như Logger và Logrotate, Linux cung cấp một hệ sinh thái mạnh mẽ để thu thập, quản lý và phân tích log. Việc hiểu và tận dụng hiệu quả các công cụ này sẽ giúp bạn nhanh chóng phát hiện sự cố, đảm bảo an ninh và tối ưu hóa hiệu suất hoạt động của hệ thống.