Hướng Dẫn Cấu Hình và Sử Dụng Logrotate để Quản Lý Logfiles Hiệu Quả trên Ubuntu 20.04

Cấu Hình và Sử Dụng Logrotate để Quản Lý Logfiles

Logrotate là một công cụ quan trọng trong việc quản lý log hệ thống, giúp tự động xoay vòng, nén và dọn dẹp các tệp log để tránh tình trạng đầy ổ đĩa theo thời gian. Nếu không được quản lý đúng cách, các tệp log có thể phát triển không kiểm soát, làm ảnh hưởng đến hiệu suất và tài nguyên hệ thống.

Trên Ubuntu 20.04, Logrotate được cài đặt sẵn và cấu hình sẵn để xử lý log của hầu hết các gói phần mềm, bao gồm cả rsyslog, trình quản lý log mặc định của hệ thống. Nhờ khả năng tự động hóa việc quản lý log, Logrotate giúp duy trì hệ thống hoạt động ổn định mà không cần can thiệp thủ công.

Để quản lý logfiles hiệu quả trên Ubuntu 20.04, logrotate là công cụ không thể thiếu. Nếu bạn đang tìm kiếm giải pháp tối ưu chi phí cho hệ thống, hãy khám phá các gói VPS giá rẻ tại DataOnline, đảm bảo hiệu suất cao và hỗ trợ quản lý log mượt mà.

Yêu cầu

Bài hướng dẫn này giả định bạn có một máy chủ Ubuntu 20.04 với một người dùng không phải root có quyền sudo, như đã mô tả trong bài Thiết Lập Máy Chủ Ban Đầu với Ubuntu 20.04 của DataOnline.

Logrotate có sẵn trên nhiều bản phân phối Linux khác, nhưng cấu hình mặc định có thể khá khác nhau. Các phần còn lại của bài hướng dẫn vẫn áp dụng miễn là phiên bản Logrotate của bạn tương tự như trên Ubuntu 20.04. Hãy làm theo Bước 1 để xác định phiên bản Logrotate của bạn.

Đăng nhập vào máy chủ với tài khoản có quyền sudo để bắt đầu.

Bước 1 – Xác nhận phiên bản Logrotate

Logrotate được cài đặt sẵn trên Ubuntu. Tuy nhiên, nếu bạn cần cài đặt nó, hãy chạy các lệnh sau để cập nhật danh sách gói và cài đặt Logrotate:

sudo apt update
sudo apt install logrotate

Nếu bạn đang sử dụng một máy chủ không phải Ubuntu, hãy đảm bảo rằng Logrotate đã được cài đặt bằng cách yêu cầu thông tin phiên bản:

logrotate --version
Output
logrotate 3.14.0

    Default mail command:       /usr/bin/mail
    Default compress command:   /bin/gzip
    Default uncompress command: /bin/gunzip
    Default compress extension: .gz
    Default state file path:    /var/lib/logrotate/status
    ACL support:                yes
    SELinux support:            yes

Nếu Logrotate đã được cài đặt nhưng số phiên bản khác xa, bạn có thể gặp phải một số vấn đề với các tùy chọn cấu hình được khám phá trong bài viết này. Hãy tham khảo tài liệu của Logrotate cho phiên bản cụ thể của bạn bằng cách chạy:

man logrotate

Bạn cũng có thể tra cứu phiên bản trực tuyến của tài liệu Logrotate. Tiếp theo, chúng ta sẽ xem cấu trúc cấu hình mặc định của Logrotate trên Ubuntu.

Bước 2 – Khám phá cấu hình Logrotate

Thông tin cấu hình của Logrotate trên Ubuntu thường có ở hai nơi:

/etc/logrotate.conf: Tệp này chứa một số cài đặt mặc định và thiết lập việc luân phiên cho một vài tệp log không thuộc bất kỳ gói hệ thống nào. Tệp này cũng sử dụng lệnh include để nạp cấu hình từ bất kỳ tệp nào trong thư mục /etc/logrotate.d.

/etc/logrotate.d/: Đây là nơi các gói phần mềm cài đặt cần hỗ trợ luân phiên log sẽ đặt cấu hình Logrotate của chúng. Trên một cài đặt chuẩn, bạn sẽ có sẵn các tệp cấu hình cho các công cụ hệ thống cốt lõi như apt, dpkg, rsyslog, v.v.

Theo mặc định, /etc/logrotate.conf sẽ cấu hình luân phiên log hàng tuần, với các tệp log thuộc quyền sở hữu của người dùng root và nhóm syslog, giữ lại 4 tệp log cũ (rotate 4), và tạo các tệp log mới rỗng sau khi tệp hiện tại được luân phiên (create).

Hãy xem một ví dụ về tệp cấu hình Logrotate của gói apt. Chạy lệnh sau:

cat /etc/logrotate.d/apt
Output
/var/log/apt/term.log {
  rotate 12
  monthly
  compress
  missingok
  notifempty
}

/var/log/apt/history.log {
  rotate 12
  monthly
  compress
  missingok
  notifempty
}

Tệp này chứa các khối cấu hình cho hai tệp log khác nhau trong thư mục /var/log/apt: term.loghistory.log

Chúng đều sử dụng các tùy chọn sau (bất kỳ tùy chọn nào không được đặt trong khối cấu hình này sẽ kế thừa giá trị mặc định hoặc giá trị đã được cấu hình trong /etc/logrotate.conf):

rotate 12: Giữ lại 12 tệp log cũ (ghi đè tùy chọn mặc định rotate 4).
monthly: Luân phiên log hàng tháng (ghi đè tùy chọn mặc định hàng tuần).
compress: Nén các tệp log sau khi luân phiên; theo mặc định sử dụng gzip và tạo tệp với đuôi .gz. Tùy chọn nén có thể được thay đổi bằng compresscmd.
missingok: Không hiển thị thông báo lỗi nếu tệp log không tồn tại.
notifempty: Không luân phiên tệp log nếu nó trống.

Các tệp cấu hình này cũng kế thừa hành vi mặc định create, chỉ dẫn Logrotate tự động tạo tệp log mới sau khi luân phiên. Hành vi này có thể được ghi đè bằng tùy chọn nocreate, mặc dù điều đó sẽ vô hiệu hoá hầu hết các chức năng khác.

Có rất nhiều tùy chọn cấu hình khác có sẵn. Bạn có thể tìm hiểu tất cả bằng cách gõ lệnh man logrotate trên dòng lệnh để mở trang hướng dẫn của Logrotate.

Tiếp theo, chúng ta sẽ thiết lập một tệp cấu hình để xử lý các tệp log cho một dịch vụ giả định có tên your-app.

Bước 3 – Thiết lập cấu hình ví dụ

Để quản lý tệp log cho các ứng dụng bên ngoài các dịch vụ hệ thống đã được đóng gói sẵn, bạn có hai lựa chọn:

  1. Tạo một tệp cấu hình Logrotate mới và đặt nó vào /etc/logrotate.d/. Tệp này sẽ được chạy hàng ngày với quyền root cùng với các tác vụ Logrotate chuẩn khác.

  2. Tạo một tệp cấu hình mới và chạy nó ngoài cấu hình Logrotate mặc định của Ubuntu. Điều này chỉ cần thiết nếu bạn muốn chạy Logrotate với tư cách người dùng không phải root, hoặc nếu bạn muốn luân phiên log thường xuyên hơn hàng ngày (vì một cấu hình hàng giờ trong /etc/logrotate.d/ sẽ không hiệu quả do hệ thống Logrotate của Ubuntu chỉ chạy một lần mỗi ngày).

Hãy cùng xem qua hai phương án với các ví dụ cụ thể.

Thêm cấu hình vào

Giả sử bạn muốn cấu hình luân phiên log cho một máy chủ web giả định tạo tệp access.logerror.log trong thư mục /var/log/your-app/, và dịch vụ này chạy với người dùng và nhóm www-data.

Để thêm cấu hình cho tệp log của your-app vào thư mục /etc/logrotate.d/, mở một tệp mới:

sudo nano /etc/logrotate.d/your-app

Thêm các dòng sau vào tệp cấu hình:

/etc/logrotate.d/your-app
/var/log/your-app/*.log {
    daily
    missingok
    rotate 14
    compress
    notifempty
    create 0640 www-data www-data
    sharedscripts
    postrotate
        systemctl reload your-app
    endscript
}

Giải thích một số chỉ thị mới:

create 0640 www-data www-data: Tạo một tệp log mới rỗng sau khi luân phiên, với quyền 0640, chủ sở hữu và nhóm là www-data.
sharedscripts: Tham số này có nghĩa rằng các script được thêm vào sẽ chạy chỉ một lần cho toàn bộ tệp log khớp với mẫu (do sử dụng wildcard *). Nếu không có tham số này, script trong phần postrotate sẽ chạy cho mỗi tệp log được xử lý.
postrotateendscript: Khối này chứa script được chạy sau khi tệp log được luân phiên. Trong ví dụ này, chúng ta đang reload ứng dụng giả định your-app để nó chuyển sang tệp log mới. Lưu ý rằng postrotate chạy trước khi các tệp log được nén. Nếu bạn cần chạy tác vụ sau khi các tệp log được nén, hãy sử dụng khối lastaction thay thế.

Để lưu và thoát khỏi nano, nhấn Ctrl+X, sau đó nhấn YEnter. Bạn có thể thử nghiệm tệp cấu hình bằng cách thực hiện chạy thử (dry run):

sudo logrotate /etc/logrotate.conf --debug

Lệnh này gọi logrotate, trỏ nó đến tệp cấu hình tiêu chuẩn và bật chế độ gỡ lỗi. Thông tin sẽ được in ra cho biết những tệp log nào Logrotate xử lý và những gì nó sẽ thực hiện với chúng. Nếu mọi thứ trông ổn, quá trình thiết lập của bạn đã hoàn tất. Nhiệm vụ Logrotate tiêu chuẩn sẽ chạy hàng ngày và bao gồm cấu hình mới của bạn.

Tiếp theo, chúng ta sẽ thử thiết lập một cấu hình không sử dụng cấu hình mặc định của Ubuntu.

Bước 4 – Tạo cấu hình Logrotate độc lập

Trong ví dụ này, giả sử bạn có một ứng dụng chạy với người dùng sammy và tạo tệp log nằm trong thư mục /home/sammy/logs/. Bạn muốn luân phiên các tệp log này hàng giờ, vì vậy bạn cần thiết lập cấu hình ngoài khuôn khổ /etc/logrotate.d/ mặc định của Ubuntu.

Trước tiên, tạo tệp cấu hình trong thư mục home:

nano /home/sammy/logrotate.conf

Sau đó, dán cấu hình sau vào tệp:

/home/sammy/logrotate.conf
/home/sammy/logs/*.log {
    hourly
    missingok
    rotate 24
    compress
    create
}

Lưu và đóng tệp. Chúng ta đã gặp tất cả các tùy chọn này trong các bước trước, nhưng hãy tổng kết lại:Cấu hình này sẽ luân phiên các tệp log hàng giờ, nén và giữ lại 24 tệp log cũ, tạo một tệp log mới để thay thế tệp đã luân phiên.

Bạn cần tùy chỉnh cấu hình này sao cho phù hợp với ứng dụng của mình, nhưng đây là một điểm khởi đầu tốt. Để kiểm tra xem cấu hình có hoạt động hay không, hãy tạo một tệp log. Thực hiện các bước sau chuyển đến thư mục home của người dùng bằng lệnh. Tạo một thư mục để lưu trữ log. Tạo một tệp trống trong thư mục logs:

cd ~
mkdir logs
touch logs/access.log

Bây giờ, khi đã có một tệp log trống ở vị trí chính xác, hãy chạy lệnh logrotate. Vì các tệp log thuộc sở hữu của sammy, bạn không cần sử dụng sudo. Tuy nhiên, bạn cần chỉ định tệp trạng thái (state file). Tệp trạng thái này ghi nhận những gì logrotate đã thấy và những hành động đã thực hiện trong lần chạy trước, để biết nên làm gì trong lần chạy tiếp theo. Khi sử dụng cấu hình mặc định của Ubuntu, tệp trạng thái được lưu tại /var/lib/logrotate/status; nhưng vì chúng ta không sử dụng cấu hình mặc định, nên cần chỉ định vị trí tệp trạng thái thủ công.

Chúng ta sẽ để logrotate lưu tệp trạng thái ngay trong thư mục home. Chạy lệnh sau để sử dụng tệp /home/sammy/logrotate.conf mà bạn đã tạo và ghi nhận trạng thái:

logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose
Output
reading config file /home/sammy/logrotate.conf

Handling 1 logs

rotating pattern: /home/sammy/logs/*.log  hourly (24 rotations)
empty log files are rotated, old logs are removed
considering log /home/sammy/logs/access.log
  log does not need rotating

Tham số --verbose sẽ in ra thông tin chi tiết về quá trình logrotate đang thực hiện. Trong trường hợp này, nó không luân phiên tệp log vì đây là lần đầu tiên logrotate gặp tệp này và thời gian chưa đủ (0 giờ), do đó tệp không cần luân phiên.

Nếu bạn xem tệp trạng thái bằng lệnh:

cat /home/sammy/logrotate-state
Output
logrotate state -- version 2
"/home/sammy/logs/access.log" 2021-12-3-19:0:0

Logrotate đã ghi nhận thông tin về tệp log và thời điểm xử lý cuối cùng. Nếu bạn chạy lại lệnh sau một giờ, tệp log sẽ được luân phiên như dự kiến.

Nếu bạn muốn ép logrotate luân phiên tệp log ngay cả khi không đạt điều kiện, sử dụng tham số --force:

logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose --force

Tham số này hữu ích khi bạn đang kiểm tra các script như postrotate và các tác vụ khác.

Cuối cùng, bạn cần thiết lập một cron job để chạy logrotate hàng giờ. Mở crontab cho người dùng:

crontab -e

Nếu đây là lần đầu tiên bạn sử dụng cron, bạn có thể được hỏi chọn trình soạn thảo mặc định (chúng tôi khuyến nghị nano cho người mới). Di chuyển con trỏ xuống cuối tệp và thêm dòng sau:

crontab
14 * * * * /usr/sbin/logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state

Dòng lệnh này sẽ chạy vào phút thứ 14 của mỗi giờ, hàng ngày. Nó chạy gần như lệnh logrotate bạn đã thử nghiệm, với đường dẫn đầy đủ của logrotate/usr/sbin/logrotate để đảm bảo an toàn. Việc sử dụng đường dẫn đầy đủ trong cron là một thói quen tốt. Bạn có thể tham khảo thêm các hướng dẫn khác về cron nếu cần.

Lưu tệp và thoát. Cron job này sẽ được cài đặt và tác vụ của bạn sẽ chạy theo lịch trình đã chỉ định. Sau khoảng một giờ, bạn sẽ thấy tệp log được luân phiên và nén (ví dụ: access.log.1.gz hoặc access.log.2.gz nếu bạn đã chạy logrotate với tham số --force).

Kết luận

Trong bài hướng dẫn này, chúng ta đã kiểm tra phiên bản Logrotate, tìm hiểu cấu hình mặc định trên Ubuntu và thiết lập hai cấu hình tùy chỉnh khác nhau để quản lý các tệp log. Nếu bạn muốn khám phá thêm các lệnh và tùy chọn cấu hình của Logrotate, hãy tham khảo tài liệu chi tiết của nó bằng cách sử dụng lệnh trong terminal hoặc truy cập tài liệu trực tuyến để hiểu rõ hơn về các tính năng mạnh mẽ của công cụ này.

Sau khi cấu hình logrotate, bạn có thể tối ưu hệ thống hơn nữa bằng cách thuê VPS chất lượng. DataOnline cung cấp dịch vụ VPS tốc độ cao, dễ dàng quản lý logfiles, giúp hệ thống vận hành ổn định và tiết kiệm thời gian cho quản trị viên.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *