Quản lý và Cắt Xoay Nhật Ký trên CentOS với Logrotate

Trong môi trường Linux, các tệp nhật ký (log files) đóng vai trò quan trọng trong việc ghi nhận mọi hoạt động và sự kiện của hệ thống. Tuy nhiên, việc ghi liên tục này có thể khiến các tệp nhật ký phát triển đến kích thước khổng lồ, gây tiêu tốn không gian lưu trữ và làm khó khăn cho việc phân tích, tìm kiếm thông tin khi cần thiết. Để giải quyết vấn đề này, cơ chế cắt xoay nhật ký tự động là giải pháp thiết yếu. Trên các hệ thống CentOS, công cụ logrotate được sử dụng rộng rãi để quản lý và tự động cắt xoay các tệp nhật ký.

1. Cấu hình Logrotate

Các tệp cấu hình chính của logrotate nằm ở hai vị trí:

  • /etc/logrotate.conf: Đây là tệp cấu hình chính, chứa các thiết lập mặc định và bao gồm tất cả các tệp cấu hình chi tiết khác.
  • /etc/logrotate.d/: Thư mục này chứa các tệp cấu hình riêng biệt cho từng dịch vụ hoặc ứng dụng cụ thể. Các tệp trong thư mục này sẽ được đọc và thực thi bởi /etc/logrotate.conf.

Tiến trình logrotate được thực thi định kỳ bởi dịch vụ crond thông qua tập lệnh /etc/cron.daily/logrotate, thường chạy mỗi ngày một lần. Nội dung của tập lệnh này có thể được xem như sau:

# cat /etc/cron.daily/logrotate
#!/bin/sh

# Đường dẫn đến công cụ logrotate và các tệp cấu hình/trạng thái
LOGROTATE_BIN="/usr/sbin/logrotate"
STATUS_FILE="/var/lib/logrotate/logrotate.status"
MAIN_CONFIG="/etc/logrotate.conf"

# Thực thi logrotate với tệp trạng thái và cấu hình chính
$LOGROTATE_BIN -s $STATUS_FILE $MAIN_CONFIG
EXIT_CODE=$? # Lấy mã thoát của lệnh logrotate

# Nếu có lỗi, ghi lại thông báo cảnh báo
if [ $EXIT_CODE -ne 0 ]; then
    /usr/bin/logger -t "logrotate" "Cảnh báo: logrotate kết thúc với mã lỗi [$EXIT_CODE]"
fi

exit 0

Tập lệnh trên gọi công cụ /usr/sbin/logrotate, truyền vào tệp trạng thái để ghi lại lần cắt xoay cuối cùng và tệp cấu hình chính. Sau đó, nó kiểm tra mã thoát để xác định xem quá trình có thành công hay không, và ghi lại cảnh báo nếu có lỗi.

Tiếp theo, chúng ta sẽ xem xét tệp cấu hình chính /etc/logrotate.conf (chỉ hiển thị các dòng không phải comment hoặc trống):

# grep -vE "^$|^#" /etc/logrotate.conf
weekly                  # Cắt xoay nhật ký hàng tuần
rotate 4                # Giữ lại 4 bản sao đã cắt xoay (không tính tệp mới)
create                  # Tạo một tệp nhật ký mới trống sau khi cắt xoay
dateext                 # Sử dụng ngày làm hậu tố cho tên tệp đã cắt xoay
include /etc/logrotate.d # Bao gồm tất cả các tệp cấu hình trong thư mục này

/var/log/wtmp {         # Cấu hình cụ thể cho tệp /var/log/wtmp
    monthly             # Cắt xoay hàng tháng
    create 0664 root utmp # Tạo tệp mới với quyền 0664, chủ sở hữu root, nhóm utmp
    minsize 1M          # Chỉ cắt xoay nếu tệp đạt kích thước tối thiểu 1MB
    rotate 1            # Giữ lại 1 bản sao đã cắt xoay
}

/var/log/btmp {         # Cấu hình cụ thể cho tệp /var/log/btmp
    missingok           # Bỏ qua lỗi nếu tệp nhật ký không tồn tại
    monthly             # Cắt xoay hàng tháng
    create 0600 root utmp # Tạo tệp mới với quyền 0600, chủ sở hữu root, nhóm utmp
    rotate 1            # Giữ lại 1 bản sao đã cắt xoay
}

Các tham số cấu hình quan trọng:

  • missingok: Bỏ qua lỗi nếu tệp nhật ký không tồn tại khi thực hiện cắt xoay.
  • daily, weekly, monthly, yearly: Chỉ định tần suất cắt xoay là hàng ngày, hàng tuần, hàng tháng hoặc hàng năm.
  • create MODE OWNER GROUP: Sau khi cắt xoay, tạo một tệp nhật ký mới với các quyền (MODE), chủ sở hữu (OWNER) và nhóm (GROUP) được chỉ định.
  • nocreate: Không tạo tệp nhật ký mới sau khi cắt xoay.
  • rotate N: Giữ lại N bản sao đã cắt xoay, các bản cũ hơn sẽ bị xóa.
  • dateext: Thêm hậu tố ngày vào tên tệp nhật ký đã xoay (ví dụ: .YYYYMMDD).
  • dateformat .%Y-%m-%d: Kết hợp với dateext, định dạng hậu tố ngày. Chỉ hỗ trợ %Y, %m, %d, %s.
  • size SIZE / minsize SIZE: Chỉ cắt xoay khi tệp đạt kích thước SIZE. Đơn vị mặc định là byte, có thể dùng k cho KB và M cho MB.
  • compress: Nén các tệp nhật ký đã xoay bằng gzip.
  • nocompress: Vô hiệu hóa tính năng nén.
  • delaycompress: Sử dụng cùng với compress. Tệp nhật ký vừa được xoay sẽ không bị nén ngay lập tức, mà sẽ bị nén trong lần cắt xoay tiếp theo.
  • ifempty: Thực hiện cắt xoay ngay cả khi tệp nhật ký trống.
  • notifempty: Không cắt xoay nếu tệp nhật ký trống.
  • prerotate / endscript: Các lệnh đặt giữa hai chỉ thị này sẽ được thực thi trước khi quá trình cắt xoay diễn ra.
  • postrotate / endscript: Các lệnh đặt giữa hai chỉ thị này sẽ được thực thi sau khi quá trình cắt xoay hoàn tất.
  • sharescripts: Nếu nhiều tệp nhật ký được cấu hình trong cùng một khối, tập lệnh prerotate/ postrotate sẽ chỉ chạy một lần sau khi tất cả các tệp đã được xử lý. Nếu không có sharescripts, tập lệnh sẽ chạy cho mỗi tệp.
  • errors ADDRESS: Gửi thông báo lỗi trong quá trình cắt xoay đến địa chỉ email được chỉ định.
  • mail ADDRESS: Gửi tệp nhật ký đã xoay đến địa chỉ email được chỉ định.
  • nomail: Không gửi tệp nhật ký đã xoay qua email.
  • olddir DIRECTORY: Đặt các tệp nhật ký đã xoay vào thư mục được chỉ định. Thư mục này phải nằm trên cùng hệ thống tệp với tệp nhật ký gốc.
  • noolddir: Đặt các tệp nhật ký đã xoay trong cùng thư mục với tệp gốc.
  • copytruncate: Phương pháp cắt xoay cho các tệp nhật ký đang được ghi. Nó sao chép tệp nhật ký gốc, sau đó cắt ngắn tệp gốc về 0 byte. Có thể làm mất một lượng nhỏ dữ liệu nhật ký giữa thời điểm sao chép và cắt ngắn.
  • nocopytruncate: Không sử dụng phương pháp copytruncate.

2. Kiểm tra thời gian cắt xoay gần nhất

Tệp /var/lib/logrotate/logrotate.status lưu trữ thông tin về lần cuối cùng mỗi tệp nhật ký được logrotate xử lý. Bạn có thể xem nội dung của tệp này để biết trạng thái:

# cat /var/lib/logrotate/logrotate.status
logrotate state -- version 2
"/var/log/yum.log" 2023-11-20-05:15:0
"/var/log/cups/page_log" 2023-10-01-03:00:0
"/var/log/boot.log" 2024-03-10-08:00:0
"/var/log/secure" 2024-04-20-09:30:0
"/var/log/messages" 2024-04-20-09:30:0
"/var/log/cron" 2024-04-20-09:30:0
"/var/log/maillog" 2024-04-20-09:30:0
"/var/log/wtmp" 2023-10-01-03:00:0
"/var/log/btmp" 2023-10-01-03:00:0
# ... và các tệp nhật ký khác

3. Thiết lập cắt xoay nhật ký tùy chỉnh (Ví dụ: Log SSHD)

Để minh họa, chúng ta sẽ cấu hình rsyslog để ghi nhật ký dịch vụ sshd vào một tệp riêng, sau đó thiết lập quy tắc cắt xoay cho tệp này.

Bước 1: Cấu hình rsyslog để ghi nhật ký SSHD riêng

Thêm một dòng vào cuối tệp /etc/rsyslog.conf để định tuyến các thông báo local0 đến /var/log/custom_sshd.log:

# echo "local0.* /var/log/custom_sshd.log" | sudo tee -a /etc/rsyslog.conf

Thay đổi SyslogFacility trong /etc/ssh/sshd_config thành local0:

# sudo sed -i 's/^#SyslogFacility AUTHPRIV/SyslogFacility local0/' /etc/ssh/sshd_config
# sudo sed -i 's/^SyslogFacility AUTHPRIV/SyslogFacility local0/' /etc/ssh/sshd_config

Tạo tệp nhật ký mới, đặt quyền và chủ sở hữu phù hợp, sau đó khởi động lại các dịch vụ:

# sudo touch /var/log/custom_sshd.log
# sudo chmod 640 /var/log/custom_sshd.log
# sudo chown root:adm /var/log/custom_sshd.log

# sudo systemctl restart sshd
# sudo systemctl restart rsyslog.service

# Kiểm tra tệp nhật ký sau khi ghi nhận một vài hoạt động SSH (ví dụ: đăng nhập và thoát)
# ls -l /var/log/custom_sshd.log
-rw-r-----. 1 root adm 520 4月 22 10:30 /var/log/custom_sshd.log

Bước 2: Tạo tệp cấu hình logrotate tùy chỉnh

Tạo một tệp cấu hình mới trong /etc/logrotate.d/, ví dụ /etc/logrotate.d/custom_sshd:

# sudo vim /etc/logrotate.d/custom_sshd

Với nội dung sau:

/var/log/custom_sshd.log {
    missingok
    daily               # Cắt xoay hàng ngày
    rotate 7            # Giữ lại 7 bản sao đã xoay
    compress            # Nén các tệp nhật ký đã xoay
    delaycompress       # Trì hoãn nén tệp gần nhất cho đến lần cắt xoay sau
    create 0640 root adm # Tạo tệp mới với quyền 0640, chủ sở hữu root, nhóm adm
    notifempty          # Không cắt xoay nếu tệp nhật ký trống
    postrotate          # Các lệnh chạy sau khi cắt xoay hoàn tất
        /usr/bin/systemctl reload rsyslog.service > /dev/null 2>&1 || true
    endscript
}

Bước 3: Buộc thực thi và kiểm tra kết quả

Để kiểm tra ngay lập tức cấu hình mới, bạn có thể buộc logrotate thực thi với tùy chọn -f (force) và -v (verbose để hiển thị chi tiết):

# sudo logrotate -vf /etc/logrotate.d/custom_sshd
reading config file /etc/logrotate.d/custom_sshd
Allocating hash table for state file, size 15360 B

Handling 1 logs

rotating pattern: /var/log/custom_sshd.log forced from command line (7 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/custom_sshd.log
  log needs rotating
rotating log /var/log/custom_sshd.log, log->rotateCount is 7
dateext suffix '-20240422'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
fscreate context set to unconfined_u:object_r:var_log_t:s0
renaming /var/log/custom_sshd.log to /var/log/custom_sshd.log-20240422
creating new /var/log/custom_sshd.log mode = 0640 uid = 0 gid = 27
set default create context
running postrotate script
reloading rsyslog service

Sau khi thực thi, kiểm tra các tệp nhật ký trong thư mục /var/log/:

# ls -l /var/log/custom_sshd*
-rw-r-----. 1 root adm    0 4月 22 10:35 /var/log/custom_sshd.log
-rw-r-----. 1 root adm  520 4月 22 10:30 /var/log/custom_sshd.log-20240422

Bạn sẽ thấy tệp custom_sshd.log đã được đổi tên thành custom_sshd.log-YYYYMMDD và một tệp custom_sshd.log mới, trống đã được tạo. Tùy chọn -d có thể được sử dụng để chạy logrotate ở chế độ "dry run" (chỉ mô phỏng) mà không thực sự thay đổi bất kỳ tệp nào, rất hữu ích cho việc kiểm tra cấu hình.

Thẻ: CentOS linux Logrotate Log Management syslog

Đăng vào ngày 11 tháng 11 lúc 17:48