2011-08-11 9 views
5

मेरे पास एक पर्ल स्क्रिप्ट है जिसका उपयोग डेटाबेस की निगरानी के लिए किया जाता है और मैं इसे पावरहेल स्क्रिप्ट के रूप में लिखने की कोशिश कर रहा हूं।लॉग पढ़ने कुशल

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

मुझे गेट-कंटेंट सेमीडलेट का उपयोग करने का विचार है, और अंतिम स्थिति में पढ़ना शुरू करें, फ़ाइल के अंत तक प्रत्येक पंक्ति को संसाधित करें और फिर स्थिति को सहेज लें।

क्या आपको कोई चाल पता है ताकि मैं पढ़ने के बाद लॉग फ़ाइल में स्थिति प्राप्त कर सकूं और पढ़ने के बाद किसी विशेष स्थान पर पढ़ सकूं।

या क्या यह हासिल करने के लिए एक बेहतर और/या आसान तरीका है?

Gísli

संपादित करें: यह स्क्रिप्ट के माध्यम से और कुछ अन्य उपकरण के साथ नहीं किया जा सकता है।

संपादित करें: तो मैं कहीं .NET एपीआई के साथ मिल रहा हूं लेकिन यह मेरे लिए काफी काम नहीं कर रहा है। मैं एक उपयोगी लिंक here और here

पाया यहाँ मैं अब तक है:

function check_logs{ 
param($logs, $logpos) 
$count = 1 
$path = $logs.file 
$br = 0 
$reader = New-Object System.IO.StreamReader("$path") 
$reader.DiscardBufferedData() 
$reader.BaseStream.Seek(5270, [System.IO.SeekOrigin]::Begin) 
for(;;){ 
    $line = $reader.ReadLine() 
    if($line -ne $null){$br = $br + [System.Text.Encoding]::UTF8.GetByteCount($line)} 
    if($line -eq $null -and $count -eq 0){break} 
    if($line -eq $null){$count = 0} 
    elseif($line.Contains('Error:')){ 
     $l = $line.split(',') 
     Write-Host "$line $br" 
    } 
} 

}

मैं तलाश समारोह सही ढंग से उपयोग करने के लिए एक तरह से नहीं मिली है। क्या कोई मुझे सही दिशा दिखा सकता है?

यदि मैं यह यह outputs 5270 चलाने लेकिन अगर मैं लाइन बाहर के साथ इस चलाने जहाँ मैं आधार धारा में तलाश करने की कोशिश मैं:

2011-08-12 08:49:36.51 Logon  Error: 18456, Severity: 14, State: 38. 5029 
2011-08-12 08:49:37.30 Logon  Error: 18456, Severity: 14, State: 38. 5270 
2011-08-12 16:11:46.58 spid18s  Error: 1474, Severity: 16, State: 1. 7342 
2011-08-12 16:11:46.68 spid18s  Error: 17054, Severity: 16, State: 1. 7634 
2011-08-12 16:11:46.69 spid29s  Error: 1474, Severity: 16, State: 1. 7894 

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

मुझे क्या याद आ रही है ?????

Gísli

+0

+1। मैंने इससे पहले नहीं सुना था। बस सोच रहा है, क्या आप स्क्रिप्ट को पर्ल स्थापित करने से कम मुश्किल होने की उम्मीद करते हैं या क्या इसमें कोई आवश्यकता समस्या शामिल है? –

+0

पुन: लिखना नरक है यदि आप यही पूछ रहे हैं। बात यह है कि हम दूसरों के लिए डेटाबेस की निगरानी करते हैं और इससे भविष्य में नए विंडोज सर्वर पर सेटअप आसान हो जाएगा। मुझे यह भी जिक्र करना चाहिए कि मैं इस गर्मी में एक इंटर्न हूं और यह प्रोजेक्ट मुझे कोड सीखने और स्क्रिप्ट्स क्या कर रहा है समझने का एक तरीका है। और वे चाहते थे कि कोई व्यक्ति शक्तिशक्ति सीखना शुरू कर दे। तो संक्षेप में, शायद पर्ल स्थापित करना और उस स्क्रिप्ट का उपयोग करना आसान होगा। – Gisli

+0

इस बात पर बिल्कुल यकीन नहीं है कि आप इस समय के लिए क्या पूछ रहे हैं - मेरे पास एक और पढ़ा जाएगा लेकिन अपने चर की जांच करें - $ l विभाजन की वापसी है लेकिन आप $ लाइन लिख रहे हैं - क्या आपका मतलब था? – Matt

उत्तर

2

आप शायद कुछ .net वस्तुओं आदि के साथ ऐसा करने में सक्षम हो जाएगा ...

यदि यह मैं बहुत अतीत logparser हालांकि मत देखो एक अधिक मानक स्वरूपित लॉग फ़ाइल है। यह समय से पहले भयानक था और अभी भी कमाल है!

आप इसे कमांड लाइन या COM के माध्यम से PowerShell के साथ उपयोग कर सकते हैं। इसमें यह फ़ाइल करने की क्षमता है कि यह फ़ाइल में कहां था और वहां से उठाएं (जानकारी को एलपीसी फ़ाइल में संग्रहीत करें)।

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

उम्मीद है कि कुछ बेहतर है ...

संपादित करें:

फ़ाइल टैब सीमांकित किया जाता है, तो आप आयात सीएसवी आदेश का उपयोग करें और पिछले नंबर स्टोर कर सकते हैं (यह या तो गिनती या गिनती -1 अगर हेडर संख्या में शामिल है होगी)। पिछले संख्या के साथ आप फ़ाइल

# use Import-CliXML to get the $last_count 
Import-CliXML $path_to_last_count_xml 
$file = Import-Csv filename -delimiter "`t" 
for ($i=$last_count; $i -gte $file.count; $i++) { 
    $line = $file[$i] 
    # do something with $line 
    ... 
} 
$last_count = $file.count | Export-CliXML $path_to_last_count_xml 

# use this to clear the memory 
Remove-Variable $file 
[GC]::collect 

में अंतिम बिंदु पर जा सकते हैं या आप सीधे sp_readerrorlog का उपयोग कर डीबी क्वेरी सकता है; आखिरी बार उपरोक्त अंतिम गणना की तरह उपयोग करना।

+0

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

+0

हाँ यह है ... आपकी लॉग फ़ाइल किस प्रारूप में है? – Matt

+0

यह त्रुटि है कि MSSQL सर्वर बनाता है। यह एक सादा पाठ फ़ाइल है जिसमें कोई विस्तार नहीं है (फ़ाइल प्रकार 'फ़ाइल') – Gisli

0

यदि आप वास्तव में PowerShell के साथ जाना चाहते हैं तो दो विकल्प हैं जो मैं सुझाव दूंगा।

  1. .NET फ़ाइल API का उपयोग करें।

  2. लॉग की पूरी सामग्री पढ़ें और फिर इसे साफ़ करें। डेटाबेस में पार्स की गई सामग्री को स्टोर करें।

+0

को टिप के लिए धन्यवाद देने से पहले पूरी फ़ाइल आयात करता है। मैं कल इसे देखूंगा – Gisli

1

यदि आपका उद्देश्य केवल पूर्व पंक्ति में पढ़ने वाली अंतिम पंक्ति से फ़ाइल को पढ़ना है, तो कृपया इस उत्तर को अनदेखा करने के लिए स्वतंत्र महसूस करें। हालांकि अगर आप आखिरी चेक टाइम के बाद से कोई त्रुटि प्राप्त करने की कोशिश कर रहे हैं तो इससे मदद मिल सकती है।


[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | Out-Null 
$server = 'ServerName' 
$chkDate = Get-Date -Date '8/16/2011 15:00' # time of last check 
$srvObj = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server -argumentList $srv 
$srvObj.ReadErrorLog(0) | foreach { if ($_.LogDate -notlike '' ` 
    -and $_.LogDate -ge $chkDate ` 
    -and $_.Text -like 'Error: *') {$_}} |ft -AutoSize 

आप एक फ़ाइल से पिकअप तो पिछले रन समय है, या बस पता है कि तुम इस पर हर घंटे या जो कुछ भी चलाने के लिए, आप $ chkDate समायोजित केवल फ़ाइल के अंत तक फिर से त्रुटियों को दिखाने के लिए कर सकते हैं।

($ srvObj.ReadErrorLog (0) पंक्ति के अंत और अगली पंक्ति में उन बैक-टिक (`) के लिए बाहर देखते हैं। वे हमेशा बाहर मेरे लिए HTML में आते हैं)

[Tell] (http://perldoc.perl.org/functions/tell.html) फ़ंक्शन का उल्लेख करने के लिए
+0

उत्तर के लिए धन्यवाद। इसका उद्देश्य केवल फाइल को पढ़ना है।लेकिन क्या आपके पास एक लिंक है ताकि मैं आपके द्वारा उपयोग किए जा रहे कार्यों के बारे में कुछ और पढ़ सकूं। ReadErrorLog, LogDate, टेक्स्ट की तरह। मुझे डर है कि इस बिंदु पर मेरे लिए मेरे लिए जटिल कुछ कोड है लेकिन मैं इसे समझना चाहता हूं। – Gisli

+0

आपको हे इस लेख से कुछ मिल सकता है, स्क्रिप्टिंग गाय http://blogs.technet.com/b/heyscriptingguy/archive/2011/05/31/use-powershell-to-get-the-sql-server- error-log.aspx एसएमओ संस्करण लगभग पृष्ठ के नीचे है। MSDN पर Microsoft.SQLServer.SMO .NET Framework से सर्वर क्लास का एक लिंक भी है। – Bruce

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