我发现此Microsoft KB涵盖了Windows 2008 / Vista以下操作系统的建议最大事件日志设置,建议最大为4GB,并且还看到一些模糊的参考,至少不建议大于4 GB的事件日志2008 R2,但我想知道如果事件日志超出此大小会发生什么?
我已经在测试服务器(2012 R2)上超过了此限制,并且没有注意到内存占用率高之类的问题。我们不在乎2008 R2之前的操作系统,但想要一个大日志,因为我们正在通过许多机器收集事件Windows事件转发,希望将所有事件放在一个地方。
我发现此Microsoft KB涵盖了Windows 2008 / Vista以下操作系统的建议最大事件日志设置,建议最大为4GB,并且还看到一些模糊的参考,至少不建议大于4 GB的事件日志2008 R2,但我想知道如果事件日志超出此大小会发生什么?
我已经在测试服务器(2012 R2)上超过了此限制,并且没有注意到内存占用率高之类的问题。我们不在乎2008 R2之前的操作系统,但想要一个大日志,因为我们正在通过许多机器收集事件Windows事件转发,希望将所有事件放在一个地方。
Answers:
除了必须加载4 GB日志的可怕性能和荒谬的等待时间外,如果您不得不搜索这么大的东西,那就麻烦了。我认为在我的环境中看到的最大容量为10 GB,尽管我放弃等待加载,但似乎没有任何损害。
Server 2008的4GB警告是由于在4 GB时经常遇到的32位限制。在64位系统上,您可以允许它增长到16 TB(或64,取决于),这应该没问题,尽管我不知道有人能接近这个极限。
当然,如果您还没有,那么您会发现使用非常大的日志文件是不切实际的-上次我尝试加载一个简单的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中的加载时间保持一定程度是可以忍受的。将当前日志复制到要备份的位置,然后清除它也很好。
为了解析无论如何最终都会生成的大型日志文件,有两个不错的选择:
1)解析日志的速度超过当前GUI可以管理的速度,或者2)将日志拆分为单独的文件。
我确定2)有一些易于使用的实用程序,因此我将重点介绍1)。
首先,Powershell为此功能提供了出色的cmdlet,称为“ get-winevent”。我见过的最快性能涉及使用哈希表。这是一个示例,它从最后一天开始获取安全日志中与特定用户有关的所有事件:
$timeframe = (get-date) - (new-timespan -day 1)
$userevt = Get-WinEvent -ComputerName <specify> -FilterHashTable @{LogName='Security'; Data='<enter username here>'; StartTime=$timeframe}
$ userevt现在是事件的集合。根据匹配的数量,您可以将其通过管道传递到格式列表,以轻松读取少量事件。对于中等号,请执行相同的操作,但将输出重定向到文件:
$userevt | format-list > <outputfile>.txt
对于较大的数量,请开始过滤(例如,您希望呼叫者计算机发生我们在上面获得的用户的锁定事件):
$userevt | %{if ($_.message -match "Caller Computer .*") {$matches[0]}}
这将显示每个锁定事件的单行结果。对于2008 R2上的4GB日志,上述过程通常需要1-4分钟。
其次,尤其是对于最终可能需要管理的任何2003机器,都可以在事件查看器的左窗格中右键单击特定的日志文件,然后选择“将日志文件另存为”。
如果在本地计算机上运行事件查看器,则可以保存.evt文件,该文件可以通过get-winevent进行解析。
另外,您可以保存一个文本或CSV文件(我觉得CSV更容易),可以通过适当的命令行实用程序(例如grep或findstr)或某些程序(如notepad ++)进行解析。
真实示例:发生这种情况的原因是,安全日志已增加到12GB,可以根据合规性要求保留6个月。
在第3个月之前,我们无法登录到服务器2008r2和2012r2服务器。登录将停留在“欢迎”屏幕上。我们尝试将服务器内存增加到20gb,以容纳正在打开的大文件,但服务器仍然很生气。我们最终决定遵循管理引擎的建议1GB,并对其进行调整以在满文件或覆盖文件时存档旧文件。
如果需要,我们可以使用此脚本来清理超过180天的旧文件,但是我们可以将文件保留在原位。
get-childitem -Path "C:\Windows\System32\winevt\Logs" |
where-object {$_.LastWriteTime -lt (get-date).AddDays(-180)} |
remove-item –whatif