Bắt đầu không mở lại các tệp nhật ký trên logrotation


10

Chúng tôi sử dụng mới nhất để quản lý các dịch vụ của mình trên các máy chủ Ubuntu. Họ tạo ra các bản ghi được đăng xuất thành /var/log/upstart/SERVICE_NAME.log

Sau đó hàng ngày, các tệp nhật ký được xoay bằng cách sử dụng tập lệnh logrotation đi kèm với 12.04 LTS:

/var/log/upstart/*.log {
        daily
        missingok
        rotate 7
        compress
        notifempty
        nocreate
}

Vấn đề là trong khi logrotate di chuyển các tệp, nó không xuất hiện để báo hiệu để bắt đầu đóng và mở lại các tệp, để lại quá trình viết mới bắt đầu để xóa PID.

init          1       root    8w      REG              202,1        64       2431 /var/log/upstart/dbus.log.1 (deleted)
init          1       root   13w      REG              202,1        95       2507 /var/log/upstart/acpid.log.1 (deleted)
init          1       root   14w      REG              202,1       127      17377 /var/log/upstart/whoopsie.log.1 (deleted)
init          1       root   36w      REG              202,1       122       6747 /var/log/upstart/SERVICE_NAME.log.1 (deleted)
init          1       root   37w      REG              202,1        30       6762 

Rõ ràng tôi có thể chuyển hướng đầu ra từ các dịch vụ của mình sang các tệp nhật ký khác, nhưng vấn đề vẫn sẽ ở đó cho các quy trình hệ thống. Ngoài ra tôi thà không phải xây dựng nhiều cơ sở hạ tầng hơn những gì tôi cần.


Tôi cũng vừa gặp phải điều này. Thật kỳ lạ khi chúng tôi không chú ý đến nó trước đây, điều này khiến tôi nghĩ rằng nó có thể là một điều gần đây.
pwaller

1
Bất kỳ cập nhật về điều này? Xem cùng một vấn đề chính xác vào ngày 14.04. Đó là vì nocreatechỉ thị, không chắc tại sao mọi người sẽ sử dụng chỉ thị này, đặc biệt là đối với các dịch vụ có khả năng viết rất nhiều sản phẩm
rynop

Cũng trải nghiệm điều này.
Ztyx

1
Tôi đã tìm thấy lỗi này
Lety

Câu trả lời:


2

Tôi tin rằng bạn có 3 lựa chọn.

  1. Bạn sửa đổi cấu hình hiện có bằng cách thêm "copytruncate"

    /var/log/upstart/*.log { copytruncate daily missingok rotate 7 compress notifempty nocreate }

  2. Nếu bạn không thể hoặc (không được phép) thay đổi cấu hình logrotate hiện tại do các tệp nhật ký khác không bị ảnh hưởng và cấu hình hiện tại hoạt động cho chúng, thì hãy di chuyển các tệp "SERVICE_NAME.log" của bạn sang thư mục mới trong / var / log nếu bạn muốn, tạo một cấu hình mới với "copytruncate" và thêm nó vào cron.d Daily.

  3. a) Nếu bạn không được phép thay đổi cấu hình os logrotate của máy chủ hoặc thêm vào cron.daily của hệ điều hành máy chủ, thì tùy chọn thứ ba của bạn là thay đổi tập lệnh hoặc chương trình để kiểm tra xem tệp có tồn tại trước khi ghi ra tệp không. b) Một cách khác là một chút điểm 2 ở trên, đó là di chuyển các tệp logfile của bạn sang một nơi khác và trong tập lệnh hoặc chương trình của bạn, thực hiện lệnh logrotate cụ thể cho tệp logfile của chương trình đó.

Điểm 3b ở trên phức tạp hơn nhưng thanh lịch hơn và đó là điều tôi sử dụng hầu hết thời gian vì điều đó có nghĩa là chương trình này tự cung cấp và tự quản lý và không cần các công việc của HĐH để trông nom nó.

Để tìm hiểu cách chạy thủ công logrotate và thêm nó vào chương trình hoặc tập lệnh của bạn, chỉ cần gõ:

man logrotate

hoặc là

logrotate --help

Nếu bạn đang sử dụng Python cho các chương trình của mình, bạn có thể kiểm tra cách chương trình này sử dụng nó để tự quản lý các tệp nhật ký của nó. http://bazaar.launchpad.net/~ferncasado/keep.awake/trunk/files/head:/v4/


0

Hóa ra, đây là một vấn đề đã biết và vẫn mở khi tôi gõ cái này.

Điều đúng đắn cần làm là, có lẽ, chỉ cần loại bỏ /etc/logrotate.d/upstarthoàn toàn và xoay các tệp của các dịch vụ riêng lẻ. Bởi vì thư mục ( /var/log/upstart/) chỉ chứa thiết bị xuất chuẩn / thiết bị xuất chuẩn của các dịch vụ khác nhau - và không có dịch vụ nào có nghĩa là chạy như một daemon nên xuất ra hai kênh đó. Ngoại trừ, có thể, lúc khởi động.

Trên hệ thống tôi đang quản lý, ba dịch vụ đều do các mới nổi: php5.6-fpm, php7.1-fpm, và acpid. Không có một trong ba bản ghi nào đang hoạt động nhưng đôi khi fpm được khởi động lại do tệp nhật ký chính của nó ( /var/log/php5.6-fpm.log) bị xoay - và nó gây ra tiếng ồn này, vì nó tạo ra một số lỗi khi khởi động.

Nếu bạn khăng khăng xoay các tệp này, bạn có thể dựa vào thực tế là tên của chúng khớp với tên của các dịch vụ và sử dụng postrotatetập lệnh sau :

    postrotate
            service=${1##*/}
            service=${service%.log*}
            service $service restart > /dev/null
    endscript

Để làm việc ở trên, hãy chắc chắn không sử dụng sharedscriptsđộng từ trong đó - scriptlet của tôi dựa trên thực tế, đường dẫn thực tế đến tệp sẽ được chuyển đến nó làm đối số đầu tiên ( $1).

(Chuyển hướng thành /dev/nullhữu ích, bởi vì service-command ồn ào - và bạn không muốn tiếng ồn đó được gửi qua email cho bạn bằng cron. Lưu ý rằng tôi không chuyển hướng stderrở đó, chỉ stdout- nếu có vấn đề, bạn Tôi vẫn sẽ nhận được e-mail của bạn về nó.)

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.