Làm thế nào để tiếp tục chuyển hướng thiết bị xuất chuẩn vào một tệp sau khi logrotate di chuyển nó?


22

Tôi có một tập lệnh đơn giản xuất ra một loạt các bản ghi để sàng lọc và tôi đã chuyển STDOUT sang một tệp để lưu trữ các bản ghi. Vì tập lệnh này chạy dài, tôi cần xoay các tệp nhật ký để chúng được chuyển thành các tập tin nhỏ hơn dễ quản lý hơn.

Vấn đề tôi gặp phải là một khi logrotatedi chuyển tệp nhật ký hiện tại sang một tệp mới, tệp nhật ký mới được tạo sẽ không được điền vào nhật ký nữa. Có vẻ như một khi tệp nhật ký gốc bị xóa, trình xử lý tệp của nó bị mất và chuyển hướng sẽ không hoạt động nữa.

Tôi cũng tìm thấy bài đăng này có cùng vấn đề với tôi và tuyên bố rằng nó có thể được sửa bằng cách sử dụng >>thay vì >chuyển hướng đầu ra. Tôi đã thử nghiệm giải pháp của anh ấy nhưng nó không hiệu quả với tôi. Có ai có bất cứ ý tưởng làm thế nào để giữ cho chuyển hướng làm việc?


4
Trong trường hợp của bạn, tôi vẫn khuyên bạn nên sử dụng ">>" thay vì ">" nếu bạn có ý định ghi vào một tệp bị cắt bớt: như ">>" mở trong chế độ chắp thêm, nó sẽ tìm kiếm cho đến khi kết thúc tệp mỗi lần nó viết. Theo cách đó, khi bạn cắt bớt tệp (làm cho nó chuyển từ byte XXXX thành 0 byte), nó sẽ "tìm kiếm cho đến hết", vì vậy sẽ biết bây giờ nó phải ghi sau byte 0. Nếu không, nó có thể ghi sau byte XXXX, và do đó tạo một tệp thưa thớt với các byte null XXXX trước nó (nghĩa là khi ">", fd chỉ có thể nhớ vị trí của nó trong tệp đó và viết từ đó, mà không nhận ra kích thước tệp bị thu hẹp!)
Olivier Dulac

Câu trả lời:


25

Bạn nên sử dụng chỉ thị copytruncate trong cấu hình logrotate của mình cho tệp nhật ký này.

copytruncate Cắt ngắn tệp nhật ký gốc tại chỗ sau khi tạo bản sao, thay vì di chuyển tệp nhật ký cũ và tùy ý tạo tệp mới. Nó có thể được sử dụng khi một số chương trình không thể được yêu cầu đóng logfile của nó và do đó có thể tiếp tục ghi (nối thêm) vào tệp nhật ký trước đó mãi mãi. Lưu ý rằng có một lát cắt 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. Khi tùy chọn này được sử dụng, tùy chọn tạo sẽ không có hiệu lực, vì tệp nhật ký cũ giữ nguyên vị trí


2
Có thể đáng nói: Trong một thời gian ngắn, trước khi compresshoạt động, dữ liệu được nhân đôi. Điều đó gây ra cho chúng tôi một vấn đề một lần nhưng đó là điều tồi tệ của chúng tôi vì chúng tôi không nên đến gần lvgiới hạn không gian. Ngoài ra, như đã nêu trong manđoạn trích, bạn có thể mất một số dữ liệu nhật ký ở giữa các thao tác sao chép và cắt ngắn.
Belmin Fernandez

6

Để thay thế, bạn cũng có thể:

  • sử dụng tiện ích logger trong tập lệnh của bạn thay vì đường ống, với một cơ sở chuyên dụng (ví dụ local5), ví dụ:

    logger -p local5.info -t myscriptname "this is some log data"

  • cấu hình syslog để ghi cơ sở này vào tệp nhật ký mong muốn, ví dụ (rsyslog.conf):

    local5.* /var/log/mylogfile

  • thiết lập quy tắc logrotate cho nhật ký này.


Điều này chỉ hoạt động nếu bạn có các lệnh đầu ra rõ ràng như echo. Đầu ra của các công cụ của bên thứ ba được gọi từ tập lệnh và cũng xuất ra thứ gì đó không thể được chuyển hướng đến bộ ghi theo cách này
Daniel Alder

4

Một cách khác để giải pháp Iain là sử dụng postrotatetập lệnh để khởi chạy lại tập lệnh của bạn sau khi quá trình xoay vòng diễn ra. Điều này được thực hiện cho rất nhiều trình nền (khởi động lại hoặc tải lại trình nền), nhưng không biết tập lệnh của bạn Tôi không biết giải pháp này có phù hợp với bạn hay không (tập lệnh của bạn có phụ thuộc vào trạng thái được tạo trước đây không?).

Nội dung của /etc/logrotate.d/your-script-name:

/var/log/your-script-name.log {
    # your current logrotate options
    ...
    postrotate
        # this supposing you have the current pid stored
        cat /run/your-script-name.pid | xargs -r kill
        #relaunch it again
        /usr/local/bin/your-script-name
    endscript
}

0

Bạn có thể chuyển stdout thành "split" (một phần của coreutils trong linux). Nó cho phép bạn chia tập tin / stdin thành các khối dựa trên kích thước, số lượng dòng, v.v ... Khi bạn nhận được nó, bạn có thể quản lý nó bằng logrotate nếu cầ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.