Powershell: логирование в json

Эта функция используется для записи логов в формате JSON. Функция принимает несколько параметров:

  • $logpath — строка, указывающая путь к директории, в которой будут храниться логи;
  • $Message — строка, содержащая сообщение для записи в лог;
  • $logname — строка, указывающая имя файла лога;
  • $Result — строка, указывающая результат выполнения скрипта («ERROR», «Warning», «Success»);
  • $PathConfig — необязательная строка, содержащая путь к конфигурационному файлу;
  • $OldValue — необязательная строка, содержащая старое значение;
  • $NewValue — необязательная строка, содержащая новое значение;
  • $e_error — необязательная строка, содержащая текст ошибки.

Сначала функция проверяет, существует ли директория для хранения логов. Если директория не существует, она создается. Затем функция создает новую запись лога с помощью хэш-таблицы, содержащей информацию о времени записи, сообщении, пути к конфигурационному файлу (если он указан), старом и новом значениях (если они указаны), тексте ошибки (если он указан) и результате выполнения скрипта.

Далее функция проверяет, есть ли уже записи в логе. Если записей нет, создается новый объект лога, в котором содержится информация о имени сервера, имени скрипта и пустом массиве ConfigDataLog. Если в логе уже есть записи, текущий лог загружается в переменную $CurrentLog.

Затем функция добавляет новую запись лога в массив ConfigDataLog текущего лога и сохраняет его в файле JSON, перезаписывая предыдущие записи лога.

Если переменная $Env:DelLog равна 0, то перед сохранением текущего лога функция удаляет файл предыдущего лога, чтобы не было дубликатов записей. Если $Env:DelLog равна 1, то удаление предыдущего лога уже было выполнено.

$Env:DelLog = 0; # переменная нужна, если нужно удалить логи при первом запуске скрипта

function Add-WriteLog {
    param (
        [ValidateNotNullOrEmpty()] [Parameter(Mandatory=$True)] [string] $logpath,
        [Parameter(Mandatory=$True)] [string] $Message,
        [ValidateNotNullOrEmpty()] [Parameter(Mandatory=$True)] [string] $logname,
        [ValidateSet("ERROR", "Warning", "Success")] [Parameter(Mandatory=$True)] [string] $Result,
        [string] $PathConfig = "",
        [string] $OldValue = "",
        [string] $NewValue = "",
        [string] $e_error = ""
    )
    #Create log folder
    $logpathname = "$logpath\$logname.json";
    $testlogpath=Test-Path -Path $logpath
    if (!$testlogpath) {
        New-Item -Path $logpath -ItemType "directory";
    }
    else {
        if ($Env:DelLog -eq 0) {
            Remove-Item -Path $logpathname -ErrorAction Ignore
            $Env:DelLog = 1
        }    
    }

    $date = "$(Get-Date -Format dd-MM-yyyy)";
    $time = "$(Get-Date  -Format HH:mm:ss)" ;
    $Time_Stamp = $date +" "+ $time;
    
    $NewLogData  = [Ordered] @{
            'Time' = $Time_stamp; 
            'Message' = $Message; 
            'PathConfig' = $PathConfig; 
            'OldValue' = $OldValue;
            'NewValue' = $NewValue;
            'Error' = $e_error;
            'Result' = $Result;} 
    
    $CurrentLog = Get-Content -Path $logpathname -Raw -ErrorAction Ignore | ConvertFrom-Json; 
    #If the log file is empty, CurrentLog cannot have a method called as it's 'Null Valued'.
    #Test for Null Value, if true, create CurrentLog as an Object 
    if (([string]::IsNullOrEmpty($CurrentLog)))
    {    
       $CurrentLog =  @{
            'ServerName' = $Env:Computername;
            'ScriptName' = $logname;
            'ConfigDataLog' = @();
         }
    }
    $CurrentLog.ConfigDataLog += $NewLogData 
    $CurrentLog | ConvertTo-Json | Out-File $logpathname;
}
# На выходе получаем json:
{
    "ServerName":  "COMP01",
    "ScriptName":  "DetailService",
    "ConfigDataLog":  [
                          {
                              "Time":  "26-01-2021 15:24:54",
                              "Message":  "Startup script",
                              "PathConfig":  "",
                              "OldValue":  "",
                              "NewValue":  "",
                              "Error":  "",
                              "Result":  "Success"
                          },
                          {
                              "Time":  "26-01-2021 15:24:54",
                              "Message":  "File 22.ps1 found",
                              "PathConfig":  "",
                              "OldValue":  "",
                              "NewValue":  "",
                              "Error":  "",
                              "Result":  "Success"
                          },
                          {
                              "Time":  "26-01-2021 15:24:54",
                              "Message":  "Get content success",
                              "PathConfig":  "C:\\Scripts\\00\\DOC\\config\\Web.config",
                              "OldValue":  "",
                              "NewValue":  "",
                              "Error":  "",
                              "Result":  "Success"
                          },
                          {
                              "Time":  "26-01-2021 15:24:54",
                              "Message":  "xPath exist",
                              "PathConfig":  "C:\\Scripts\\00\\DOC\\config\\Web.config",
                              "OldValue":  "",
                              "NewValue":  "",
                              "Error":  "",
                              "Result":  "Success"
                          },
                          {
                              "Time":  "26-01-2021 15:24:54",
                              "Message":  "xPath changed!",
                              "PathConfig":  "C:\\Scripts\\00\\DOC\\config\\Web.config",
                              "OldValue":  "olduser",
                              "NewValue":  "newuser",
                              "Error":  "",
                              "Result":  "Success"
                          },
                          
                          {
                              "Time":  "26-01-2021 15:24:54",
                              "Message":  "Save config and stop script",
                              "PathConfig":  "C:\\Scripts\\00\\DOC\\config\\Web.config",
                              "OldValue":  "",
                              "NewValue":  "",
                              "Error":  "",
                              "Result":  "Success"
                          }
                      ]
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *