Windows PowerShellでログを取得する方法|標準出力の保存からイベントログ取得まで解説

Windows

「PowerShellで処理結果をログとして残したい」
「Windowsのイベントログを取得したい」

そんな場面はシステム管理やトラブル調査をしているとよくあります。

この記事では、PowerShellを使った以下の方法をわかりやすく解説します:

  • 処理結果のログファイル出力
  • Windowsイベントログの取得
  • エラーログの分離と保存
  • 自動化に役立つログ管理のコツ

日々の運用管理にぜひ役立ててください。

スポンサーリンク

PowerShellスクリプトの処理結果をログとして保存する

基本:標準出力をファイルに書き込む

PowerShellでは >>> を使って簡単にログファイルに出力できます。

例:プロセス一覧をログに保存

Get-Process > C:\logs\process.log

これで現在動いているプロセス一覧が process.log に書き込まれます。

既存ファイルに追記する方法

例:既存ログに追加

Get-Process >> C:\logs\process.log

>> を使うと既存のログに追加できます。毎日のログを1つのファイルにまとめたいときに便利です。

ログファイルの使い分け

記号動作使用場面
>上書き毎回新しいログを作りたいとき
>>追記継続的にログを蓄積したいとき

Write-Output でログ用のメッセージを作る

日付と一緒にログを記録

例:日付付きログの作成

$now = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
Write-Output "$now サービスチェック開始" >> C:\logs\service.log

出力例

2025-07-06 10:30:45 サービスチェック開始

より詳細なログメッセージの作成

例:処理の開始と終了をログに記録

# ログ開始
$startTime = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
Write-Output "$startTime [INFO] バックアップ処理を開始します" >> C:\logs\backup.log

# 実際の処理
Copy-Item -Path "C:\data\*" -Destination "C:\backup\" -Recurse

# ログ終了
$endTime = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
Write-Output "$endTime [INFO] バックアップ処理が完了しました" >> C:\logs\backup.log

ログレベルの使い分け

ログには以下のようなレベルを付けると、後で確認しやすくなります:

  • [INFO] – 通常の処理情報
  • [WARNING] – 警告メッセージ
  • [ERROR] – エラー情報

Windowsイベントログを取得する

Get-EventLog を使う方法(従来の方法)

Windowsのイベントログ(例:システムログ、アプリケーションログ)をPowerShellから取得できます。

例:システムログの最新10件を取得

Get-EventLog -LogName System -Newest 10

例:エラーログだけを抽出

Get-EventLog -LogName System -EntryType Error -Newest 50

Get-WinEvent(推奨方法)

Windows Vista以降では Get-WinEvent が推奨されています。より多くのログにアクセスできます。

例:アプリケーションログを取得

Get-WinEvent -LogName Application -MaxEvents 10

例:特定の時間範囲のログを取得

$startDate = (Get-Date).AddDays(-7)  # 7日前から
$endDate = Get-Date                   # 現在まで

Get-WinEvent -LogName System | Where-Object {
    $_.TimeCreated -ge $startDate -and $_.TimeCreated -le $endDate
}

CSVファイルでログを保存

例:エクセルで開ける形式で保存

Get-WinEvent -LogName Application -MaxEvents 100 |
Select-Object TimeCreated, Id, LevelDisplayName, Message |
Export-Csv C:\logs\application_log.csv -NoTypeInformation -Encoding UTF8

これでExcelで開いて分析できる形でログを保存できます。

特定の条件でログを抽出する

イベントIDで絞り込み

例:特定のイベントIDのみ取得

# イベントID 1074(システムシャットダウン)のログを取得
Get-WinEvent -LogName System | Where-Object {$_.Id -eq 1074}

複数の条件を組み合わせ

例:エラーレベルかつ特定期間のログ

$yesterday = (Get-Date).AddDays(-1)

Get-WinEvent -LogName System | Where-Object {
    $_.LevelDisplayName -eq "エラー" -and
    $_.TimeCreated -ge $yesterday
} | Export-Csv C:\logs\recent_errors.csv -NoTypeInformation

標準エラーも含めたログの取得

標準出力と標準エラーをまとめてログに

例:すべての出力を1つのファイルに保存

.\myscript.ps1 *> C:\logs\all.log

または

.\myscript.ps1 > C:\logs\all.log 2>&1

エラーだけを別ファイルに保存

例:エラーログの分離

# 通常の出力はoutput.logに、エラーはerror.logに
.\myscript.ps1 > C:\logs\output.log 2> C:\logs\error.log

実用的なログ取得スクリプト例

システム状態の定期監視ログ

例:システム監視スクリプト

# ログファイルのパス
$logPath = "C:\logs\system_monitor.log"
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"

# CPU使用率上位5プロセス
Write-Output "$timestamp [INFO] CPU使用率上位プロセス" >> $logPath
Get-Process | Sort-Object CPU -Descending | Select-Object -First 5 |
Format-Table Name, CPU | Out-String | Add-Content $logPath

# メモリ使用量
$memory = Get-WmiObject -Class Win32_OperatingSystem
$freeMemoryGB = [math]::Round($memory.FreePhysicalMemory / 1MB, 2)
Write-Output "$timestamp [INFO] 空きメモリ: ${freeMemoryGB}GB" >> $logPath

# ディスク容量
Get-WmiObject -Class Win32_LogicalDisk | Where-Object {$_.DriveType -eq 3} |
ForEach-Object {
    $freeSpaceGB = [math]::Round($_.FreeSpace / 1GB, 2)
    Write-Output "$timestamp [INFO] ドライブ$($_.DeviceID) 空き容量: ${freeSpaceGB}GB" >> $logPath
}

定期的なイベントログ収集

例:毎日のエラーログ収集

# 日付を取得
$today = Get-Date -Format "yyyyMMdd"
$yesterday = (Get-Date).AddDays(-1)

# 各ログを取得してファイルに保存
$logs = @("System", "Application", "Security")

foreach ($logName in $logs) {
    $fileName = "C:\logs\${logName}_${today}.csv"
    
    Get-WinEvent -LogName $logName | Where-Object {
        $_.TimeCreated -ge $yesterday -and 
        $_.LevelDisplayName -in @("エラー", "警告")
    } | Select-Object TimeCreated, Id, LevelDisplayName, Message |
    Export-Csv $fileName -NoTypeInformation -Encoding UTF8
    
    Write-Host "${logName}ログを${fileName}に保存しました"
}

ログファイルの管理とメンテナンス

古いログファイルの自動削除

例:30日以上古いログファイルを削除

# 30日以上古いログファイルを削除
Get-ChildItem -Path "C:\logs\*.log" | Where-Object {
    $_.LastWriteTime -lt (Get-Date).AddDays(-30)
} | Remove-Item -Force

Write-Output "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') [INFO] 古いログファイルを削除しました" >> C:\logs\cleanup.log

ログファイルのサイズ制限

例:ログファイルが大きくなったときの処理

$logFile = "C:\logs\application.log"
$maxSizeMB = 10

if ((Get-Item $logFile).Length / 1MB -gt $maxSizeMB) {
    # 古いログをバックアップ
    $backupName = "C:\logs\application_backup_$(Get-Date -Format 'yyyyMMdd_HHmmss').log"
    Move-Item $logFile $backupName
    
    # 新しいログファイルを作成
    Write-Output "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') [INFO] 新しいログファイルを開始" > $logFile
}

トラブルシューティング

よくある問題と解決方法

問題1: ログファイルが作成されない

原因: フォルダが存在しない、または権限不足

解決方法:

# ログフォルダを作成
if (!(Test-Path "C:\logs")) {
    New-Item -ItemType Directory -Path "C:\logs"
}

# ユーザーフォルダに保存する場合
$logPath = "$env:USERPROFILE\Documents\logs"
if (!(Test-Path $logPath)) {
    New-Item -ItemType Directory -Path $logPath
}

問題2: 日本語が文字化けする

原因: 文字エンコーディングの問題

解決方法:

# UTF-8で保存
Get-WinEvent -LogName Application -MaxEvents 10 |
Export-Csv C:\logs\app.csv -NoTypeInformation -Encoding UTF8

# Out-Fileを使う場合
Get-Process | Out-File -FilePath C:\logs\process.log -Encoding UTF8

問題3: ログが見つからない

原因: ログ名の間違いやアクセス権限不足

解決方法:

# 利用可能なログ名を確認
Get-WinEvent -ListLog * | Select-Object LogName, RecordCount |
Where-Object {$_.RecordCount -gt 0} | Sort-Object LogName

まとめ

Windows PowerShellを使えば、以下のログ取得が簡単にできます:

  • >>> で処理結果を簡単にログ化
  • Get-EventLogGet-WinEvent でWindowsのイベントログを取得
  • Export-Csv でExcel管理もラクラク
  • 条件指定 で必要なログだけを抽出
  • 自動化スクリプト で定期的なログ収集

コメント

タイトルとURLをコピーしました