Pull to refresh

Powershell — логирование в файл

Reading time2 min
Views42K
Доброго времени суток, $username!

Хочу поделиться с вами функцией, которую я использую вместо обычного вывода информации на экран или только записи в файл.

Функция была написана для того, чтобы информация выводилась и на экран и в лог (текстовый), предназначается для замены стандартного write-host.


Из вкусностей:
  • Точная дата и время события
  • Тип события
  • Подсчет ошибок и предупреждений
  • Вывод информации цветом (в зависимости от типа события)
  • Формат лога совместим с CSV ([TAB] separated)


Функция объявлена глобально, это значит что в пределах одной сессии достаточно один раз ее проиницилизировать — читай запустить файл с ней.

Варианты использования:
write-log "Hello Хабр!"
14.07.2011 00:22:15 info Hello Хабр!
write-log -message "Hello Хабр!" -type warning

write-log -message "Hello Хабр!" -type error -silent

Правда, путь должен существовать:
write-log -message "Hello Хабр!" -type CustomType logfile c:\enter\your\path\here.log


Количество ошибок и предупреждений (за всю сессию или до ручного обнуления переменных) хранятся в $errorcount и $warningcount.

Лично у меня эта функция храниться в файле set-functions.ps1, и в скриптах я ее вызываю так:

Cамое начало любого (там где это необходимо) моего скрипта:
$ver="0.1"
$ProgrammName="SomeScriptName"

try
{
	# Функция вывода информации на экран и записи в лог
	./Set-Functions.ps1 #Инициализация функций
	$global:logfilename = "log`\"+ $ProgrammName +".log"
	write-log "$ProgrammName (ver $ver) started."
}
catch 
{		
	return "Error loading functions Set-Functions.ps1"
}


Тело функции write-log:
$ver = "0.4"
$dt=Get-Date -Format "dd-MM-yyyy"
New-Item -ItemType directory log -Force | out-null #Создаю директорию для логов

$global:logfilename="log\"+$dt+"_LOG.log"
[int]$global:errorcount=0 #Ведем подсчет ошибок
[int]$global:warningcount=0 #Ведем подсчет предупреждений

function global:Write-log	# Функция пишет сообщения в лог-файл и выводит на экран.
{param($message,[string]$type="info",[string]$logfile=$global:logfilename,[switch]$silent)	
	$dt=Get-Date -Format "dd.MM.yyyy HH:mm:ss"	
	$msg=$dt + "`t" + $type + "`t" + $message #формат: 01.01.2001 01:01:01 [tab] error [tab] Сообщение
	Out-File -FilePath $logfile -InputObject $msg -Append -encoding unicode
	if (-not $silent.IsPresent) 
	{
		switch ( $type.toLower() )
		{
			"error"
			{			
				$global:errorcount++
				write-host $msg -ForegroundColor red			
			}
			"warning"
			{			
				$global:warningcount++
				write-host $msg -ForegroundColor yellow
			}
			"completed"
			{			
				write-host $msg -ForegroundColor green
			}
			"info"
			{			
				write-host $msg
			}			
			default 
			{ 
				write-host $msg
			}
		}
	}
}


У этого примера есть только один недостаток — она «синхронная», то есть не обрабатывает проблемы одновременной записи в лог-файл. Кто знает как это изменить, прошу в комменты.
Tags:
Hubs:
Total votes 14: ↑9 and ↓5+4
Comments5

Articles