LogRotate फ़ाइल नाम के लिए regex का उपयोग करें


3

मेरे पास एक कस्टम लॉगिंग वर्ग है जो प्रक्रिया के प्रत्येक उदाहरण के लिए एक लॉग बनाता है और लॉग फ़ाइल के नाम, उदाहरण के लिए एक अद्वितीय आईडी जोड़ता है:

  • process.1234.log
  • process.1235.log

इसके अलावा, मैं एक तारीख / समय टिकट भी जोड़ सकता हूं, उदाहरण:

  • process.1234.03012012.log
  • process.1235.03012012.log

क्या LogRotate में regex का उपयोग करने की क्षमता है, इसलिए मैं अपनी लॉग फ़ाइलों को दिनांक और / या प्रक्रिया आईडी से संग्रहीत कर सकता हूं?

जवाबों:


5

मुझे नहीं पता कि बाद के संस्करण क्या करते हैं, लेकिन आगे के शोध के बाद मैंने पाया कि शेल वाइल्डकार्ड समर्थित हैं। दोनों *(एक से अधिक वर्णों का मिलान) और ?(किसी एक वर्ण से मेल खाते) को विशिष्ट फ़ाइलों के मिलान के लिए जोड़ा जा सकता है।

एक उदाहरण के रूप में, यहां वे पैटर्न हैं जो आपके उपयोग के मामले के साथ-साथ एक फ़ाइल के बाकी हिस्सों से मेल खाते हैं जो कि पाया जा सकता है /etc/logrotate.d/process

/path/to/my/logfiles/process.????.????????.log
/path/to/my/logfiles/process.????.log
{

    # Look for previously matched log files and rotate daily if found
    daily

    # use date as a suffix of the rotated file
    dateext

    # Compress log file, optional if the files are small enough
    compress

    # Allow for a log file pattern to NOT match in order to support both
    # filename formats
    missingok

    # Do not create replacement log files, the application will do that
    nocreate

    # Keep 30 days worth of rotated logs
    maxage 30
}

हालाँकि यदि आपने processवास्तविक प्रक्रिया आईडी के लिए प्लेसहोल्डर बनने का इरादा किया है, तो मेरा मानना ​​है कि आप प्रक्रिया आईडी नंबर की जगह वाइल्डकार्ड का उपयोग करके दूर हो सकते हैं:

/path/to/my/logfiles/*.????.????????.log
/path/to/my/logfiles/*.????.log
{
    ...
}

आशा है कि ये आपकी मदद करेगा। मैं भी एक रेगेक्स दृष्टिकोण की तलाश में था जो काम करेगा और आखिरकार मैंने जो महसूस किया, उसके बजाय शेल वाइल्डकार्ड के उपयोग पर निर्णय लिया, लेकिन अधिक जटिल समाधान।

एक उदाहरण:

एक रेग्ज समाधान के लिए खोज करते समय मुझे एक ब्लॉग पोस्ट मिली, जिसका शीर्षक था, " लॉगब्रोट ग्लोबिंग मैच से फाइल को छोड़ना " जो इस समाधान को प्रदान करता है:

/var/log/upstart/*.log {
    daily
    missingok
    rotate 7
    compress
    notifempty
    nocreate
    nosharedscripts
    prerotate
        bash -c "[[ ! $1 =~ testprogram ]]"
    endscript
}

मैंने उस उदाहरण में से दो वस्तुओं को खींच कर समाप्त किया और मैच को थोड़ा संशोधित किया। मेरी स्थिति में मैं कुछ इनपुट फ़ाइलों को छोड़कर एक निर्देशिका में सभी फ़ाइलों को घुमाना चाहता था, जिनमें .inpविस्तार है।

मैंने ये ढूंढ निकाला:

# Force the prerotate "script" below to be run on each individual file
# in order to verify that it isn't an unprocessed input file
nosharedscripts

# Skip rotating any unprocessed input files (*.inp extension)
prerotate
   bash -c "[[ ! $1 =~ \.inp$ ]]"
endscript

इसके अनुसार logrotate -d /etc/logrotate.d/myfilenameकाम करता प्रतीत होता है। हालांकि जैसा कि मैंने उल्लेख किया है कि मैंने शेल वाइल्डकार्ड दृष्टिकोण का विकल्प चुना क्योंकि मेरे पीछे आने वाले किसी व्यक्ति के लिए इसे बनाए रखना आसान था।


बैश-सी आवश्यक है? मुझे लगता है कि लिनक्स के तहत कम से कम, / बिन / शट उस सिंटैक्स का सीधे समर्थन करेगा।
पीटर

@ पक्का नहीं। मैंने एक अलग दिशा में जाना समाप्त कर दिया है, इसलिए मुझे विश्वास नहीं होता कि मैंने जो भी नोट किया था उससे कहीं अधिक परीक्षण किया। यदि आप परीक्षण करते हैं और पुष्टि करते हैं कि मुझे अपने उत्तर को अपडेट करने में खुशी होगी कि क्या / आवश्यक नहीं है।
18'18
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.