特にWindowsにはこのための多くの非自明なツールがあるため、ログを使用した便利な作業について説明するときが来ました。 たとえば、Log Parserは、単に置き換えられないこともあります。
この記事では、 SplunkやELK (Elasticsearch + Logstash + Kibana)などの深刻な問題については説明しません。 私たちはシンプルで無料に焦点を当てています。
ログとコマンドライン
PowerShellの前は、 findやfindstrなどのcmdユーティリティを使用できました。 単純な自動化に非常に適しています。 たとえば、1C 7.7交換でエラーをキャッチする必要がある場合、交換スクリプトで単純なコマンドを使用しました。
findstr "Fail" *.log >> fail.txt
fail.txtファイル内のすべての交換エラーを受信できました。 ただし、以前のエラーに関する情報を取得するなど、さらに何かが必要な場合は、forループを使用して巨大なスクリプトを作成するか、サードパーティのユーティリティを使用する必要がありました。 幸い、PowerShellの登場により、これらの問題は過去のものとなりました。
テキストログを操作するための主要なツールは、テキストファイルの内容を表示するために使用されるGet-Contentコマンドレットです。 たとえば、コンソールにWSUSサービスログを表示するには、次のコマンドを使用できます。
Get-Content -Path 'C:\Program Files\Update Services\LogFiles\SoftwareDistribution.log' | Out-Host -Paging
ログの最後の行を表示するために、Tailパラメーターがあります。これは、Waitパラメーターと共に、ログをオンラインで見ることができます。 コマンドを使用してシステムがどのように更新されるかを見てみましょう。
>Get-Content -Path "C:\Windows\WindowsUpdate.log" -Tail 5 -Wait
Windowsアップデートの進行状況を監視しています。
ログで特定のイベントをキャッチする必要がある場合は、 Select-Stringコマンドレットが役立ちます。これにより、検索マスクに一致する文字列のみを表示できます。 最新のWindowsファイアウォールロックをご覧ください。
Select-String -Path "C:\Windows\System32\LogFiles\Firewall\pfirewall.log" -Pattern 'Drop' | Select-Object -Last 20 | Format-Table Line
私たちは誰が祖父にcraいかけようとしているのかを見ています。
必要に応じて、目的の前後のログ行を調べて、Contextパラメーターを使用できます。 たとえば、エラーの3行後と3行前を表示するには、次のコマンドを使用できます。
Select-String 'C:\Windows\Cluster\Reports\Cluster.log' -Pattern ' err ' ‑Context 3
両方の便利なコマンドレットを組み合わせることができます。 たとえば、netlogon.logの45〜75行目を表示するには、次のコマンドが役立ちます。
Get-Content 'C:\Windows\debug\netlogon.log' | Select-Object -First 30 -Skip 45
システムログは.evtx形式であり、それらを操作するための個別のコマンドレットがあります。 クラシックマガジン(「アプリケーション」、「システム」など)を操作するには、 Get-Eventlogが使用されます。 このコマンドレットは便利ですが、他のアプリケーションおよびサービスログを操作することはできません。 古典的な雑誌を含むあらゆる雑誌を扱うには、より汎用的なオプションであるGet-WinEventがあります。 さらに詳しく見ていきましょう。
使用可能なシステムログのリストを取得するには、次のコマンドを実行できます。
Get-WinEvent -ListLog *
利用可能な雑誌とそれらに関する情報を表示します。
特定の雑誌を表示するには、名前を追加するだけです。 たとえば、次のコマンドを使用して、システムログから最後の20エントリを取得します。
Get-WinEvent -LogName 'System' -MaxEvents 20
システムログの最近のエントリ。
特定のイベントを取得するには、ハッシュテーブルを使用するのが最も便利です。 PowerShellでのハッシュテーブルの操作の詳細については、Technet about_Hash_Tablesを参照してください。
たとえば、イベントコード1および6013でシステムログからすべてのイベントを取得します。
Get-WinEvent -FilterHashTable @{LogName='System';ID='1','6013'}
特定のタイプのイベント(警告またはエラー)を受信する必要がある場合、重要度(レベル)によるフィルターを使用する必要があります。 次の値が可能です。
- 0-常に書き込み。
- 1-クリティカル。
- 2-エラー。
- 3-警告。
- 4-情報;
- 5-詳細。
1つのコマンドで複数の重要度の値を持つハッシュテーブルを収集するのはそれほど簡単ではありません。 システムログからエラーと警告を取得する場合は、 Where-Objectを使用して追加のフィルター処理を使用できます。
Get-WinEvent -FilterHashtable @{LogName='system'} | Where-Object -FilterScript {($_.Level -eq 2) -or ($_.Level -eq 3)}
システムログのエラーと警告。
同様に、イベントテキストおよび時間で直接フィルタリングすることにより、テーブルを組み立てることができます。
PowerShellのドキュメントで、syslogを操作するための両方のコマンドレットの動作の詳細をご覧ください。
PowerShellは便利で柔軟なメカニズムですが、構文の知識が必要であり、複雑な条件や大量のファイルを処理するには完全なスクリプトを書く必要があります。 しかし、素晴らしいLog Parserを使用して、SQLクエリだけで対処するオプションがあります。
SQLクエリを介したログの操作
Utility Log Parserは、「ゼロ」の初めに生まれ、それ以来、公式のグラフィカルシェルを取得することに成功しました。 それにもかかわらず、その関連性は失われず、ログを分析するための最もお気に入りのツールの1つであることに変わりはありません。 このユーティリティは、Microsoftダウンロードセンターからダウンロードできます。このユーティリティのグラフィカルインターフェイスは Technet ギャラリーにあります。 グラフィカルインターフェイスについては、後ほど、ユーティリティ自体から始めましょう。
Log Parserの可能性については、「 LogParser-珍しいことをよく知っている」という資料で既に説明しているので、具体的な例から始めます。
まず、テキストファイルを扱います。たとえば、ファイアウォールでブロックされたRDP接続のリストを取得します。 この情報を取得するには、次のSQLクエリで問題ありません。
SELECT extract_token(text, 0, ' ') as date, extract_token(text, 1, ' ') as time, extract_token(text, 2, ' ') as action, extract_token(text, 4, ' ') as src-ip, extract_token(text, 7, ' ') as port FROM 'C:\Windows\System32\LogFiles\Firewall\pfirewall.log' WHERE action='DROP' AND port='3389' ORDER BY date,time DESC
結果を見てみましょう:
Windowsファイアウォールのログを確認します。
もちろん、結果のテーブルでは、並べ替え、グループ化など、何でもできます。 SQLの想像力と知識で十分です。
Log Parserは、他の多くのソースでも優れた機能を発揮します。 たとえば、ユーザーがRDP経由でサーバーに接続した場所を見てみましょう。
TerminalServices-LocalSessionManager \ Operationalログを使用します。
すべてのログでLog Parserがそのように動作するわけではありません-一部のログにはアクセスできません。 この場合、%SystemRoot%\ System32 \ Winevt \ Logs \ Microsoft-Windows-TerminalServices-LocalSessionManager%4Operational.evtxから%temp%\ test.evtxにログをコピーするだけです。
このリクエストでデータを受け取ります:
SELECT timegenerated as Date, extract_token(strings, 0, '|') as user, extract_token(strings, 2, '|') as sourceip FROM '%temp%\test.evtx' WHERE EventID = 21 ORDER BY Date DESC
ターミナルサーバーに誰がいつ接続したかを確認します。
IISやExchangeなど、多数のログファイルを処理するためにLog Parserを使用すると特に便利です。 SQLの機能のおかげで、サーバーに接続するIOSおよびAndroidのバージョンに関する統計まで、さまざまな分析情報を取得できます。
例として、このクエリで日ごとの文字数の統計を見てみましょう。
SELECT TO_LOCALTIME(TO_TIMESTAMP(EXTRACT_PREFIX(TO_STRING([#Fields: date-time]),0,'T'), 'yyyy-MM-dd')) AS Date, COUNT(*) AS [Daily Email Traffic] FROM 'C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\Logs\MessageTracking\*.LOG' WHERE (event-id='RECEIVE') GROUP BY Date ORDER BY Date ASC
システムにOffice Webコンポーネントがインストールされており、Microsoftダウンロード センター からダウンロードできる場合は、出力に美しい図を表示できます。
要求を満たし、結果の画像を開きます...
結果に感心します。
Log Parserのインストール後、COMコンポーネントMSUtil.LogQueryがシステムに登録されることに注意してください。 LogParser.exeの呼び出しだけでなく、他の使い慣れた言語を使用して、ユーティリティエンジンに要求を行うことができます。 例として、ドライブCの20個の最も容量の大きいファイルを出力する簡単なPowerShellスクリプトを示します。
$LogQuery = New-Object -ComObject "MSUtil.LogQuery" $InputFormat = New-Object -ComObject "MSUtil.LogQuery.FileSystemInputFormat" $InputFormat.Recurse = -1 $OutputFormat = New-Object -ComObject "MSUtil.LogQuery.CSVOutputFormat" $SQLQuery = "SELECT Top 20 Path, Size INTO '%temp%\output.csv' FROM 'C:\*.*' ORDER BY Size DESC" $LogQuery.ExecuteBatch($SQLQuery, $InputFormat, $OutputFormat) $CSV = Import-Csv $env:TEMP'\output.csv' $CSV | fl Remove-Item $env:TEMP'\output.csv' $LogQuery=$null $InputFormat=$null $OutputFormat=$null
SystemManager.ruポータルの資料Log Parser COM API Overviewでコンポーネントの操作に関するドキュメントを理解できます。
この機能により、Log Parserのグラフィカルシェルである作業を容易にするためのいくつかのユーティリティを使用できます。 有料のものは考慮しませんが、無料のLog Parser Studioを紹介します。
インターフェイスログパーサースタジオ。
ここでの主な機能はライブラリです。これにより、フォルダを分散させることなく、すべてのリクエストを1か所に保持できます。 また、クエリを整理するのに役立つ既製の例がたくさんあります。
2番目の機能は、リクエストをPowerShellスクリプトにエクスポートする機能です。
例として、最も多くの手紙を送信するメールボックスの選択がどのように機能するかを見てみましょう。
最もアクティブなメールボックスの選択。
この場合、より多くの種類の雑誌を選択できます。 たとえば、「純粋な」ログパーサーでは、入力データのタイプに制限があり、Exchangeには別のタイプはありません。フィールドの説明を入力し、ヘッダーを自分でスキップする必要があります。 Log Parser Studioでは、必要な形式をすぐに使用できます。
Log Parserに加えて、記事「 PowerShellではなくExcel 」で説明されているMS Excel機能を使用してログを操作できます。 ただし、Log Parserを使用してプライマリマテリアルを準備し、ExcelのPower Queryで処理することにより、最大限の利便性を実現できます。
ログをシャベルで動かすためのツールを使用したことがありますか? コメントで共有します。