我想知道让 IIS 直接记录到 SQL 服务器是否耗费资源,更好的解决方案可能是生成日志文件,然后每小时将这些文件导入到 SQL 服务器。
直接将每个请求记录到 SQL Server 的成本是否非常高?无论如何,对于每个请求,页面都会打开与数据库的连接。
答案1
就我个人而言,我从来没有这样做过;而是设置了一个脚本,使用 Logparser 将旧的 IIS 日志文件导入 SQL DB。
以下是我使用的 PowerShell 脚本
### Parameters ###
$iisLogLocation = "$env:systemdrive\inetpub\logs\logfiles"
$logParserLocation = "C:\Program Files\Log Parser 2.2"
### Main Script ###
$files = Get-ChildItem $iisLogLocation -Recurse |
Where-Object{$_.LastWriteTime -le (Get-Date).Subtract((New-TimeSpan -Days 7))}
if ($files.Count -gt 0){
foreach ($file in $files){
$logParserArgs = @"
"SELECT LogFilename, LogRow, TO_LOCALTIME(TO_TIMESTAMP(date, time)), s-sitename, s-computername, s-ip, cs-method, cs-uri-stem, cs-uri-query, s-port, cs-username, c-ip, cs-version, cs(User-Agent), cs(Cookie), cs(Referer), cs-host, sc-status, sc-substatus, sc-win32-status, sc-bytes, cs-bytes, time-taken INTO IisLogData FROM $($file.FullName)" -o:SQL -server:.\sql01 -database:logs -ignoreIdCols:ON -fixColNames:ON -maxStrFieldLen:1000
"@
Push-Location $logParserLocation
LogParser.exe $logParserArgs
Remove-Item $file.FullName
Pop-Location
}
}
答案2
将 IIS 日志直接写入 SQL 服务器而不是文本文件,最糟糕的是现在有两个真正的故障点:您的 IIS 实例和数据库服务器。
如果您开始将数据库日志记录到运行生产应用程序数据库的同一台机器上,那么您将占用该应用程序的资源。数据库可能会阻塞,可能会耗尽空间(诚然,您的硬盘驱动器也可能如此,但仍然如此),它们需要更定期的维护等。也就是说,它们可能会因与您的应用程序完全无关的原因而失败。如果它失败了,那么日志数据就消失了。
打开和写入文本文件日志的开销非常低。commandbreak 的脚本正是那种简短、简单的东西,它可以负责将日志移动到数据库;如果数据库关闭,日志仍然那里。