воскресенье, 19 июня 2011 г.

Граббер (бэкап) лога службы DHCP Windows Server 2003 на PowerShell 2.0

Логи службы DHCP Windows Server 2003 хранятся в папке C:\Windows\System32\DHCP в формате текстовых файлов с именами в формате DhcpSrvLog-Sat.log, где Sat - наименование дня. Соответственно, каждую неделю файлы затираются.

Для ежедневного копирования таких логов написан следующий небольшой скриптик, который:
  • необходимо запускать каждый день;
  • копирует лог DHCP за вчерашний день в заданную папку в файл с именем формата dhcp-20110615.log
  • по ходу копирования вырезает все лишнее из логов (описание кодов сообщений и заголовка).
  1. ##############################################################################  
  2. #  
  3. #  
  4. #   Граббер логов службы Windows DHCP  
  5. #   =================================   
  6. #  
  7. #  
  8. # Производит копирование логов Windows DHCP за вчерашний день в папку с   
  9. # бэкапами. При копировании производится удаление из логов ненужной   
  10. # информации: описания кодов событий, заголовка и т.п.  
  11. #  
  12. # Для успешной работы по сбору логов DHCP необходимо запускать данный скрипт  
  13. # ежедневно.  
  14. #  
  15. # Формат именования выходного файла: dhcp-20110615.log, где:  
  16. # - 20110615 - указатель на дату исходного лога 15.06.2011.  
  17. #  
  18. #  
  19. ##############################################################################  
  20. #  
  21. #  
  22. # ПАРАМЕТРЫ ЗАПУСКА СКРИПТА  
  23. # ----------------------------  
  24. param([string]$outDir="", [switch]$force=$false, [switch]$help)  
  25.   
  26. function GetHelp {  
  27.     echo " 
  28. ОПИСАНИЕ  
  29.     Копирование логов Windows DHCP за вчерашний день в папку с бэкапами. 
  30.     При копировании производится удаление из логов ненужной информации:   
  31.     описания кодов событий, заголовка и т.п. 
  32.  
  33. СИНТАКСИС 
  34.     .\DhcpLogGrabber.ps1 -outdir <string> 
  35.                          [-force]  
  36.                          [-help] 
  37.  
  38. ПАРАМЕТРЫ 
  39.     -outdir 
  40.         Папка для помещения логов. 
  41.  
  42.     -force 
  43.         Если параметр указан, файл с логом будет скопирован в папку 
  44.         бэкапами, даже если там уже существует файл с таким именем. 
  45.  
  46.     -help 
  47.         Вывод справки (этой). Дополнительную информацию ищите в теле скрипта."  
  48. }  
  49.   
  50. if ($help) { GetHelp ; exit }  
  51.   
  52. #  
  53. ##############################################################################  
  54. #  
  55. #  
  56. # КОНФИГУРИРОВАНИЕ  
  57. # -------------------   
  58.   
  59. # Папка с логами службы Windows DHCP.  
  60. $logsDir = "c:\windows\system32\dhcp"  
  61.   
  62. #  
  63. ##############################################################################  
  64.   
  65.   
  66. if (-not $outDir)   
  67.     { echo "Не указана папка для помещения логов." ; GetHelp ; exit 1 }  
  68.   
  69. # Проверка наличия папки с логами.  
  70. if (-not (Test-Path $logsDir))   
  71.     { echo "Папки ""$logsDir"" не существует" ; exit 1 }  
  72.   
  73.   
  74. # DHCP хранит логи в файлах, именуемых в формате "DhcpSrvLog-Sat.log", где  
  75. # Sat - наименование дня. Для преобразования номера дня в его наименование  
  76. # используется данная матрица. Матрица составлена с учетом того, что при   
  77. # форматировании параметром %u объектов типа DateTime, воскресенье является  
  78. # нулевым днем, а суббота - 6-м.  
  79. $dayNames = @('Sun''Mon''Tue''Wed''Thu''Fri''Sat')  
  80.   
  81. # Вчерашняя дата и вчерашний номер дня.  
  82. $yesterday = (Get-Date).AddDays(-1)  
  83. $yesterdayNo = [int]($yesterday | Get-Date -uformat "%u")  
  84. $yesterdayT = $yesterday | Get-Date -uformat "%d.%m.%Y"  
  85.   
  86. # Получение необходимого пути к файлу с логом.  
  87. $logFilePath = "$logsDir\DhcpSrvLog-$($dayNames[$yesterdayNo]).log"  
  88.   
  89. # Если файла с логом нет, скрипт завершает работу.  
  90. if (-not (Test-Path $logFilePath))   
  91.     { echo "Лог за $yesterdayT отсутствует" ; exit }  
  92.   
  93. # Путь к выходному файлу.  
  94. $outLogPath = "$outDir\dhcp-$($yesterday | Get-Date -uformat "%Y%m%d").log"  
  95. if (-not (Test-Path $outDir))   
  96.     { New-Item $outDir -type directory | Out-Null }  
  97. if (-not (Test-Path $outDir))   
  98.     { echo "Невозможно создать папку ""$outDir""" ; exit 1 }  
  99.   
  100. # Если не указан параметр -force и выходной файл существует, работа  
  101. # скрипта завершается.  
  102. if ((Test-Path $outLogPath) -and (-not $force))   
  103.     { echo "Лог за $yesterdayT уже присутствует в папке назначения. Для автоматической замены, запустите скрипт с параметром -force." ; exit }  
  104.   
  105. # Из лога считываются все строки, являющиеся непосредственно записями событий,   
  106. # а не описаниями, и заносятся в выходной файл. Учитывая небольшой объем логов  
  107. # DHCP сервера, подход с фильтром строк приемлем.  
  108. Get-Content $logFilePath   
  109.   | ? { $_ -match "^(\d{2})," }   
  110.   | Out-File $outLogPath -encoding Unicode  
  111.   
  112. echo "Лог за $yesterdayT скопирован в $outLogPath"