Nginx লগগুলি ঘোরানোর উপযুক্ত উপায়


12

আমি nginx লগের ঘূর্ণন অর্জন করতে চাই যে:

  1. কোনও অতিরিক্ত সফ্টওয়্যার ছাড়াই কাজ করবে (যেমন - "লোগ্রোটেট" ছাড়াই সেরা)
  2. তারিখের উপর ভিত্তি করে নামগুলি নিয়ে ঘোরানো ফাইল তৈরি করবে

সেরা অ্যাপ্রোচ হ'ল পোস্টগ্রাইএসকিউএল-এর মতো কিছু - যেমন এর লগ_ফাইলেনাম কনফিগার ভেরিয়েবলে আমি স্ট্রফটাইম-স্টাইল% Y-% m-% d নির্দিষ্ট করতে পারি, এবং এটি স্বয়ংক্রিয়ভাবে তারিখের (বা সময়) পরিবর্তিত হবে log

অ্যাপাচি থেকে অন্য পদ্ধতি - রোটেটলগ প্রোগ্রামে পাইপের মাধ্যমে লগগুলি প্রেরণ।

আমি যতদূর অনুসন্ধান করতে সক্ষম হয়েছি - এরূপ কোনও পদ্ধতির উপস্থিতি নেই। আমি যা করতে পারি তা হ'ল ডেটেক্সট বিকল্পের সাহায্যে লোগ্রোটেট ব্যবহার করা, তবে এটির নিজস্ব ঘাটতিগুলির সেট রয়েছে এবং আমি বরং পোস্টগ্র্রেএসকিউএল | রোটেল্লোগস বা লগ-ফাইল ফাইলের মতো কাজ করে এমন কিছু ব্যবহার করব।


এই ব্লগ নিবন্ধটি আপনার সমস্যার সম্ভাব্য সমাধান বর্ণনা করে। তবে আমার একটি প্রশ্ন আছে: আপনি লোগ্রোটেট ব্যবহার করতে চান না কেন? এটি কাজটি খুব ভালভাবে সম্পাদন করে, এটির প্রায় কোনও নির্ভরতা নেই এবং এটি কাজ করতে প্রমাণিত (আপনি যদি চান যুদ্ধের সাথে জোরদার)। হুপের মাধ্যমে ঝাঁপিয়ে পড়ুন এবং হোমগ্রাউন সমাধানটি কেন ব্যবহার করুন যা নিম্নমানের এবং ত্রুটি-প্রবণ হতে পারে, যদি আপনি কেবল লোগ্রোটেট ব্যবহার করতে পারেন (যা সেই মেশিনে কিছু অন্যান্য লগ ঘোরানোর জন্যও কার্যকর হতে পারে)?
জোশিচি

লোগ্রোটেট (ডেটেক্সট সহ) প্রায় কাজ করে, তবে এটি আমার পছন্দ হয় না কারণ এটি ক্রোন দিয়ে চালাতে হবে এবং এর কিছু ত্রুটি রয়েছে।

যেহেতু এনজিনেক্স অন্যান্য প্রোগ্রামগুলিতে এর লগগুলি পাইপিং সমর্থন করে না, নিজেই লগ রোটেশনকে সমর্থন করে না এবং আপনি ক্রোন-ভিত্তিক পদ্ধতির পছন্দ করেন না, তাই আপনি যা চান তা সম্ভবত নাও পেতে পারেন। কখনও কখনও "প্রায়শই কাজগুলি" যেমনটি পায় ততই ভাল। ;) যদি না, আপনি অবশ্যই এনগিনেক্স প্যাচ করতে চান।
জোশিচি

উত্তর:


7

যদিও নম্র নামযুক্ত পাইপটি বন্ধু বা শত্রু কিনা তা নিয়ে বিশ্ব বিভক্ত হয়ে গেছে, এটি সম্ভবত আপনার সমস্যার সহজ সমাধান। এতে কয়েকটি ত্রুটি রয়েছে (এটির আগে আপনাকে পাইপগুলি তৈরি করতে হবে) তবে এটি ক্রোনটির প্রয়োজনীয়তা সরিয়ে দেয় এবং আপনাকে আপনার পছন্দের লগিং পাইপ-ফিল্টার ব্যবহার করতে দেয়।

ক্রোনোলজ ব্যবহার করে এখানে একটি উদাহরণ দেওয়া হয়েছে access.log:

  1. আমাদের নামী পাইপের জন্য একটি পথ বেছে নিন। আমি আমার লগ রাখা মনস্থ /var/log/nginx, তাই আমি আমার পাইপ পাশাপাশি সেখানে রেখে দেব। নামটি আপনার হাতে; আমি সংযুক্ত .fifo, এবং এটি access.log, তাই আমার হবে /var/log/nginx/access.log.fifo
  2. ফাইলটি উপস্থিত থাকলে মুছুন।
  3. লগফাইলে একটি নামযুক্ত পাইপ তৈরি করুন:

    mkfifo /var/log/nginx/access.log.fifo
    
  4. nginx.confআপনি স্রেফ তৈরি পাইপটিতে লগটি নির্দেশ করার জন্য কনফিগার করুন :

    access_log /var/log/nginx/access.log.fifo;
    
  5. আমরা সার্ভার শুরু করার আগে পাইপ শোনার জন্য লগ রোটার শুরু করতে আপনার init.d স্ক্রিপ্টটি সংশোধন করুন :

    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" ) &
    

    rotatelogsআপনি যদি এটি পছন্দ করেন তবে অনুরূপ একটি কমান্ডলাইন ব্যবহার করা হবে cronolog- সিনট্যাক্সের জন্য তাদের ডক্সটি দেখুন।

    যদি আপনার ক্ষোভের একটি থাকে তবে আপনার পরিবর্তে এটি start-stop-daemonব্যবহার করা উচিত, কারণ এটিতে আপনার প্ল্যাটফর্মটি সম্পর্কে তাত্ত্বিকভাবে যা কিছু বিশেষ জানা আছে, এবং আপনার যত্ন নিচ্ছেন pkill। কেবলমাত্র একটি স্ক্রিপ্টের মধ্যে কমান্ড মোড়ানো, এবং এটা পাস --execকরার start-stop-daemonআপনার init.d/nginx


আমি ক্রোনোলজকে ভালবাসি; আরও বেশি লোক এটি ব্যবহার / প্রস্তাব দিচ্ছেন তা দেখতে ভাল।
নাটাচাদো

1

লগ লাইন যখন প্রোগ্রাম দ্বারা দেখা হয় বর্তমান সিস্টেম সময়ের বিপরীতে লগড তারিখের উপর ভিত্তি করে সাধারণ লগগুলিকে বিভক্ত করতে আমি একটি সাধারণ প্রোগ্রাম ডেটলগ লিখেছি। এটি ক্রোনোলজ বা অন্য কোনও লগ স্প্লিটার ইতিমধ্যে যা ঘটেছে ঠিক তা নাও হতে পারে তবে অন্যেরা কী করে তা খুঁজে বের করার চেয়ে আমার নিজের লেখাটি দ্রুত ছিল।

লগড অনুরোধে বছর এবং মাস ব্যবহার করে, লাইনটি তখন কোনও ফাইল বা পাইপে লিখিত হয় যার মধ্যে লগ করা ডেটা থেকে YYYYMM অন্তর্ভুক্ত থাকে। হ্যাঁ এটি সাধারণ লগ বিন্যাসের জন্য কিছুটা নির্দিষ্ট। প্রথমটি [তারিখটি সীমাবদ্ধ বলে ধরে নেওয়া হয়। আইপিভি 6 ঠিকানা থেকে সাবধান থাকুন। :)

লগ বিশ্লেষণের জন্য এটি গুরুত্বপূর্ণ যে প্রতিটি লগটিতে কেবলমাত্র প্রতিটি সম্পর্কিত মাসে অনুরোধ থাকে এবং প্রতিটি লগই সঠিকভাবে বিশ্লেষণ ফলাফলের জন্য সম্পূর্ণ হওয়া উচিত। লগ স্প্লিট্টারের মধ্যে বর্তমান সময়ের উপর ভিত্তি করে ফাইলের নাম নির্ধারণ করা যথেষ্ট নয়, কারণ 23:59:59 থেকে শুরু হওয়া ধীর অনুরোধটি ভুল মাসের জন্য লগ ফাইলে শেষ হবে।

আমি এটি নামী ফিফোর মাধ্যমে এনজিনেক্স দিয়ে ব্যবহার করি যা এনজিনেক্স শুরু হওয়ার আগেই উপস্থিত রয়েছে কিনা তা পরীক্ষা করা হয়। নোট করুন যে ত্রুটি সনাক্তকরণ এবং বাফার আউটপুটের মধ্যে প্রোগ্রামে একটি ট্রেডঅফ রয়েছে, যেখানে ডেটলগ বর্তমানে কার্য সম্পাদনের কারণে বাফার আউটপুট পছন্দ করে, তাই দয়া করে নিশ্চিত হন যে আপনার সেটআপটি আসলে কাজ করে, বিশেষত শেল পাইপ ব্যবহার করার সময় কোনও লগ ডেটা হারাতে না পারে ।

উত্স কোড: http://stuge.se/datelog.c

আমাকে কোন মতামত এবং অবশ্যই প্যাচ প্রেরণ করতে নির্দ্বিধায় দয়া করে!


1

আপনি একটি সাধারণ ব্যাশ স্ক্রিপ্ট এবং ক্রোন ব্যবহার করে এটি অর্জন করতে পারেন:

#!/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

ক্রন্টব ইত্যাদি স্থাপনের আরও বিশদ এখানে পাওয়া গেছে: ক্রোনের মাধ্যমে এনগিনেক্স লগ ফাইলগুলি ঘোরানো


0

আমি ভীত আমি সত্যই আপনার প্রশ্নটি বুঝতে পারি না: যেহেতু এনজিনেক্স কোনও বিল্টিন লোগ্রোটেশন সমর্থন করে না, তাই আপনাকে এই জাতীয় কিছু নিয়ে যেতে হবে

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

কোথাও /etc/cron.daily এ (আপনার অবশ্যই পুরো পথের নাম দিয়ে উপরের ফাইলের নামগুলি যোগ্যতা অর্জন করতে হবে) অথবা আবর্তিত লগগুলিতে অ্যাক্সেস পাওয়ার জন্য অ্যাপাচি 2 ইউটিলিটিগুলি ইনস্টল করুন।


লোগ্রোটেটের সাথে আমি যা করতে পারছিলাম এটি একই। এবং আমি এটি আরও ভাল চাই।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.