2010-08-05 16 views
9

मैं कुछ लॉग प्रणाली के साथ काम जो एक लॉग फ़ाइल हर घंटे बनाता है के साथ नवीनतम लॉग फ़ाइल -f पूंछ को, इस प्रकार की तरह:कैसे किसी दिए गए पैटर्न

SoftwareLog.2010-08-01-08 
SoftwareLog.2010-08-01-09 
SoftwareLog.2010-08-01-10 

मैं नवीनतम पालन करने के लिए पूंछ कोशिश कर रहा हूँ लॉग फ़ाइल एक पैटर्न दे रही है (उदाहरण के लिए SoftwareLog *) और मैं वहाँ का एहसास:

tail -F (tail --follow=name --retry) 

लेकिन यह है कि केवल एक विशिष्ट नाम का पालन करें - और इन दिनांक और घंटे के हिसाब से अलग-अलग नाम है। मैं कुछ ऐसा करने की कोशिश की:

tail --follow=name --retry SoftwareLog*(.om[1]) 

लेकिन इससे पहले कि यह पूंछ के लिए पारित हो जाता है और यह नहीं है पुन: निष्पादित हर पूंछ पुनर्प्रयास वाइल्डकार्ड बयान resoved है।

कोई सुझाव?

उत्तर

6

[संपादित करें: एक उपकरण के लिए एक त्वरित Googling के बाद]

आप multitail बाहर की कोशिश करना चाहते हो सकता है - http://www.vanheusden.com/multitail/

आप (डेनिस विलियमसन जवाब के साथ रहना चाहता हूँ और मैं कर दिया है तो + 1'ed उसके अनुसार) यहां आपके लिए भरे हुए रिक्त स्थान हैं।

अपने खोल में, निम्न स्क्रिप्ट चलाने के (या इसे zsh बराबर है, मैं इस पार्टी में इससे पहले कि मैं zsh टैग देखा मार पड़ी है):

#!/bin/bash 

TARGET_DIR="some/logfiles/" 
SYMLINK_FILE="SoftwareLog.latest" 
SYMLINK_PATH="$TARGET_DIR/$SYMLINK_FILE" 

function getLastModifiedFile { 
    echo $(ls -t "$TARGET_DIR" | grep -v "$SYMLINK_FILE" | head -1) 
} 

function getCurrentlySymlinkedFile { 
    if [[ -h $SYMLINK_PATH ]] 
    then 
     echo $(ls -l $SYMLINK_PATH | awk '{print $NF}') 
    else 
     echo "" 
    fi 
} 

symlinkedFile=$(getCurrentlySymlinkedFile) 
while true 
do 
    sleep 10 
    lastModified=$(getLastModifiedFile) 
    if [[ $symlinkedFile != $lastModified ]] 
    then 
     ln -nsf $lastModified $SYMLINK_PATH 
     symlinkedFile=$lastModified 
    fi 
done 

पृष्ठभूमि कि सामान्य विधि (फिर से उपयोग प्रक्रिया, मैं zsh पता नहीं है, इसलिए यह अलग हो सकता है) ...

./updateSymlink.sh 2>&1 > /dev/null

फिर tail -F $SYMLINK_PATH तो पूंछ प्रतीकात्मक कड़ी या फ़ाइल की एक रोटेशन के बदलते हाथ है।

यह थोड़ा पतला है, लेकिन मुझे पूंछ के साथ ऐसा करने का एक और तरीका पता नहीं है। अगर किसी और को यह उपयोग करने वाली उपयोगिता के बारे में पता है, तो उन्हें आगे बढ़ने दें क्योंकि मुझे इसे खुद भी देखना अच्छा लगेगा - डिफ़ॉल्ट रूप से जेटी जैसे एप्लिकेशन इस तरह से लॉग इन करते हैं और मैं हमेशा एक क्रोन पर एक सिम्लिंकिंग स्क्रिप्ट को स्क्रिप्ट करने के लिए स्क्रिप्ट करता हूं इसके लिए।

[संपादित करें: लाइनों में से किसी एक के अंत से एक गलत 'जे' हटा दिया गया।तुम भी एक बुरा चर नाम "lastModifiedFile" मौजूद नहीं था था, उचित नाम आपके द्वारा सेट किए है "lastModified"]

+0

धन्यवाद, मैं ऐसा करने के लिए हो सकता है। मैं multitail में देखा, लेकिन दुर्भाग्य से यह जिसका मतलब है मैं पाइप इसे कहीं और उत्पादन है नहीं कर सकते हैं इंटरैक्टिव केवल है। मैं कोशिश करूँगा और देख सकता हूं कि मुझे कहां मिल रहा है। बात मैं केवल रन जब पूंछ चल रहा है और बाहर निकलने के लिए इस चाहते हैं जब कि बाहर निकालता है, और मैं ऐसा करने के लिए कैसे यकीन नहीं है। – Axiverse

+0

धन्यवाद! यह मूल रूप से एकमात्र समाधान है जिसे मैंने पसंद किया (और मैंने इसके लिए बहुत कुछ खोजा)। –

+0

नीटो। एक बग को ठीक करने के लिए संपादित किया गया जहां यह मेरे लिए पहली बार काम नहीं करेगा। (GetCurrentlySymlinkedFile कोई रिक्त स्ट्रिंग लौटने क्योंकि था, और typo'd अस्तित्वहीन lastModifiedDate भी रिक्त स्ट्रिंग पर मूल्यांकन किया।) – funroll

2

मैं इस परीक्षण नहीं किया है, लेकिन एक दृष्टिकोण है कि काम कर सकते हैं एक पृष्ठभूमि प्रक्रिया है कि बनाता है और नवीनतम लॉग फ़ाइल के लिए एक सिमलिंक अद्यतन करता है चलाने के लिए होगा और फिर आप tail -f होगा (या tail -F) सिमलिंक।

11

मेरा मानना ​​है कि इस प्रकार सरल समाधान है:

tail -f `ls -tr | tail -n 1` 

, अब अगर आपके निर्देशिका "SystemLog" जैसे अन्य लॉग फ़ाइलें हैं और आप केवल नवीनतम "SoftwareLog" फ़ाइल चाहते हैं, तो आप एक ग्रेप शामिल बस देंगी:

tail -f `ls -tr | grep SoftwareLog | tail -n 1` 
+6

या पूंछ के बजाय सिर का उपयोग करें, चीजों को सरल = आयकर ls बनाने के लिए) | सिर -1 | xargs पूंछ एफ –

+0

या उपयोग किया जा सकता है: '' 'पूंछ -f SoftwareLog.'date + '% Y-% m-% डी% H''' '' –

0
#!/bin/bash 

PATTERN="$1" 

# Try to make sure sub-shells exit when we do. 
trap "kill -9 -- -$BASHPID" SIGINT SIGTERM EXIT 

PID=0 
OLD_FILES="" 
while true; do 
    FILES="$(echo $PATTERN)" 
    if test "$FILES" != "$OLD_FILES"; then 
    if test "$PID" != "0"; then 
     kill $PID 
     PID=0 
    fi 
    if test "$FILES" != "$PATTERN" || test -f "$PATTERN"; then 
     tail --pid=$$ -n 0 -F $PATTERN & 
     PID=$! 
    fi 
    fi 
    OLD_FILES="$FILES" 
    sleep 1 
done 

तो यह रूप में चलाने: tail.sh 'SoftwareLog*'

स्क्रिप्ट कुछ लॉग लाइनों अगर लॉग जांचों के बीच करने के लिए लिखा जाता है खो देंगे। लेकिन कम से कम यह एक ही स्क्रिप्ट है, जिसमें कोई सिम्लिंक आवश्यक नहीं है।

संबंधित मुद्दे