Logrotate Thành công, tập tin gốc trở về kích thước ban đầu


11

Có ai có bất kỳ vấn đề nào với logrotate trước đó khiến cho tệp nhật ký bị xoay và sau đó quay lại kích thước ban đầu không? Đây là phát hiện của tôi:

Tập lệnh Logrotate:

/var/log/mylogfile.log {
    xoay 7
    hằng ngày
    nén
    olddir / log_archives
    mất tích
    đáng chú ý
    bản sao
}

Đầu ra dài dòng của Logrotate:

sao chép /var/log/mylogfile.log sang /log_archives/mylogfile.log.1
cắt bớt /var/log/mylogfile.log
nén nhật ký với: / bin / gzip
xóa nhật ký cũ /log_archives/mylogfile.log.8.gz

Đăng nhập tập tin sau khi cắt ngắn xảy ra

[root @ máy chủ ~] # ls -lh /var/log/mylogfile.log
-rw-rw-r-- 1 phần1 phần1 0 ngày 11 tháng 1 17:32 /var/log/mylogfile.log

Nghĩa đen sau:

[root @ máy chủ ~] # ls -lh /var/log/mylogfile.log
-rw-rw-r-- 1 phần1 part1 3.5G ngày 11 tháng 1 17:32 /var/log/mylogfile.log

Phiên bản RHEL:

[root @ server ~] # cat / etc / redhat-phát hành 
Red Hat Enterprise Linux ES phát hành 4 (Bản cập nhật Nahant 4)

Phiên bản Logrotate:

[root @ DAA21529WWW370 ~] # vòng / phút | grep logrotate
logrotate-3.7.1-10.RHEL4

Một số lưu ý:

  • Dịch vụ không thể được khởi động lại một cách nhanh chóng, vì vậy đó là lý do tại sao tôi đang sử dụng copytruncate
  • Nhật ký đang quay mỗi đêm, theo olddirthư mục có tệp nhật ký trong đó từ mỗi đêm.

Câu trả lời:


18

Điều này có thể là do mặc dù bạn đã cắt bớt tệp, quá trình ghi vào tệp sẽ tiếp tục ghi vào bất kỳ giá trị bù nào cuối cùng. Vì vậy, những gì đang xảy ra là logrotate cắt ngắn tệp, kích thước bằng 0, xử lý ghi lại vào tệp, tiếp tục ở phần bù mà nó bỏ đi và bây giờ bạn có một tệp có NULL-byte cho đến khi bạn cắt bớt nó cộng với mới các mục được ghi vào nhật ký.

od -c sau khi cắt ngắn + tăng trưởng đột ngột, tạo ra sản lượng dọc theo dòng:

0000000  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
33255657600  \0   C   K   B   -   s   e   r   v   e   r       [   h   t   t
33255657620 <more log output>

Điều này nói là từ offset 0 đến 33255657600 tệp của bạn bao gồm các byte rỗng và sau đó là một số dữ liệu rõ ràng. Đến trạng thái này không mất cùng thời gian để thực sự ghi tất cả các byte rỗng đó. Các hệ thống tệp ext {2,3,4} hỗ trợ một cái gì đó gọi là các tệp thưa thớt, vì vậy nếu bạn tìm kiếm qua một vùng của tệp không chứa bất cứ thứ gì, vùng đó sẽ được coi là chứa byte rỗng và sẽ không chiếm dung lượng trên đĩa. Những byte rỗng đó thực sự sẽ không được viết, chỉ cần giả sử là có, do đó thời gian để chuyển từ 0 đến 3,5 GB không mất nhiều thời gian. (Bạn có thể kiểm tra lượng thời gian cần thiết bằng cách thực hiện một thao tác nào đó dd if=${HOME}/.bashrc of=largefile.bin seek=3432343264 bs=1, việc này sẽ tạo ra một tệp trên 3 GB trong vài mili giây).

Nếu bạn chạy ls -lstrên logfiles của mình sau khi chúng bị cắt ngắn và tăng trưởng đột ngột trở lại, thì nó sẽ báo cáo một số ở đầu dòng đại diện cho kích thước thực tế (trong các khối chiếm trên đĩa), có thể là các đơn đặt hàng có cường độ nhỏ hơn kích thước được báo cáo bởi chỉ ls -l.


Tôi không nghĩ vậy - trong vài giây, tệp nhật ký sẽ tăng từ 0 byte đến 3,5 GB. Tổng thời gian để logrotate hoàn thành là khoảng 5 phút. Các tệp nhật ký không được ghi vào đó nhanh VÀ kích thước luôn luôn là kích thước ban đầu, có vẻ như quá nhiều sự trùng hợp.
drewrockshard

Cần có một cách dễ dàng để xác minh điều này, kiểm tra tệp và xem thực sự có gì trong đó không. Bắt đầu bằng cách chạy tên tập tin od -c | head -n 100. Có thể nó sẽ cho bạn biết trong một vài dòng rằng có một khối lượng byte rỗng, cộng với các mục nhật ký mới nhất.
Kjetil Joergensen

Nếu đây là trường hợp thì chúng ta có thể kiểm tra xem cat / dev / null> /var/log/mylogfile.log cắt ngắn tệp theo cách giải quyết vấn đề này, thay vì sử dụng logrotate được xây dựng trong copytruncate không?
mtinberg

2
Vấn đề không nằm ở cách tập tin bị cắt ngắn, vấn đề nằm ở cách chương trình ghi logfile. Để cắt ngắn logfile thành một cách tiếp cận khả thi, bạn sẽ phải đưa chương trình viết vào logfile bằng cách nào đó tìm đến vị trí 0. Có thể một hệ thống tệp không hỗ trợ các tệp thưa thớt sẽ không có khả năng này, mặc dù tôi không Bây giờ không có cách nào để kiểm tra điều đó.
Kjetil Joergensen

1
Câu trả lời cuối cùng này thực sự có ý nghĩa hơn và sửa chữa có thể sẽ bắt đầu lại để khởi động lại ứng dụng.
drewrockshard

2

Tôi vô cùng tin tưởng rằng Kjetil đã đánh nó. Drew, bạn có thể chưa bị thuyết phục bởi lời giải thích của anh ấy nhưng tôi khuyên bạn nên đọc kỹ những gì anh ấy nói.

Nếu bạn chấp nhận, cách khắc phục là dừng và khởi động lại ứng dụng của bạn khi các bản ghi được xoay hoặc sử dụng một công cụ như "rotatelogs" của apache, trong đó bạn cung cấp đầu ra nhật ký cho công cụ thông qua một đường ống và công cụ sẽ xử lý xoay logfile thường xuyên như vậy. Ví dụ, một trong những trường hợp apache của tôi ghi lại với

ErrorLog "|/usr/sbin/rotatelogs /www/logs/error_log 604800"

Điều này gây ra rất nhiều logfile với tên như

-rw-r--r--    1 root     root         4078 Dec 21 01:04 error_log.1292457600
-rw-r--r--    1 root     root         4472 Dec 29 08:41 error_log.1293062400
-rw-r--r--    1 root     root        78630 Jan  4 12:57 error_log.1293667200
-rw-r--r--    1 root     root        15753 Jan 12 01:10 error_log.1294272000

xuất hiện mà không khởi động lại apache; Sau đó tôi có thể nén chúng bằng tay sau khi thực tế. Lưu ý cách xoay vòng được thực hiện mỗi tuần, tức là cứ sau 604800 giây, đó là đối số được truyền đến rotatelogs.

Nếu bạn không thể dừng và khởi động lại ứng dụng và nó không thể đăng nhập qua một đường ống, thì tôi nghĩ bạn đã gặp vấn đề thực sự. Có lẽ những người khác sẽ có đề xuất.


0

nó sẽ thực sự tuyệt vời nếu bạn có thể gửi toàn bộ logrotate.

Tại sao phải thử sử dụng kill -HUP? (Tải lại cổ điển không khởi động lại ) phương pháp.

Ngoài ra ... kiểm tra xem lsof ai đang truy cập tệp.


Không thể sử dụng kill -HUPvì ứng dụng này không thể được chạm vào theo bất kỳ cách nào - đó là một ứng dụng nhạy cảm mà tôi không sở hữu (tôi thậm chí không quản lý nó - Tôi chỉ quản lý phía HĐH) vì vậy tôi cần có thể thực hiện các thao tác đăng nhập này đường.
drewrockshard

1
Xin lỗi, tin nhắn ban đầu đã được gửi sớm, đây là phần còn lại của tin nhắn ban đầu của tôi: Tôi đã đăng nhập vào hệ thống sáng nay và tập tin đã trở lại bình thường sau khi logrotate theo lịch trình /etc/cron.dailyđược bắt đầu. Câu hỏi cho tất cả: Có điều gì đó mà tập lệnh logrotate làm khác với việc chạy logrotate bằng tay không? Kịch bản logrotate của tôi theo nghĩa đen trông như thế /usr/sbin/logrotate /etc/logrotate.conf. Điều này khá khó hiểu.
drewrockshard

-1

Chỉ cần sử dụng ">>" có nghĩa là nối thêm thay vì ">" có nghĩa là tạo từ các tập lệnh của bạn ghi vào tệp này. Tôi đã có cùng một vấn đề và tôi đã sửa nó bằng cách nối thêm vào tập lệnh của mình.

Một sốScript.sh >> output.txt

Hy vọng rằng rõ ràng hơn.


Không có dấu hiệu cho thấy việc ghi vào tệp nhật ký được thực hiện bằng cách sử dụng >từ một tập lệnh. Hơn nữa, câu trả lời này là khó hiểu vì có một sự khác biệt lớn giữa >>( )trong các kịch bản. Cuối cùng, nếu mã thực hiện viết được cập nhật, sẽ tốt hơn nhiều nếu chỉ cần bắt đầu ghi vào logfile mới sau khi logrotateđã hoàn thành công việc.
kasperd

Tôi chỉnh sửa câu trả lời của mình để nó rõ ràng hơn.
user578558
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.