Powershell Script ile Log Otomasyonu
  1. Anasayfa
  2. Microsoft PowerShell

Powershell Script ile Log Otomasyonu

0

Birçok firma altyapısında hizmet veren uygulama loglarının mevcut makineler üzerinde oldukça alan tuttuğunu ve disk ile ilgili yer problemlerinin yaşandığını görürüz.

Özellikle büyük ölçekli firmalarda log yönetimi third party yazılımlarla sağlanmaktayken özellikle Powershell gibi güçlü bir scripting ürünü ile bu işi yapmak gerek maliyet, gerekse yönetim açısından oldukça avantajlı hale gelmektedir.

Bu senaryomuzda şirketinizde, işletmenizde ya da en basitinden test ortamınızda kullanabileceğiniz Log Otomasonu sürecini Powershell Script kullanarak nasıl yönetebileceğinizi göreceğiz.

Birden fazla makinede disk üzerinde tutulan logları 7zip kullanarak sıkıştırıp farklı bir disk üzerine alacağımız akıllı bir yapı tasarlayacağız:

Çalışmamıza yazılan scripti parça parça açıklayarak başlayacağım:

Scriptin çalışma yapısından genel olarak bahsetmem gerekirse;

Birden fazla makinede source ve destination olarak belirlediğimiz pathleri alıp ve source alanında bulunan log dosyalarının da uzantısını kullanıp, belirli günden eski logları 7zip ile sıkıştırıp farklı bir diske taşımayı amaçlıyoruz. Buradaki kritik noktalardan biri Powershell scriptimizi birden fazla makinede çalıştıracağımız için gerekli firewall tanımlarının tam olması ve ilgili makinelere mutlaka uzak erişimlerin olması gerekmektedir.

Scriptin ilk kısmında, fonksiyon parametlerini tanımlıyoruz.

Burada SourcePath, DestinationPath, FileNameExtensions, daysBack alanlarını değişken olarak tanımlıyoruz ve logların o anki günden kaç gün eski logların arşivleneceğini belirteceğimiz bir değişken daha tanımlıyoruz:

 

function move-log {
[CmdletBinding()]

Param

(

[Parameter(Mandatory=$false)][ValidateScript({ Test-Path $_ -PathType Container })]
[string]$SourcePath = "SOURCE UNC PATH YAZ",
[Parameter(Mandatory=$false)][string]$FileNameExtensions = "*.txt*",
[Parameter(Mandatory=$false)][string]$DestinationPath = "DESTINATION UNC PATH YAZ",
[Parameter(Mandatory=$false)][int]$daysBack="x"

)

$refDate=(Get-Date).AddDays(-$daysBack)
$Files=Get-ChildItem -filter *.txt* -Path $SourcePath | where {$_.LastWriteTime -lt "$refDate"}

 

Bu kısımda, sıkıştırma işlemini 7zip ile yapacağımız için 7zip.exe’nin sıkıştırma işleminin yapılacağı remote makinede mutlaka olması gerekmektedir. Bu kontrolü yapıp, log dosyalarının son yazılma tarihi(LastWriteTime) kontrol edilerek anlamlı bir dosya isimlendirmesi yapıyoruz. Böylece sıkıştırma işlemini yaptığımız logların hangi tarihte etiketlediğimizi görebileceğiz:

 

if(Test-Path "7zip exenin bulunduğu UNC path"){

Foreach ($File in $Files)

{
$FileCreationTime = Get-Date ($File.LastWriteTime) -Format "MMddyyyyHHmmssffff"

$ChangeFileName = $File.FullName

if ($ChangeFileName -like $FileNameExtension)

{
$FileNewName = $FileCreationTime + $FileNameExtensions
try
{
Rename-Item -Path $ChangeFileName -NewName $FileNewName -Verbose
}
catch [System.Net.WebException],[System.Exception]
{
Write-Host " İsim düzenlenemedi. - $($_.Exception.Mesage)"
}
}
}

 

Bu kısımda; daha önce son yazılma tarihine göre topladığımız log dosyalarını, son yazılma tarihi bilgisini içeren klasörlere gruplayarak atıyoruz ve artık loglar yazılma tarihlerine göre isimlendirilmiş klasörlerde olacak. Böylece yukarda belirttiğimiz referans değerlerine göre tüm loglar klasörlere taşınmış olacak:

 

Foreach ($File in $Files)

{

$FolderName = Get-Date ($File.LastWriteTime) -Format "yyyyMMdd"

$FolderPath = $SourcePath + $FolderName

$FolderNameStatus = Test-Path $FolderName

$MoveFileName = $File.FullName

if ($FolderNameStatus -eq $false)

{
try
{
New-Item -Path $SourcePath -Name $FolderName -ItemType Directory -Verbose -ErrorAction SilentlyContinue
}
catch [System.Net.WebException],[System.Exception]
{
Write-Host "Folder Oluşturulamadi. - $($_.Exception.Mesage)"
}
}

try
{
Move-Item -Path $MoveFileName -Destination $FolderPath -Verbose -ErrorAction SilentlyContinue
}
catch [System.Net.WebException],[System.Exception]
{
Write-Host "Dosyalar Tasinamadi. - $($_.Exception.Mesage)"
}
}

 

Sıra geldi en kritik kısma; bu aşamada sıkıştırma işlemine hazır olan log dosyalarını source path’den 7zip ile sıkıştırarak destination pathe taşıyoruz. Taşıma işlemini yapmasıyla beraber source pathde bulunan log dosyalarını tamamen silecek.

Burada kritik birkaç nokta var. İlk olarak 7zip parametlerini kullanırken sıkıştırma algoritmasının parametlerine dikkat etmek gerekir. Özellikle “mx” parametresi sıkıştırma düzeyini belirlemektedir. Biz en agresif sıkıştırma düzeyini seçiyoruz. İsteyenler 7zip algoritması olan LZMA algoritmasına bakarak detayları inceleyebilir.

İkinci nokta ise burada sıkıştırma işlemi sonrası source pathde tüm logların silineceğidir. Bu işlemi yaparken script içersine kontrol koydum fakat yine de kendi yapınızda çok dikkatli olmanız gerektiğinizi ve kontrolü yapınıza göre koymanız gerektiğini unutmayın:

 

foreach($Folder in $Folders)
{
$ZipSourceFolder = $SourcePath + $Folder.name
$ZipDestinationPath = $DestinationPath + $Folder.name + ".zip"
Write-Host "$($env:COMPUTERNAME)" -BackgroundColor Green
& "7zip.exe nin bulundugu UNC PATH" -mx=3 a $ZipDestinationPath $ZipSourceFolder
if(($Files.LastWriteTime -ne $null) -and ($Files.LastWriteTime -lt $refDate))
{
try
{
Remove-Item $ZipSourceFolder -recurse -force
}
catch [System.Net.WebException],[System.Exception]
{
Write-Host "Dosyalar Silinemedi. - $($_.Exception.Mesage)"
}
}
}

}else{write-Host "7z.exe Bulunamadi. Calisma Baslatilamadi.[$($env:COMPUTERNAME)]"}

}

 

Son kısımda ise hangi makinelerde bu işlemlerin yapılacağını belirtip makinelerimizi invoke olarak fonksiyonumuzu çağırıyoruz:

Kritik Nokta: Scriptin çalıştığı makine mutlaka invoke olarak erişeceği tüm makinelere SMB 445 ve TCP/HTTPS 5986 portları üzerinden erişimi olmak zorundadır. Aksi takdirde script çalışmayacaktır.

 

$Comps= get-content -Path "C:\servers.txt"
foreach ($Comp in $Comps)
{
Invoke-Command -ComputerName $Comp -ScriptBlock ${Function:move-log}
}

 

Test için script içerisindeki makinelerden birinde bu işlemleri denediğimiz aşağıdaki gibi başarıyla tüm süreci tamamladığını görürürüz:

Aşağıdaki alanda source path loglarımız olsun:

Resim-1

 

Şimdi bu logları belirttiğimiz referans değerlerine göre sıkıştırıp farklı bir diske taşıyacağız:

0 günden eski logları alıp “LastWriteTime” göre gruplayıp sıkıştırılmış halde taşımasını istiyorum:

Örnek:

[Parameter(Mandatory=$false)][ValidateScript({ Test-Path $_ -PathType Container })]
[string]$SourcePath = "D:\testlogs\",
[Parameter(Mandatory=$false)][string]$FileNameExtensions = "*.txt*",
[Parameter(Mandatory=$false)][string]$DestinationPath = "E:\testlogs\",
[Parameter(Mandatory=$false)][int]$daysBack="0"

Scriptimizi yukardaki referans değerlerine göre çalıştırdığımızda aşağıdaki gibi source pathde yer alan log dosyalarını başarılı bir şekilde destination pathe tarih bazında taşıdığını ve source pathden ilgili logları sildiğini görüyoruz:

Resim-2

 

Resim-3

 

Resim-4

 

Source path kontol ettiğimizde ilgili logları görmemiz gerekir. Böylece örnek bir senaryo ile bir ya da birden fazla makinede nasıl log yönetimini sağlayacağımızı görmüş olduk. Bu işlemlerin otomasyon tarafı ise farklı yöntemlerle yapılabilir. İlk ve en basit yöntem bu scriptinizi Task Scheduler koymak olabilir. Benim önerim bir önceki yazımda bahsettiğim ürün olan System Center Orchestrator ile bu işi otomatize etmeniz yönündedir. Powershell scriptinizi bir önceki yazımda bahsetttiğim şekilde Orchestrator’da “Execute PS Script” kullanarak bu işlemi birden fazla makinede yaptırıp herhangi bir zamanda çalıştırıp rahatlıkla otomatize edebilirsiniz.

Scriptin tamamını paylaşmıyorum. Parçaları birleştirip kendiniz test ederek daha efektif kullanacağınızı düşünüyorum.

Bir sonraki yazıda görüşmek üzere.

Bu konuyla ilgili sorularınızı  alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.

Referanslar

www.mshowto.org

TAGs:  Powershell Script ile Log Otomasyonu,Log Nedir

Bu İçeriğe Tepkin Ne Oldu?
  • 4
    harika_
    Harika!!
  • 0
    be_enmedim
    Beğenmedim
  • 0
    _ok_iyi
    Çok iyi
  • 1
    sevdim_
    Sevdim!
  • 0
    bilemedim_
    Bilemedim!
  • 0
    olmad_
    Olmadı!
  • 0
    k_zd_m_
    Kızdım!

1989 yılında Samsun’da doğdu. Üniversite öncesi öğrenimini Samsun’da tamamladı. Ondokuz Mayıs Üniversitesi Bilgisayar Mühendisliği mezunudur. Aynı zamanda Kocaeli Üniversitesi’nde MBA yapmaktadır. IT System Administrator olarak 2014'den beri birçok firmada görev almıştır. Şu an özel bir bankada IT System Administrator olarak çalışmaktadır. MSHOWTO bünyesinde; Windows Server, Powershell, IT Automation Projects, System Center Orchestrator, SCOM, SCCM, Cloud Solutions alanlarında yazarlık yapmaktadır.

Yazarın Profili

Bültenimize Katılın

Tıklayın, üyemiz olun ve yeni güncellemelerden haberdar olan ilk kişi siz olun.

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir