Логирование в файл

  • Михаил
  • 12 мин. на прочтение
  • 95
  • 12 Dec 2014
  • 12 Dec 2014

Хочу поделиться с вами функцией, которую я использую вместо обычного вывода информации на экран или только записи в файл. Функция была написана для того, чтобы информация выводилась и на экран и в лог (текстовый), предназначается для замены стандартного 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
}
}
}
}


 
 У этого примера есть только один недостаток — она «синхронная», то есть не обрабатывает проблемы одновременной записи в лог-файл.