Nhật ký luân chuyển của thiết bị xuất chuẩn?


53

Tôi có một chương trình Linux có thể ghi thông tin vào thiết bị xuất chuẩn và thiết bị xuất chuẩn.

Tôi có một tập lệnh shell chuyển hướng đầu ra thành tập tin /var/log. (Qua >>2>&1.)

Có cách nào để làm cho tập tin nhật ký đó xoay? (kích thước tối đa, sau đó chuyển sang một tệp khác, chỉ giữ một số lượng tệp giới hạn)

Tôi đã thấy một vài câu trả lời nói về logrotatechương trình, nghe có vẻ hay, nhưng dường như chúng cũng tập trung vào các chương trình tạo tệp nhật ký bên trong và xử lý tín hiệu HUP. Có cách nào để thực hiện công việc này với một kịch bản chuyển hướng đầu ra cơ bản không?


1
Tại sao bạn không thể sửa đổi tập lệnh chuyển hướng đầu ra để chứa logic cho phép quay?
MaQleod

Tôi có thể, nếu ai đó có thể cho tôi biết cách phát hiện kích thước của logfile và xoay nó ra khỏi phần cứng của một quy trình mà không làm phiền quá trình đó. Tôi không phải sử dụng logrotatenếu có một lựa chọn tốt hơn, nghe có vẻ như là một điểm khởi đầu thuận tiện để thảo luận.
Miral

2
Bạn không phải sử dụng logrotate, nhưng sử dụng logrotate chỉ giúp tiết kiệm thời gian ... Thường có rất ít điểm để phát minh lại bánh xe.
bubu

Chính xác quan điểm của tôi. Vì vậy, có cách nào để làm cho logrotate hoạt động với thiết bị xuất chuẩn được chuyển hướng đang diễn ra không?
Miral

Câu trả lời:


44

Thay vào đó, bạn có thể dẫn đầu ra thông qua các công cụ được thiết kế với mục đích chính là duy trì giới hạn kích thước, tự động xoay, bộ tệp nhật ký, chẳng hạn như:

Các công cụ để sau đó xử lý các multilogtập tin nhật ký định dạng bao gồm, trong số các công cụ khác:

đọc thêm


1
Cảm ơn, có multilogvẻ như những gì tôi cần.
Miral

multilog dường như là giải pháp plug-and-play duy nhất trong debian (daemontools có gói chính thức). Nhưng trong trường hợp cụ thể của tôi, nơi tôi muốn lưu trữ các bản ghi trên phân vùng fat32, việc xoay vòng không hoạt động, vì đa phần muốn sử dụng một liên kết tượng trưng. Không cắm và chơi cho tôi :)
Arnout

Điều đó không thể đúng, vì multilogkhông nơi nào tạo ra hoặc đòi hỏi các liên kết tượng trưng. Nó hoàn toàn trung lập đối với họ.
JdeBP

URL của "Không sử dụng logrotate hoặc newsyslog trong thế kỷ này" có thêm dấu chấm
duy nhất

15

các rotatelogscông cụ vận chuyển với apache (trong bindir) (xem tài liệu ) có đầu vào từ stdin và xoay các bản ghi sau khi một số lượng thời gian cụ thể


14

Nếu bạn có thể đưa nó đến một trong các luồng nhật ký tiêu chuẩn (syslog, daemon, cron, user, security, mail, v.v.), bạn có thể sử dụng loggerlệnh và đường ống để thay thế.

echo "Hello." | logger -p daemon.info

Mặt khác, bạn nên chuyển nội dung đã ghi của mình sang chương trình hoặc tập lệnh tùy chỉnh để xử lý nội dung đó hoặc xem thiết lập logrotatecấu hình.

EDIT: Câu trả lời của JdeBP dường như có những gì bạn có thể đang tìm kiếm.


2
+1 cho đơn giản. BTW, bạn cũng có thể định cấu hình một cơ sở tùy chỉnh (local0) thay vì cơ sở tiêu chuẩn (daemon trong ví dụ của bạn)
Roger Keays

14

Tôi đã gặp vấn đề tương tự và ban đầu đã loại bỏ logrotate nhưng hóa ra logrotate thực sự có thể làm tốt điều này, chỉ thị chính là " copytruncate ". Vì một số lý do mà thuật ngữ đó không xuất hiện trong bất kỳ điều gì tôi đã làm, vì vậy tôi đang thêm câu trả lời này để làm rõ chính xác cách sử dụng nó cho trường hợp này.

Thủ thuật là điều này chỉ hoạt động nếu chuyển hướng được thực hiện với " >> " (nối thêm) thay vì " > " (tạo).

Tập tin cấu hình (truncate.cfg):

/tmp/temp.log {
    size 10M
    copytruncate
    rotate 4
    maxage 100
}

Chương trình thử nghiệm (không bao giờ từ bỏ tập tin). Bạn có thể xem nó làm đầy đĩa và mặc dù việc xóa logfile sẽ xuất hiện để hoạt động nhưng thực tế nó sẽ không giải phóng bất kỳ khoảng trống nào trên đĩa:

cat /dev/urandom >> /tmp/temp.log

Chạy nhật ký xoay vòng:

logrotate truncate.cfg

Đó là một lý thuyết hay, nhưng nó không thực sự hoạt động trên bất kỳ hệ thống nào tôi đã thử. Các tập tin không thực sự bị cắt ngắn và chương trình tiếp tục nối vào nó như trước đây. (Và vâng, ngay cả với việc chuyển hướng được thực hiện thông qua >>.) ((BTW, câu trả lời này đã được đưa ra trước đó.))
Miral

1
Như đã thảo luận trong logrotate sẽ không cắt bớt tệp gốc (trên trang Unix & Linux của chúng tôi). Ngoài ra, echo /dev/urandom >> /tmp/temp.logsẽ viết 13 ký tự xác định /tmp/temp.logvà sau đó thoát ngay lập tức. Ý bạn là cat /dev/urandomsao
G-Man nói 'Phục hồi Monica'

2
Chỉ cần thử nghiệm ở đây, và nó có vẻ hoạt động. Nội dung của tệp được sao chép vào tệp nhật ký mới. Tệp gốc được giữ mở theo quy trình và bị cắt ngắn (kích thước hiện hiển thị 0).
Philipp

1
Hãy cẩn thận về việc mất dữ liệu có thể xảy ra với copytruncate.
wanghq

1
+1 mặc dù "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 tệp, vì vậy một số dữ liệu ghi nhật ký có thể bị mất."
Tagar

3

Vì vậy, có cách nào để làm cho logrotate hoạt động với thiết bị xuất chuẩn được chuyển hướng đang diễn ra không?

Đúng! Kiểm tra chỉ thị "copytruncate" được cung cấp bởi logrotate. Chỉ định hướng dẫn logrotate để xử lý chính tình huống này: một chương trình đơn giản giữ tệp nhật ký của nó mở vô thời hạn.

Một cảnh báo có thể hoặc không thể là một vấn đề trong tình huống của bạn:

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.

Thông thường, tôi đã thấy một số nguồn nhật ký "thế giới thực" khuyến khích người dùng áp dụng chỉ thị này. Có một số thảo luận về tùy chọn này ở đây .


3

Sử dụng tách, nó là một phần của coreutils. Nó có thể lấy stdin và chia nó thành các khối (dựa trên kích thước khối, hoặc số dòng, v.v.).

Thí dụ:

app | split --bytes 1G - /var/logs/put-prefix-here

Lưu ý dấu gạch ngang (-) hướng dẫn "tách" để sử dụng stdin thay vì tệp.


Bạn có thể mở rộng câu trả lời của bạn để mô tả làm thế nào để làm điều đó? Cảm ơn.
fixer1234

chỉ cập nhật trả lời của tôi với ví dụ.
Nazar

1G là kích thước tùy ý, sau đó nó bắt đầu một tệp mới?
fixer1234

1
Đây không phải là một giải pháp tốt cho vấn đề vì nó có nghĩa là bạn có thể kết thúc với một nửa tin nhắn trong một tệp và một nửa trong tệp tiếp theo. Cũng có nguy cơ mất dữ liệu nếu máy gặp sự cố trong khi splitcó dữ liệu trong bộ đệm lớn. Vì có nhiều công cụ giải quyết vấn đề này một cách chính xác, tôi không nghĩ loại giải pháp này của riêng bạn có thể được khuyến nghị.
David Richerby

1
@David Richerby- làm thế nào về việc thêm -u cho không có bộ đệm?
Nick

3

Tôi thích multilogcho trường hợp sử dụng của tôi, nhưng trường hợp sử dụng của tôi rất đơn giản / đơn giản đến mức nó không được trình bày rất đơn giản trong các tài liệu / ví dụ tôi tìm thấy. Dưới đây là một ví dụ xoay đa điểm đơn giản:

mkdir /tmp/myapp
./myapp | multilog t s10000 n5 '!tai64nlocal' /tmp/myapp 2>&1

Một số lưu ý:

  • bãi bỏ này đăng nhập vào thư mục / tmp / myapp /
  • s10000 đại diện cho 10.000 byte *
  • n5 đại diện cho 5 tệp. * Nhật ký 'hiện tại' được tính là một trong các tệp, do đó, bao gồm 4 nhật ký cũ hơn + 'hiện tại'
  • điều này dựa trên, được điều chỉnh từ các ví dụ được cung cấp bởi François Beausoleil tại: http://blog.teksol.info/pages/daemontools/best-practices
  • Tôi không hiểu nhiều tùy chọn - Tôi giới thiệu bạn đến các tài liệu khác nhau để mở rộng ...
  • Các tài liệu cảnh báo rằng: "Note that running processor may block any program feeding input to multilog."trong đó 'bộ xử lý' là một '!tai64nlocal'phần của lệnh

* Đối với nhiều ứng dụng, đây là những lựa chọn kém để sử dụng lâu dài. Chúng cho phép bạn quan sát hành vi điền và xoay các bản ghi nhanh hơn các bản ghi lớn.

Cuối cùng, đừng quên nohup nếu được yêu cầu! Với nohup, bạn không cần 2>&1(s = 10e6 và n = 30 tại đây):

mkdir -p /tmp/myapp
nohup ./myapp | multilog t s10000000 n30 '!tai64nlocal' /tmp/myapp &

Lệnh đó sẽ giúp bạn bắt đầu.


1

Tôi chỉ muốn thêm vào nhận xét của Sam Hendley ở trên:

Bí quyết là điều này chỉ hoạt động nếu chuyển hướng được thực hiện với >>(chắp thêm) thay vì >(tạo).

Tôi gặp vấn đề tương tự khi tệp gốc chỉ tiếp tục phát triển nếu bạn sử dụng >(tạo) nhưng nếu bạn sử dụng >>(chắp thêm) Logrotate copytruncate hoạt động rất đẹp và như mong đợi. Các tập tin ban đầu trở về không byte và chương trình tiếp tục viết.

Chuyển hướng STDOUT và STDERR sang logfile đang quay:

  1. some-program.sh >> /tmp/output.txt 2>&1 &
  2. Tạo một tệp cấu hình logrotate /etc/logrotate.dtrong trường hợp được gọi là bất cứ thứ gì, output_roll trong trường hợp của tôi.

    Cấu hình mẫu cho trường hợp của tôi:

    /tmp/output.txt {
        notifempty
        missingok
        size 1G
        copytruncate
        start 0
        rotate 15
        compress
    }
    
  3. Thiết lập công việc định kỳ của bạn trong /etc/crontabtệp

    *  *  *  *  * root /usr/sbin/logrotate /etc/logrotate.d/output_roll
    

    Điều này sẽ kiểm tra các tập tin mỗi phút. Bạn có thể điều chỉnh cho phù hợp với nhu cầu của bạn.

  4. Hãy bắt đầu:

    $> service crond restart
    
  5. Đó là nó

Lưu ý: Tôi cũng gặp vấn đề với việc Selinux được đặt thành SELINUX=enforcingnên tôi đặt nó thành SELINUX=disabled.


1

Tôi đã viết một logrotee vào cuối tuần này. Tôi có lẽ sẽ không đọc được câu trả lời tuyệt vời của @ JdeBP và multilog.

Tôi tập trung vào nó là nhẹ và có thể bzip2 khối đầu ra của nó như:

verbosecommand | logrotee \
  --compress "bzip2 {}" --compress-suffix .bz2 \
  /var/log/verbosecommand.log

Có rất nhiều việc phải làm và thử nghiệm, mặc dù.

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.