Một kiểm tra sức khỏe VPN thêm một dòng mỗi phút âm thầm tạo ra nhiệm vụ thứ hai: quyết định cách những dòng đó rời khỏi đĩa. Việc sửa đường hầm không làm gì cho nhiệm vụ đó, và việc đổi tên tệp không chuyển hướng một tiến trình vẫn giữ mô tả cũ. Hãy trả lời câu hỏi về đích trước, rồi làm cho việc xoay khớp với cách tiến trình ghi mở nó.

Chọn đích trước chính sách xoay

Một unit systemd đã gửi đầu ra của nó vào nhật ký thì giữ việc lưu trữ ở một chỗ. journald áp đặt các giới hạn như SystemMaxUse và MaxRetentionSec , vì vậy một trình giám sát ghi ở đó thừa hưởng một giới hạn mà không cần thêm việc. Thêm một tệp thứ hai không giới hạn bên cạnh nó làm tăng gấp đôi công bảo trì mà không có lợi ích.

Một tệp chuyên dụng có chỗ đứng khi thứ khác đọc nó: một trình phân tích, một bản xuất kiểm toán hoặc một trang mong đợi một đường dẫn ổn định. Sau khi quyết định đó được đưa ra, tệp cần một chủ sở hữu, một chế độ và một chính sách xoay được viết cùng nhau, vì cả ba chỉ đúng khi là một bộ. Một đường dẫn ai cũng có thể tạo cũng là đường dẫn ai cũng có thể thay thế, nên quyền của thư mục thuộc cùng ghi chú đó. Viết tất cả những điều đó bên cạnh kiểm tra và lần sửa tiếp theo sẽ bắt đầu từ cùng các dữ kiện.

Viết khối cho khớp với tiến trình ghi

Bắt đầu từ một tiến trình ghi mở đường dẫn ở mỗi lần gọi, thêm một dòng và thoát. Mẫu đó tồn tại qua việc xoay mà không cần bất kỳ sự hợp tác nào từ tiến trình, vì lần chạy tiếp theo mở tệp hiện đang nằm trên đường dẫn đó. Khối bên dưới giữ một tuần phiên bản và tạo lại tệp với chủ sở hữu và chế độ mà tiến trình ghi cần:

/var/log/vpn-watchdog.log {
    daily
    rotate 7
    create 0600 root root
    missingok
    notifempty
}

Sổ tay logrotate định nghĩa số lượng là số phiên bản đã xoay được giữ lại, không phải là bảo đảm bảy ngày lịch sử, và từ khóa daily được đánh giá khi công việc chạy thay vì hoạt động như bộ lập lịch riêng của nó. Trên hầu hết các bản phân phối, một bộ hẹn giờ systemd hoặc một mục cron đã sở hữu lần gọi đó, vì vậy hãy kiểm tra cái nào tồn tại trước khi thêm cái thứ hai. Khớp quyền sở hữu quan trọng hơn số lượng giữ lại. Sao chép một chế độ chỉ dành cho root lên tệp do tài khoản dịch vụ ghi sẽ dừng ghi nhật ký ở lần xoay tiếp theo, và lỗi xuất hiện nhiều giờ sau đó dưới dạng dấu thời gian cũ thay vì lỗi. Xác nhận người dùng của tiến trình ghi trước khi sao chép một khối từ nơi khác.

Tiến trình ghi không bao giờ mở lại cần cách xử lý khác

Một tiến trình chạy lâu giữ mô tả mở tiếp tục ghi vào inode đã đổi tên. Không gian không được giải phóng và tệp nhìn thấy ngừng lớn, điều này trông giống như xoay bị hỏng cho đến khi bạn kiểm tra inode. Hoặc dạy tiến trình mở lại, hoặc làm cho việc xoay sao chép và cắt bớt thay vì đổi tên.

Đường mở lại là sạch nhất ở nơi phần mềm hỗ trợ: gửi tín hiệu được ghi tài liệu hoặc chạy lệnh được ghi tài liệu, và để tiến trình tự mở tệp mới. Giải pháp thay thế là copytruncate , sao chép nội dung sang tên đã xoay rồi cắt bớt bản gốc tại chỗ, vì vậy mô tả vẫn hợp lệ nhưng các lần ghi rơi giữa lúc sao chép và cắt sẽ mất.

Với các unit do systemd khởi động, hướng StandardOutput vào nhật ký hoặc vào một tệp và để unit sở hữu vòng đời. Một vòng lặp shell thêm qua tee -a không có giới hạn kích thước là cách bố trí làm đầy một phân vùng trong sự cố, vì một kiểm tra thất bại thường ghi nhiều hơn hẳn một kiểm tra khỏe mạnh.

Thử xoay mà không chờ bộ hẹn giờ

Chế độ gỡ lỗi báo cáo điều gì sẽ xảy ra và không chạm vào gì, khiến nó trở thành lần chạy đầu tiên an toàn sau khi sửa. Buộc một lần xoay thật khi bạn hài lòng, sau đó xác nhận rằng dòng nhật ký tiếp theo rơi vào tệp mới chứ không phải tệp đã đổi tên:

logrotate -d /etc/logrotate.d/vpn-watchdog
logrotate -f /etc/logrotate.d/vpn-watchdog
ls -l /var/log/vpn-watchdog.log*
tail -n 3 /var/log/vpn-watchdog.log
df -h /var/log

Đọc đầu ra theo thứ tự đó. Lần gỡ lỗi nên nêu tên tệp và các hành động dự định; lần chạy cưỡng bức nên tạo ra tên đã xoay như mong đợi; tail nên hiển thị một mục mới sau khi tiến trình ghi chạy lại. Giá trị df tăng lên cùng một tệp nhìn thấy đang thu nhỏ có nghĩa là vấn đề mô tả được mô tả ở trên.

Lặp lại lần chạy cưỡng bức hai lần để xem việc giữ lại hoạt động thế nào khi các phiên bản đã tồn tại. Xóa tệp cũ nhất là kết quả mong đợi, và việc không xóa thường có nghĩa là số lượng hoặc ký tự đại diện trong tên đã xoay không khớp với những gì logrotate đã tạo.

Giữ khả năng hoàn nguyên và bản ghi bằng văn bản

Lưu khối trước trước khi sửa, và ghi lại bộ lập lịch nào chạy nó, vì một lần hoàn nguyên khôi phục tệp nhưng không khôi phục bộ hẹn giờ sẽ tái tạo một nửa vấn đề ban đầu. Xoay một lần bằng tay sau khi khôi phục, sau đó xác nhận rằng tài khoản của tiến trình ghi có thể ghi vào đường dẫn nhật ký. Nếu dịch vụ chạy dưới systemd, hãy tải lại unit sau mọi thay đổi trong việc chuyển hướng đầu ra của nó, vì tiến trình đang chạy tiếp tục ghi vào mục tiêu cũ. Hãy tự đọc vài dòng nhật ký tiếp theo thay vì tin rằng unit đã trở lại sạch sẽ.

Ghi lại chế độ, chủ sở hữu, số lượng giữ lại và ngân sách đĩa dự kiến bên cạnh chính kiểm tra. Khi kiểm tra sau này chuyển từ một script một lần thành một daemon, chính sách xoay phải thay đổi theo nó, và ghi chú đó là thứ nói cho người tiếp theo biết giả định nào đã vỡ.

Cuối cùng, giữ quyết định về nhật ký tách khỏi quyết định khôi phục. Một kiểm tra thất bại nên tuân theo chính sách khôi phục của chính kết nối, không phải một quy tắc ẩn trong logrotate, và không có cách bố trí ghi nhật ký nào nên là lý do để khởi động lại một đường hầm đang hoạt động.

Bài viết liên quan