Làm thế nào để tránh tải lại apache khi quay nhật ký?


25

Tôi sử dụng logrotate để xoay các bản ghi truy cập, lỗi và ghi lại của Apache. Tập tin cấu hình của tôi trông như thế này:

/apache/*log {
    compress
    dateext
    rotate 365
    size=+300M
    olddir /log/old/apache
    notifempty
    missingok
    lastaction
     /bin/apache reload
    endscript
}

Vấn đề của tôi là bất cứ khi nào một vòng quay xảy ra, Apache phải được tải lại bởi vì Apache không viết thêm nữa trong logfile vừa xoay. Có cách nào để tránh Apache tải lại mỗi lần logrotate không?

Câu trả lời:


42

Lý do mà apache cần tải lại là vì một khi nó đã mở một tệp, nó sẽ nhận được một tệp cho nó và nó sẽ tiếp tục ghi vào tệp đó. Khi bạn di chuyển tệp, nó không thấy điều đó, nó chỉ tiếp tục ghi vào cùng một điều khiển. Khi bạn thực hiện tải lại, nó sẽ mở lại tệp và xử lý mới.

Để tránh tải lại, thay vì di chuyển tệp, bạn có thể sao chép tệp và làm trống tệp cũ. Bằng cách đó, apache có thể tiếp tục viết vào cùng một tập tin. Bạn làm điều này bằng cách thêm tùy chọn "copytruncate" vào tệp cấu hình logrotate, như thế này:

/apache/*log {
    copytruncate
    compress
    dateext
    rotate 365
    size=+300M
    olddir /log/old/apache
    notifempty
    missingok
}

Cảm ơn câu trả lời của bạn. Vì vậy, tôi đoán khi tôi thêm lastaction echo "" | /apache/*log endscriptfilehandle không bị "mất"?
đàn hạc

3
Xin lỗi, tôi nên nói "copytruncate" thay vì "copy". Sau đó, bạn không cần điều cuối cùng. Tôi đổ lỗi cho việc có quá nhiều máu trong dòng caffeine của mình :-)
Jenny D

Hoạt động như một bùa mê :)
đàn hạc

4
@harp hãy cẩn thận, logrotatedoc nói: "Lưu ý rằng có một khoảng thời gian rất nhỏ giữa việc sao chép tệp và cắt bớt nó, vì vậy một số dữ liệu đăng nhập có thể bị mất."
Totor

Ngoài khả năng một số dữ liệu có thể bị mất, có bất kỳ nhược điểm nào khác được sử dụng copytruncatekhông?
Leo Galleguillos

5

Tôi khuyên bạn nên sử dụng http://cronolog.org/

Đây là cách tôi sử dụng nó:

CustomLog     "|/usr/local/sbin/cronolog -S /var/log/httpd/t3.CCC.eu-access_log -P /var/log/httpd/t3.CCC.eu-access_log.prev /var/log/httpd/t3.CCC.eu-%Y.log" combined

1
Đường ống đến bất kỳ chương trình bên ngoài nào có thể là một vấn đề nếu có nhiều lưu lượng truy cập đến máy chủ web. Nhưng nó gọn gàng tránh vấn đề filehandle.
Jenny D

Trông giống như một sự thay thế tốt. Liệu cronolog có nén khi đang bay không?
đàn hạc

Có ứng dụng tương tự "rotatelogs" trong gói apache2-utils. Chỉ cần cẩn thận không "đường ống" vào cùng một tệp nhật ký từ các máy chủ ảo apache khác nhau - chúng sẽ dậm chân lên nhau.
Arie Skliarouk
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.