Tôi có một tập lệnh perl được sử dụng để giám sát cơ sở dữ liệu và tôi đang cố viết nó dưới dạng tập lệnh PowerShell.Tạo nhật ký đọc hiệu quả
Trong tập lệnh perl có chức năng đọc thông báo lỗi và lọc ra vấn đề quan trọng và trả về nó. Nó cũng lưu vị trí hiện tại của tệp nhật ký để lần sau nó phải đọc nhật ký, nó có thể bắt đầu từ vị trí còn lại thay vì đọc toàn bộ nhật ký một lần nữa. Việc này được thực hiện bằng cách sử dụng chức năng cho biết chức năng.
Tôi có ý tưởng sử dụng lệnh ghép ngắn Get-Content và bắt đầu đọc ở vị trí cuối cùng, xử lý từng dòng cho đến khi kết thúc tệp và sau đó lưu vị trí.
Bạn có biết bất kỳ thủ thuật nào để tôi có thể lấy vị trí trong tệp nhật ký sau khi đọc và bắt đầu đọc tại một vị trí cụ thể không.
Hoặc có cách nào tốt hơn và/hoặc dễ dàng hơn để đạt được điều này không?
Gísli
CHỈNH SỬA: Việc này phải được thực hiện thông qua tập lệnh chứ không phải với một số công cụ khác.
EDIT: Vì vậy, tôi đang nhận được một nơi nào đó với các.NET API nhưng nó không hoàn toàn làm việc cho tôi. Tôi tìm thấy một liên kết hữu ích here và here
Dưới đây là những gì tôi có cho đến nay:
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"
}
}
}
tôi đã không tìm thấy một cách để sử dụng chức năng tìm kiếm chính xác. Ai đó có thể chỉ cho tôi đi đúng hướng?
Nếu tôi chạy nó này đầu ra 5270 nhưng nếu tôi chạy này với ra đường, nơi tôi cố gắng tìm kiếm trong các dòng cơ bản tôi nhận được:
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
Trường hợp phần đầu tiên là dòng đọc từ nhật ký và số ở cuối đại diện cho các byte được đọc tại thời điểm đó. Vì vậy, như bạn có thể thấy tôi đang cố gắng sử dụng chức năng tìm kiếm để bỏ qua dòng lỗi đầu tiên nhưng như tôi đã nói trước đó đầu ra là 5270 nếu tôi sử dụng chức năng tìm kiếm.
Tôi đang thiếu gì ?????
Gísli
+1 để đề cập đến hàm [tellper (http://perldoc.perl.org/functions/tell.html). Tôi đã không nghe nói về nó trước đây. Chỉ cần tự hỏi, bạn có mong đợi viết lại kịch bản được ít khó khăn hơn so với cài đặt Perl hoặc là có một vấn đề yêu cầu liên quan? –
Viết lại là địa ngục nếu đó là những gì bạn đang yêu cầu. Vấn đề là chúng tôi giám sát cơ sở dữ liệu cho người khác và điều này sẽ làm cho việc thiết lập dễ dàng hơn tại các máy chủ Windows mới trong tương lai. Tôi cũng nên đề cập rằng tôi là một thực tập sinh vào mùa hè này và dự án này cũng là một cách để cho tôi tìm hiểu mã và hiểu những gì các kịch bản đang làm. Và họ cũng muốn ai đó bắt đầu học PowerShell. Vì vậy, trong ngắn hạn, nó có lẽ sẽ dễ dàng hơn để cài đặt perl và sử dụng kịch bản đó. – Gisli
không hoàn toàn chắc chắn những gì bạn đang yêu cầu tại thời điểm này - tôi sẽ có một đọc nhưng kiểm tra các biến của bạn - $ l là sự trở lại của sự chia rẽ nhưng bạn đang viết $ line - bạn có nghĩa là? – Matt