質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.59%

イベントビューアー>Windowsログで取れるログをサイズでなくて日付で区切る事は出来ないのでしょうか?

受付中

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 5,942

score 151

お世話になっております。

WinSev2012R2を管理しております。
件名の通りなのですが
イベントビューアー>Windowsログで取れるログを
サイズでなくて日付で区切る事は出来ないのでしょうか?

グーグルさんなどで調査したのですが
そのようなものは見つけられなかったのですが
皆様ログ解析をする場合は有料のソフトウェアを購入されているのでしょうか?

なんとか日付毎にログを取得する方法は無いのでしょうか?

お忙しい所大変申し訳無いのですが上記お問い合わせいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+2

サイズ区切りといわれているのは、イベントビューアーでの各ログの最大サイズのことを指していて、デフォルトの上書きではなく、アーカイブ(別ファイルに)することを想定しているのだと思いますが、UNIX系のログローテーションのように、世代保持指定ができるわけではないので、この機能だけに頼ろうとしているならば、その後の運用管理が面倒になるのではないでしょうか。

一応、下記で1日単位でアーカイブされるようにはなるのではないかと思いますが、日付毎ではなくログの開始から1日毎にアーカイブされるようになるのではないでしょうか。
ただし、実際にやったことも試すつもりもありませんので、実行した結果どうなるかはわかりません。

Limit-EventLog -LogName "対象のログ名" -RetentionDays 1

また、roninさんの回答内で触れられてはいるものの、PowerShellでの日付指定でログを取得するサンプルも貼っておきます。先日つけた回答のように-ListLogでまわしてlognameに与えれば全ログ対象に出来るでしょうし、Get-Dateと組み合わせれば日付毎のログを出力できるでしょう。

Get-WinEvent -FilterHashtable @{logname="system"; starttime="2019/3/7"; endtime="2019/3/8"; level=1,2,3}


全量のログをWhere-Objectに渡すことで日付毎のフィルターとしていますが、(例外もある気はしますが)早い段階でデータを削った方が軽くていいですよね。
日付指定ならGet-EventLogでも-After-Before引数で可能ですが、そもそもこのコマンドレットを使うのは今は推奨されないものだと思っています。

古い Windows XP / Windows Server 2003 以前のイベントログ形式で動作するため、処理時間のパフォーマンスに問題を及ぼす場合があります。また、Windows Vista / Windows Server 2008 以降の新イベントログ形式 (EventLog 2.0) のログは取得できません。

ソース 'DCOM' のイベント ID '10016' の説明が見つかりません。
(以下略)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/12 11:15 編集

    PS C:\powershell> Limit-EventLog -LogName "system" -RetentionDays 1
    Limit-EventLog : 保持日数は、オーバーフローの動作が "OverwriteOlder" の場合のみ有効です。変更してから再試行してください

    発生場所 C:\powershell\eventget4.ps1:1 文字:1
    + Limit-EventLog -LogName "system" -RetentionDays 1
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation: (:) [Limit-EventLog]、InvalidOperationException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.LimitEventLogCommand

    となり
    もう一つご教示頂いた方は
    PS C:\powershell> Get-WinEvent -FilterHashtable @{logname="system"; starttime="2019/3/7";endtime="2019/3/11"; level=1,2,3}
    Get-WinEvent : 指定した選択条件に一致するイベントが見つかりませんでした。
    発生場所 行:1 文字:1
    + Get-WinEvent -FilterHashtable @{logname="system"; starttime="2019/3/7";endtime=" ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : ObjectNotFound: (:) [Get-WinEvent], Exception
    + FullyQualifiedErrorId : NoMatchingEventsFound,Microsoft.PowerShell.Commands.GetWinEventCommand
    となります。
    level=1,2,3を削除すればそれとなく表示されるのでもう少し調べてみます。

    本当に助かりました。ありがとうございます。

    キャンセル

  • 2019/03/12 13:43

    Limit-EventLog実行時のエラーは、表示の通りで、指定サイズに到達時の動作が上書きになっていないと日数指定できないという事です。詳細は下記辺りでご確認ください。
    https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/limit-eventlog?view=powershell-5.1

    levelはログレベルを絞るサンプルとして書いたものなので、全量を取りたいならば必要はありません。ここで指摘する数値の意味は、先日の回答でも触れた(手抜きで)調べてくださいとした項目です。

    なお、本当にログがない場合はレベル指定を外しても同じエラーになるので、特に全ログファイルを対象にする想定があるならばご注意ください。

    キャンセル

  • 2019/03/12 13:46

    あ…… evtx 形式で保存したいので 調査中です……
    なんかこのやり方だとevtxで保存出来ない気がしてきてます……

    キャンセル

+1

カスタムビューとかではダメですか?
検討違いでしたらすみません。

[カスタムビュー作成@IT]
(https://www.atmarkit.co.jp/fwin2k/win2ktips/1191custevt/custevt.html)

2019/03/11 18:46 追記
lazybones2000さんに教えて頂いたコマンドで手動で任意(一日単位でも可能)の日付のログを取得する感じのスクリプトを書いてみました。
なお、サーバへアクセスできるクライアント端末からの使用をイメージしています。

使い方の説明
1.LogStart,LogEndに開始と終了日付を設定します。
2.WorkDirに作業用ディレクトリパスを入力(末尾に\を入れてください)
3.WorkDirにServerList.txtとLogList.txtを入れてください。
4.3の両ファイルに取得したいサーバ名とログ名を入れてください。
※途中で空白行があれば、それ以降は処理しません。
5.ログの出力形式を選択してください。(1は一つのファイルにまとめられた状態。2はサーバ名で分けられた状態、3はログ名で分けられた状態
イメージ
1 = WindowsServerLog_20190301
2 = ServerName1_20190301
3 = ServerName1_Application_20190301

$ErrorActionPreference = "silentlycontinue"
$LogStart       = "2019/3/1" #開始 yyyy/MM/dd
$LogEnd         = "2019/3/2" #終了 yyyy/MM/dd
$WorkDir        = "C:\Users\hostname\Desktop\log\"
$ServerListFile = $WorkDir+"ServerList.txt"
$LogListFile    = $WorkDir+"LogList.txt"
$LogOutStaus    = "3" #ログの出力形式 "1:一つのファイル","2:サーバ単位で分割","3:サーバとログ名で分割"
$OutFileName    = ""
$ServerList     = (Get-Content -Encoding UTF8 $ServerListFile)
$LogList        = (Get-Content -Encoding UTF8 $LogListFile)


# ステータスが"1"であれば一つのファイルに纏めて出す
if($LogOutStaus.Equals("1")){ $OutFileName = "WindowsServerLog_"+(get-date $LogStart -format yyyyMMdd)+".csv" }

#サーバ数分繰り返す
foreach($server in $ServerList){

    # 途中で改行があれば以降は参照しない
    if($server.Equals("")){
        break;
    }

    # ステータスが"2"であればサーバ単位で出力する
    if($LogOutStaus.Equals("2")){ $OutFileName = $server+"_"+(get-date $LogStart -format yyyyMMdd)+".csv" }

    #ログ分繰り返す
    foreach($logname in $LogList){

        #途中で改行があれば以降は参照しない
        if($logname.Equals("")){
            break;
        }

        # ステータスが"3"であればサーバ+ログ単位で出力する
        if($LogOutStaus.Equals("3")){ $OutFileName = $server+"_"+$logname+"_"+(get-date $LogStart -format yyyyMMdd)+".csv"}

        Get-WinEvent -ComputerName $server -FilterHashtable `
            @{logname=$logname; starttime=$LogStart; endtime=$LogEnd;level=1,2,3} | ` #levelの末尾に4を追加するとinfoも出る。
            Select-Object -Property TimeCreated,LogName,LevelDisplayName,ProviderName,id,MachineName,Message | ` #itemの選定をしないならワイルドカードを設定
            Export-Csv -UseCulture -Path $WorkDir$OutFileName -Append -Encoding UTF8 -NoTypeInformation

    }
}

ちなみに、私の勉強方法ですが、基本的にググって出てきたものを試したり、get-commandで出てきたコマンド名を試したり…と言った感じですので、動けばいいか、程度の事しかできません。

以上です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/08 18:04

    ありがとうございます。

    Get-EventLog -ComputerName ホスト名 -LogName 'Windows PowerShell' | where {$_.TimeWritten -gt (get-date 2019-03-08)} | format-table -AutoSize -Wrap

    を参考にもうちょっと考えてみますっ

    キャンセル

  • 2019/03/08 18:11

    そのあたりはget-dateのフォーマット指定でよいですし、日付毎にログを取得する、という事の回答という事で。。

    キャンセル

  • 2019/03/11 17:56

    ronin様
    本当に度々ありがとうございます。

    Get-EventLog -ComputerName ホスト名 -LogName 'Windows PowerShell'
    ホスト名の WindowsPowerShell のイベントをゲットする。

    | where {$_.TimeWritten -gt (get-date 2019-03-08)}
    その中で3月8日のデータ

    | format-table -AutoSize -Wrap
    出力フォーマットは無駄な空白を省略し横はオートサイズ

    と概ね理解出来るのですがこれを
    本日(例えば3月11日)のみのログを保存しておきたいと思っているのですが
                             ___
    Get-EventLog -ComputerName ホスト名 -LogName '*' | where {$_.TimeWritten -gt (get-date いtoday)} | format-table -AutoSize -Wrap >$today.log
    ^^^
    としてタスクスケジューラで毎日23:59に実行したいと思っているのですが
    PowerShellの考え方としてこちらは大丈夫でしょうか?

    参考文献などご存知でしたらご教授頂けないでしょうか?
    ronin様はどのようにしてPowerShellを学ばれたのでしょうか?

    考えても不明でしたのでお忙しい所大変申し訳無いのですが上記お問い合わせいたします。

    キャンセル

+1

以下のようなbatを作成し、23:59:59にタスクスケジューラで起動するというのはいかがでしょうか?

set today=%DATE:/=%
wevtutil epl System system_%today%.evtx && wevtutil cl System
  1. wevtutil epl System system_%today%.evtxで実行時点までのイベントログを、実行日のファイル名でエクスポート
  2. 正常終了後にwevtutil cl Systemで該当イベントログを削除

となります。
問題点は、初回はこれまでのイベントログすべてがエクスポート対象となってしまうこと、エクスポート後に原本を削除してしまうので十分にテストが必要なこと、かなと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/13 12:16

    Tell様
    コメントありがとうございます。

    エクスポート後に原本を削除の
    && wevtutil cl System を動作させるのがちょっと怖いのですが
    こちらで日付で取れているのでこのような方法もあるのですねっ

    というかevtx内で指定の日付の情報取れないのだろうか……(+_+)

    コメントありがとうございました。m(_ _)m

    キャンセル

0

evtx形式で保存したいのですが

PS C:\Windows\system32> Get-WinEvent -LogName system | Format-List >test.evtx


で保存したevtxだとイベントビューアーに持っていっても読めない……
ので調査中……

考え方変なのかな……

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/12 16:52

    http://quatrefromage.hatenablog.jp/entry/2016/08/06/164436

    -Pathでevtxファイルを指定すれば、ファイルから読み取ることも可。

    と書いてあるから調査中……

    キャンセル

  • 2019/03/12 17:22

    参考URLに記載されていることは、powershellからGet-WinEventの場合はevtxファイル形式でエクスポートはできない。
    -pathでevtxファイルを指定すればevtxファイルからイベントログを読み込んで別ファイルにエクスポートできる。です。
    コマンドプロンプトでwevtutil使えって書いてありますね。

    キャンセル

  • 2019/03/12 17:25

    ありがとうございます。

    wevtutil export-log [イベントログの種類] [エクスポート先ファイルパス]

    でやって見る方法を考えてみますっ
    まぁPowerShellでやろうとした理由はコマンドプロンプトより高度な事が出来そうだっただけで
    そんなにこだわりは無いので……

    キャンセル

  • 2019/03/12 17:32

    こんなに苦労しているのもMSがログのサイズ毎でしかないのが悪いっ

    どうしてマイクロソフトは日付毎ログを残すという運用方針をしていないのだろうか……(+_+)

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る