বোবা অ ইন্টারেক্টিভ অ্যাপ্লিকেশনটির লগগুলি ঘোরান


8

উবুন্টু 10.4 সার্ভার।

আমার কাছে একটি বোবা অ-ইন্টারেক্টিভ উত্তরাধিকার পরিষেবা রয়েছে যা আমার সার্ভারে অবিচ্ছিন্নভাবে চলমান।

এটি স্থির নাম (/var/log/something.log) সহ একটি ফাইলে তার লগ লিখছে।

লগ ফাইলটি যেতে কোনও সংকেত এটি পরিচালনা করে না। আমার সেই লগ ফাইলটি ঘোরানো দরকার।

অ্যাপ্লিকেশন পরিবর্তন না করে এবং লগের কোনও ডেটা না হারিয়ে সঠিকভাবে এটি করার কোনও উপায় আছে কি?

উত্তর:


5

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

এটি কাজ করার জন্য আপনাকে নিজের লগফিলটিকে একটি নামযুক্ত পাইপ তৈরি করতে হবে। বিদ্যমান ফাইলটির পুনরায় নামকরণ করুন

mkfifo /var/log/something.log

এবং আপনার প্রয়োজনীয়তা পূরণের জন্য 3 ফাইলের নাম সম্পাদনা করতে। আপনার পরিষেবাটি চালান তারপরে এই ডেমোন যা নামক পাইপটি পড়তে হবে এবং এটি একটি নতুন লগফাইলে লিখতে হবে।

আপনি যদি নাম পরিবর্তন করেন /var/log/somethingrotateable.logতবে ডেমনকে এইচওপি প্রেরণ করুন এটি নিজেই উত্থিত হবে এবং somethingrotateable.logলিখতে একটি নতুন তৈরি করবে । লোগ্রোটেট ব্যবহার করে যদি একটি postrotateস্ক্রিপ্টkill -HUP 'cat /var/run/yourpidfile.pid'

#!/usr/bin/perl -w
use POSIX ();
use FindBin ();
use File::Basename ();
use File::Spec::Functions;
#
$|=1;
#
# Change the 3 filenames and paths below to meet your requirements.
#
my $FiFoFile = '/var/log/something.log';
my $LogFile = '/var/log/somethingrotateable.log';
my $PidFile = '/var/run/yourpidfile.pid';

# # make the daemon cross-platform, so exec always calls the script
# # itself with the right path, no matter how the script was invoked.
my $script = File::Basename::basename($0);
my $SELF = catfile $FindBin::Bin, $script;
#
# # POSIX unmasks the sigprocmask properly
my $sigset = POSIX::SigSet->new();
my $action = POSIX::SigAction->new('sigHUP_handler',$sigset,&POSIX::SA_NODEFER);
POSIX::sigaction(&POSIX::SIGHUP, $action);

sub sigHUP_handler {
#    print "Got SIGHUP";
    exec($SELF, @ARGV) or die "Couldn't restart: $!\n";
   }

#open the logfile to write to
open(LOGFILE, ">>$LogFile") or die "Can't open $LogFile";
open(PIDFILE, ">$PidFile") or die "Can't open PID File $PidFile";
print PIDFILE "$$\n";
close PIDFILE;
readLog();

sub readLog {
sysopen(FIFO, $FiFoFile,0)  or die "Can't open $FiFoFile";
while ( my $LogLine = <FIFO>) {
    print LOGFILE $LogLine;
   }
}

8

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


2

প্রক্রিয়াতে SIGSTOP প্রেরণ করুন, লগটিকে অন্য নামে অনুলিপি করুন, লগটি কেটে ফেলুন, প্রসেসে SIGCONT প্রেরণ করুন সম্ভবত:

pkill -STOP legacyappname
সিপি /var/log/something.log /var/log/something.log.backup
বিড়াল / দেব / নাল> /var/log/something.log
pkill -Cont legacyappname

আপনি লোগ্রোটেটটি সাবধানতার সাথে রচনা করা পূর্ব এবং পোস্টের ঘূর্ণন স্ক্রিপ্ট এবং কপিরাইট্রন্ট বিকল্প সহ আপনার জন্য যাদু করতে পারেন:

/ var / লগ / কিছু {
    দৈনন্দিন
    ঘোরান 5
    copytruncate
    prerotate
        # এটি অবশ্যই ধরে নিয়েছে আপনার অবশ্যই একটি পিড ফাইল রয়েছে।
        # যদি আপনি না করেন তবে এটি পরিবর্তে উপরের মতো পিকিল হতে পারে।
        কিল -STOP `বিড়াল / ভার / রান / legacyappname.pid``
    endscript
    postrotate
        কিল -CONT `বিড়াল / ভার / রান / legacyappname.pid``
    endscript
}

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

এছাড়াও, অ্যাপটি রানিটের অধীনে চলছে। অ্যাপটির প্রক্রিয়া বন্ধ হয়ে গেলে এর মনিটর কী করবে?
আলেকজান্ডার গ্ল্যাডিশ

সংযোগগুলির আচরণটি নির্ধারিত সময়সীমা এবং প্রকৃত ঘূর্ণনটি করতে যে সময় নেয় তার উপর নির্ভর করবে। লগগুলি প্রচুর না হলে আপনি কোনও সমস্যার মধ্যে পড়ে যাবেন তা আমি ভাবতে পারি না। রানিটের সাথে আমার কোনও অভিজ্ঞতা নেই তাই আমি আপনাকে বলতে পারি না যে প্রক্রিয়াটি বন্ধ করার ক্ষেত্রে মনিটর কী প্রতিক্রিয়া জানাবে।
চিহ্নিত করুন

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

1

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

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