在Windows事件日志中超过4 GB的含义是什么?

我发现这个微软的KB涵盖了Windows 2008 / Vista操作系统推荐的事件日志设置最大值 ,推荐最大值为4GB,并且还看到了一些模糊的参考,至less不推荐大于4GB的事件日志2008 R2,但我想知道如果一个事件日志超过这个大小实际上会发生什么?

我已经在testing服务器(2012 R2)上超过了这一点,并没有注意到像高内存使用情况等任何东西。我们不关心在2008 R2之前的操作系统,但想要一个大日志,因为我们正在从许多机器通过收集事件Windows事件转发,并希望在一个地方所有的事件。

除了可怕的performance和荒谬的等待时间,当你不得不加载一个4 GB的日志和地狱,这将是如果你永远不得不search这样一个可怕的事情,没有太多。 我认为在我的环境中看到的最大的一个是10 GB,虽然我放弃了等待它加载,但似乎并没有损害任何东西。

Server 2008的4GB警告是由于在4 GB时经常遇到的32位限制所致。 在一个64位的系统上,你应该可以让它增长到16TB(或64,具体取决于),尽pipe我不知道任何人在任何地方接近testing这个限制。

当然,如果你还没有,你会发现非常大的日志文件是不切实际的使用 – 上次我试图加载一个简单的100 GB(文本)日志文件,它甚至不能打开没有崩溃的应用程序打开它,我怀疑你会在100 GB之前,这个问题。

更好的方法是将文件大小限制在合理范围内,并使用脚本不时清除。 我在我的环境中使用下面的内容,并在安全日志中加上1 GB的大小限制。 我们的某些服务器每天都会产生超过3 GB的安全事件,而且我们不希望浪费所有的空间来处理大量的日志文件,所以我将在结束之前退出,以便我的脚本将日志内容复制到另一个文件夹,然后清除要重新写入的事件日志。 而且由于我将它们复制到的文件夹已经备份,所以我们可以随时回到我们需要的可怕事件中的日志。

#Adapted from: http://blogs.technet.com/b/heyscriptingguy/archive/2009/04/08/how-can-i-check-the-size-of-my-event-log-and-then-backup-and-archive-it-if-it-is-more-than-half-full.aspx Param($logName = "security",$backupFolder = "C:\backupLogs") Function Get-EventLog([string]$logName) { $log = Get-WmiObject -Class Win32_NTEventLogFile -filter "LogFileName = '$logName'" If($log.FileSize / $log.MaxFileSize -ge .9) { "Log is at least 90% full. Backing up now." Backup-EventLog($log) } #end if Else { "Not backed up: $logName is only " + ($log.FileSize / $log.MaxFileSize).tostring("N2") + " percent full" } #end else } #end Get-EventLog Function Backup-EventLog($log) { $folder = Join-Path -Path $BackUpFolder -ChildPath (Get-Date).ToString("MMddyy_hhmm") If(-not(Test-Path $folder)) { New-Item -path $folder -itemtype Directory -force | out-Null } $rtn = $log.BackupEventLog("$folder\$logName.evt").ReturnValue If($rtn -eq 0) { $log.ClearEventLog() | out-null } #end if ELSE { "$logName could not be cleared. Backup ended with $($rtn)" } } #end Backup-EventLog # *** ENTRY POINT *** Get-EventLog -logname $logname 

另一个答案涵盖了这个背后的推理 – 对于现代系统来说,主要在事件查看器GUI中保持加载时间有点可忍受。 将当前日志复制到备份位置,然后清除它也是很好的。

为了parsing最终生成的大型日志文件,有两个很好的select:

1)parsing日志的速度比当前的graphics用户界面可以pipe理更快2)将日志分成单独的文件。

我确信有一些易于使用的实用程序2),所以我会专注于1)。

首先,Powershell具有称为“get-winevent”function的出色的cmdlet。 我见过的最快的性能包括使用散列表。 下面是一个例子,可以从最后一天获取有关特定用户的安全日志中的所有事件:

 $timeframe = (get-date) - (new-timespan -day 1) $userevt = Get-WinEvent -ComputerName <specify> -FilterHashTable @{LogName='Security'; Data='<enter username here>'; StartTime=$timeframe} 

$ userevt现在是事件的集合。 根据匹配的数量,您可以通过pipe道格式列表轻松读取less量事件。 对于一个中等数字,执行相同的操作,但将输出redirect到一个文件:

 $userevt | format-list > <outputfile>.txt 

对于很多人来说,开始过滤(比如说,你想让我们上面获得的用户的locking事件的来电电脑):

 $userevt | %{if ($_.message -match "Caller Computer .*") {$matches[0]}} 

这将显示每个locking事件的单行结果。 上述过程通常需要1-4分钟才能完成2008 R2的4GB日志。

其次,特别是对于任何可能需要pipe理的2003机器,您可以在事件查看器的左窗格中右键单击特定的日志文件,然后select“将日志文件另存为”。

如果您在本地计算机上运行事件查看器,则可以保存可由get-wineventparsing的.evt文件。

或者,您可以保存一个文本或CSV文件(我发现CSV更容易),可以通过适当的命令行工具(如grep或findstr)或某些程序(如记事本++)来parsing。