Cách thích hợp để xoay nhật ký Nginx


12

Tôi muốn đạt được luân chuyển các bản ghi nginx rằng:

  1. sẽ hoạt động mà không cần bất kỳ phần mềm bổ sung nào (tức là - tốt nhất nếu không có "logrotate")
  2. sẽ tạo các tệp được xoay với tên dựa trên ngày

Cách tiếp cận tốt nhất là một cái gì đó giống như PostgreSQL có - tức là trong biến cấu hình log_filename của tôi, tôi có thể chỉ định kiểu strftime% Y-% m-% d và nó sẽ tự động thay đổi nhật ký thay đổi theo ngày (hoặc thời gian).

Một cách tiếp cận khác từ apache - gửi nhật ký qua đường ống đến chương trình rotatelogs.

Theo như tôi có thể tìm kiếm - không có cách tiếp cận nào như vậy tồn tại. Tất cả những gì tôi có thể làm là sử dụng logrotate với tùy chọn dateext, nhưng nó có một nhược điểm riêng và tôi muốn sử dụng cái gì đó hoạt động như | rotatelogs hoặc log_filename trong PostgreQuery.


Bài viết blog này mô tả một giải pháp có thể cho vấn đề của bạn. Nhưng tôi có một câu hỏi: Tại sao bạn không muốn sử dụng logrotate? Nó làm công việc rất tốt, nó gần như không có sự phụ thuộc và được chứng minh là có hiệu quả (chiến đấu cứng nếu bạn muốn). Tại sao nhảy qua các vòng và sử dụng giải pháp cây nhà lá vườn có thể kém hơn và dễ bị lỗi, nếu bạn chỉ có thể sử dụng logrotate (cũng có thể hữu ích để xoay một số bản ghi khác trên máy đó)?
joschi

logrotate (với dateext) gần như hoạt động, nhưng tôi không thích nó vì nó phải được chạy qua cron, và điều này có một số nhược điểm.

Vì nginx không hỗ trợ chuyển nhật ký của nó sang các chương trình khác, nên nó không hỗ trợ xoay vòng nhật ký và bạn không thích cách tiếp cận dựa trên cron, nên bạn có thể không hoàn toàn đạt được điều mình muốn. Đôi khi "gần như hoạt động" là tốt như nó được. ;) Trừ khi, tất nhiên, bạn muốn tự vá nginx.
joschi

Câu trả lời:


7

Trong khi thế giới bị chia rẽ về việc ống có tên khiêm tốn là bạn hay thù, thì đó có lẽ là giải pháp đơn giản nhất cho vấn đề của bạn. Nó có một vài nhược điểm (trong đó bạn cần tạo các đường ống trước thời hạn), nhưng nó loại bỏ sự cần thiết của một cron và cho phép bạn sử dụng bộ lọc đường ống đăng nhập mà bạn chọn.

Đây là một ví dụ sử dụng cronolog trên access.log:

  1. Chọn một đường dẫn cho đường ống được đặt tên của chúng tôi. Tôi dự định sẽ giữ nhật ký của mình /var/log/nginx, vì vậy tôi cũng sẽ đặt ống của mình ở đó. Tên là tùy thuộc vào bạn; Tôi nối thêm .fifo, và nó access.log, vì vậy tôi sẽ ở /var/log/nginx/access.log.fifo.
  2. Xóa tập tin nếu nó tồn tại.
  3. Tạo một ống có tên cho logfile:

    mkfifo /var/log/nginx/access.log.fifo
    
  4. Định cấu hình nginx.confđể trỏ nhật ký vào đường ống bạn vừa thực hiện:

    access_log /var/log/nginx/access.log.fifo;
    
  5. Sửa đổi tập lệnh init.d của bạn để khởi động trình quay nhật ký nghe đường ống trước khi chúng tôi khởi động máy chủ:

    LOGS="/var/log/nginx"
    pkill -f "/usr/sbin/cronolog --symlink $LOGS/access.log"
    ( cat $LOGS/access.log.fifo | /usr/sbin/cronolog --symlink $LOGS/access.log "$LOGS/%Y/%m/%d/access.log" ) &
    

    Một dòng lệnh tương tự sẽ được sử dụng rotatelogsnếu bạn thích nó hơn cronolog- xem tài liệu của họ cho cú pháp.

    Nếu sự phân tâm của bạn có một start-stop-daemon, thay vào đó, bạn nên sử dụng nó, vì về mặt lý thuyết nó có bất kỳ kiến ​​thức đặc biệt nào về nền tảng của bạn và chăm sóc pkillcho bạn. Đơn giản chỉ cần quấn lệnh trong một kịch bản, và vượt qua nó như --execđể start-stop-daemonở của bạn init.d/nginx.


Tôi yêu thời gian; thật tốt khi thấy nhiều người sử dụng / giới thiệu nó.
natacado

1

Tôi đã viết một chương trình đơn giản, cơ sở dữ liệu, để phân chia các nhật ký chung dựa trên ngày đã ghi, trái với thời gian hệ thống hiện tại khi dòng nhật ký được chương trình nhìn thấy. Điều này có thể hoặc không chính xác là những gì theo trình tự thời gian hoặc trình phân tách nhật ký khác đã làm nhưng nó nhanh hơn để viết riêng của tôi hơn là tìm hiểu những gì người khác làm.

Sử dụng năm và tháng trong yêu cầu được ghi lại, dòng sau đó được ghi vào một tệp hoặc đường ống bao gồm YYYYMM được tính từ dữ liệu đã ghi. Có, điều này là hơi cụ thể cho định dạng nhật ký phổ biến. Đầu tiên [được giả định để phân định ngày. Cảnh giác với các địa chỉ IPv6. :)

Đối với phân tích nhật ký, điều quan trọng là mỗi nhật ký thực sự chỉ chứa các yêu cầu cho từng tháng tương ứng và mỗi nhật ký nên hoàn thành lý tưởng để có kết quả phân tích chính xác. Không đủ để xác định tên tệp dựa trên thời gian hiện tại trong bộ tách nhật ký, bởi vì một yêu cầu chậm bắt đầu từ 23:59:59 sau đó sẽ kết thúc trong tệp nhật ký cho tháng sai.

Tôi sử dụng cái này với nginx bằng một fifo có tên được kiểm tra để tồn tại trước khi nginx được bắt đầu. Lưu ý rằng có một sự đánh đổi trong chương trình giữa phát hiện lỗi và đầu ra được đệm, trong đó datelog hiện thích đầu ra được đệm vì lý do hiệu suất, vì vậy hãy đảm bảo rằng thiết lập của bạn thực sự hoạt động, đặc biệt là khi sử dụng ống vỏ, để không mất dữ liệu nhật ký .

Mã nguồn: http://stuge.se/datelog.c

Xin vui lòng gửi cho tôi bất kỳ thông tin phản hồi và tất nhiên các bản vá!


1

Bạn có thể đạt được điều này bằng cách sử dụng tập lệnh bash và cron đơn giản:

#!/bin/bash
DATE=$(date +%Y-%m-%d-%H%M)
mv /var/log/nginx/access.log /var/log/nginx/nginx.access.log.$DATE
mv /var/log/nginx/error.log /var/log/nginx/nginx_error.log.$DATE
kill -USR1 `cat /var/run/nginx.pid`
sleep 1
gzip /var/log/nginx/access.log.$DATE
gzip /var/log/nginx/error.log.$DATE

Chi tiết khác về cách thiết lập crontab, v.v. được tìm thấy ở đây: Xoay tệp nhật ký Nginx qua Cron


0

Tôi e rằng tôi không thực sự hiểu câu hỏi của bạn: Vì nginx không hỗ trợ bất kỳ hoạt động đăng nhập tích hợp nào, bạn sẽ phải đi với một cái gì đó như

mv access.log access.log.$(date "+%Y-%m%d")
kill -USR1 $(cat master.nginx.pid)

ở đâu đó trong /etc/cron.d Daily (tất nhiên bạn cần phải xác định tên tệp ở trên với tên đường dẫn đầy đủ) hoặc cài đặt các tiện ích apache2 để có quyền truy cập vào rotatelogs.


Điều này giống như tôi có thể làm với logrotate. Và tôi muốn nó tốt hơ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.