网站的日志文件 <logFile>
概述
<site>
元素的 <logFile>
元素包含可用于为 IIS 7 及更高版本上的站点配置日志记录的属性。
例如,你可以启用或禁用日志记录、配置 IIS 日志文件的格式、指定要存储在日志文件中的信息类别,以及更改日志文件的存储目录。 还可以使用 <logFile>
元素来控制 IIS 根据日志文件大小或时间间隔创建新日志文件的频率,以及日志文件可以达到的最大大小(以字节为单位)。
默认情况下,IIS 7 及更高版本使用万维网联合会 (W3C) 日志文件格式。 可以通过将 logFormat 属性修改为 IIS、NCSA或 Custom 来更改此设置。
注意
在 IIS 7 及更高版本中,ODBC 日志记录作为自定义日志记录模块实现。 因此,在 IIS 7 及更高版本中启用和配置 ODBC 日志记录包含两个单独的操作:
- 在
<odbcLogging>
元素中设置 ODBC 日志记录属性。 这些属性指定 ODBC 连接的系统数据源名称 (DSN)、表名、用户名和密码。 - 在
<logFile>
元素中设置正确的自定义日志记录属性。 这些属性必须将日志文件格式设置为“Custom”,并将自定义日志插件类 ID 设置为“{FF16065B-DE82-11CF-BC0A-00AA006111E0}”。
有关 ODBC 日志记录的详细信息,请参阅 <odbcLogging>
元素。
可以通过编辑 logExtFileFlags 属性来定义 IIS 记录的信息类别。 默认值为 Date
、Time
、ClientIP
、UserName
、ServerIP
、Method
、UriStem
、UriQuery
、TimeTaken
、HttpStatus
、Win32Status
、ServerPort
、UserAgent
、HttpSubStatus
和 Referer
。
注意
如果在特定站点的 <siteDefaults>
部分和 <site>
部分中都配置了 <logFile>
元素,则会将 <site>
部分中的配置用于该站点。
除了标准记录集之外,IIS 8.5 还支持记录自定义字段。 日志文件格式必须是 W3C 才能添加自定义字段。 有关详细信息,请参阅 customFields
。
兼容性
版本 | 说明 |
---|---|
IIS 10.0 | <logFile> 元素在 IIS 10.0 中未进行修改。 |
IIS 8.5 | 添加了 flushByEntryCountW3CLog 属性,用于指定在将事件刷新到日志文件之前存储在缓冲区中的事件数。 添加了 logTargetW3C 属性,用于指定如何处理记录的 IIS 事件。 添加了 maxLogLineLength 属性,用于指定日志文件中行的最大长度。 添加了 <customFields> 子元素。 |
IIS 8.0 | 添加了 logSiteId 属性,用于指定 -sitename 字段的内容,并在 logExtFileFlags 属性的默认值中添加了 referer 标志。 |
IIS 7.5 | <logFile> 元素在 IIS 7.5 中未进行修改。 |
IIS 7.0 | <site> 元素的 <logFile> 元素是在 IIS 7.0 中引入的。 |
IIS 6.0 | <logFile> 元素取代了 IIS 6.0 IIsWebService 元数据库对象上的日志记录属性部分。 |
安装
<logFile>
元素包含在 IIS 7 及更高版本的默认安装中。
操作方式
如何编辑站点的日志记录设置
打开 Internet Information Services (IIS) 管理器:
如果使用的是 Windows Server 2012 或 Windows Server 2012 R2:
- 在任务栏上,单击“服务器管理器”,单击“工具”,然后单击“Internet Information Services (IIS)管理器”。
如果使用的是 Windows 8 或 Windows 8.1:
- 按住 Windows 键,按字母 X,然后单击“控制面板”。
- 单击“管理工具”,然后双击“Internet Information Services (IIS)管理器”。
如果使用的是 Windows Server 2008 或 Windows Server 2008 R2:
- 在任务栏上,单击“开始”,指向“管理工具”,然后单击“Internet Information Services (IIS)管理器”。
如果使用的是 Windows Vista 或 Windows 7:
- 在任务栏上,单击“开始”,然后单击“控制面板”。
- 双击“管理工具”,然后双击“Internet Information Services (IIS)管理器”。
在“连接”窗格中,展开服务器名称,展开“站点”,然后单击要在其中配置日志记录的网站。
在“开始”窗格中,双击“日志记录”。
在“日志记录”窗格的“格式”框中,选择日志文件格式,然后在“目录”框中键入存储日志文件的目录的路径,或单击“浏览...”以选择要在其中存储日志文件的目录。
如果选择使用 W3C 日志文件格式:
- 单击“选择字段”以选择要记录的信息类型。
- 在“W3C 日志记录字段”对话框中,选中要记录的选项的复选框,清除不想记录的选项的复选框,然后单击“确定”。
如何为 W3C 日志配置 ETW 或文件日志记录
打开 Internet Information Services (IIS) 管理器:
如果使用的是 Windows Server 2012 R2:
- 在任务栏上,单击“服务器管理器”,单击“工具”,然后单击“Internet Information Services (IIS)管理器”。
如果使用的是 Windows 8.1:
- 按住 Windows 键,按字母 X,然后单击“控制面板”。
- 单击“管理工具”,然后双击“Internet Information Services (IIS)管理器”。
在“连接”窗格中,展开服务器名称,展开“站点”,然后选择一个站点。
在站点的主窗格中,双击“日志记录”。
在“日志记录”主页中,对于“日志事件目标”,选择“仅日志文件”、“仅 ETW 事件”或“日志文件和 ETW 事件”。
如何配置按条目计数刷新 W3C 日志
打开 Internet Information Services (IIS) 管理器:
如果使用的是 Windows Server 2012 R2:
- 在任务栏上,单击“服务器管理器”,单击“工具”,然后单击“Internet Information Services (IIS)管理器”。
如果使用的是 Windows 8.1:
- 按住 Windows 键,按字母 X,然后单击“控制面板”。
- 单击“管理工具”,然后双击“Internet Information Services (IIS)管理器”。
在“连接”窗格中,展开服务器,然后双击“配置编辑器”。
在“配置编辑器”的“部分”中,展开
system.applicationHost
,然后选择“站点”。单击“(集合)”,然后单击省略号。
选择要配置的站点,然后展开“logFile”。
对于“flushByEntryCountW3Clog”,输入在将事件刷新到日志文件之前存储在缓冲区中的事件数。
在“操作”窗格中,单击“应用”。
如何配置最大日志行长度
打开 Internet Information Services (IIS) 管理器:
如果使用的是 Windows Server 2012 R2:
- 在任务栏上,单击“服务器管理器”,单击“工具”,然后单击“Internet Information Services (IIS)管理器”。
如果使用的是 Windows 8.1:
- 按住 Windows 键,按字母 X,然后单击“控制面板”。
- 单击“管理工具”,然后双击“Internet Information Services (IIS)管理器”。
在“连接”窗格中,展开服务器,然后双击“配置编辑器”。
在“配置编辑器”的“部分”中,展开
system.applicationHost
,然后选择“站点”。单击“(集合)”,然后单击省略号。
选择要配置的站点,然后展开“logFile”。
对于“maxLogLineLength”,输入日志文件单行的最大字节数。
在“操作”窗格中,单击“应用”。
配置
特性
属性 | 说明 | ||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
customLogPluginClsid |
可选的字符串属性。 按优先级顺序为自定义模块指定一个或多个 COM 对象类 ID (CLSID)。 |
||||||||||||||||||||||||||||||||||||||||||||||
directory |
可选的字符串属性。 指定日志记录目录,其中存储日志文件和与日志记录相关的支持文件。 默认值为 %SystemDrive%\inetpub\logs\LogFiles 。 |
||||||||||||||||||||||||||||||||||||||||||||||
enabled |
可选布尔属性。 指定是为站点启用 (true) 还是禁用 (false) 日志记录。 注意:ASP 和 ODBC 错误不会记录在 IIS 日志文件中。 默认值为 true 。 |
||||||||||||||||||||||||||||||||||||||||||||||
flushByEntryCountW3CLog |
可选 uint 属性。 指定在将事件刷新到日志文件之前存储在缓冲区中的事件数。 数字越小,事件刷新的速度越快,但磁盘操作次数越多,性能越差。 若要更实时地排除故障,请降低该值;若要提高性能,请提高该值。 如果值为 0 ,则指定以默认最大值 64k 进行刷新。默认值为 0 。 |
||||||||||||||||||||||||||||||||||||||||||||||
localTimeRollover |
可选布尔属性。 指定是基于本地时间还是协调世界时 (UTC)(以前称为格林威治标准时间 (GMT))创建新日志文件。 如果为 false,则基于 UTC 创建新日志文件。 注意:无论设置如何,每个 W3C 扩展日志记录的时间戳都是基于 UTC 的。 默认值为 false 。 |
||||||||||||||||||||||||||||||||||||||||||||||
logExtFileFlags |
可选 flags 属性。 指定在记录站点事件期间写入日志文件(使用 W3C 扩展日志文件格式时)或 ODBC 数据源的信息类别。 logExtFileFlags 属性可为以下一个或多个值。 如果指定多个值,请用逗号 (,) 分隔。 默认值为 Date 、Time 、ClientIP 、UserName 、ServerIP 、Method 、UriStem 、UriQuery 、TimeTaken 、HttpStatus 、Win32Status 、ServerPort 、UserAgent 、HttpSubStatus 、Referer 。
|
||||||||||||||||||||||||||||||||||||||||||||||
logFormat |
可选 enum 属性。 指定日志文件格式。 logFormat 属性可为以下值之一。 默认值为 W3C 。
|
||||||||||||||||||||||||||||||||||||||||||||||
logSiteId |
可选布尔属性。 指定 s-sitename 字段将包含站点名称 (false) 或站点 ID (true)。 如果“每个属性一个日志文件”设置为 Site (内置默认值),则默认情况下日志文件中不会出现 s-sitename 列,因为日志文件名属性将改为包含站点 ID。 如果“每个属性一个日志文件”设置为 Server ,则默认情况下日志文件中将包含 s-sitename 列。默认值为 True ,即 s-sitename 字段包含站点 ID。 若要改为记录站点名称,请将 logSiteID 设置为 False 。 |
||||||||||||||||||||||||||||||||||||||||||||||
logTargetW3C |
可选 Flags 属性。 指定 IIS 是否将使用 Windows 事件跟踪 (ETW) 和/或文件日志记录来处理记录的 IIS 事件。 ETW 提供实时日志记录,并使用 ETW 提供程序和标准查询机制。 文件日志记录将事件数据存储在文本文件中,你可以分析这些文件以访问日志记录数据。 当 IIS 使用日志文件时,HTTP.sys 在事务完成后将数据直接记录到文本日志文件中。 使用 ETW 时,HTTP.sys 使用 iislogging 提供程序将数据发送到 ETW,LOGSVC 服务则管理日志数据,包括查询 ETW 数据、直接从工作进程收集数据以及将数据发送到日志文件。 logTargetW3C 属性可能具有以下值。 默认值为 File 。 如果在 applicationHost.config 中为站点的 logTargetW3C 同时列出了 File 和 ETW ,则相当于在 IIS 管理器的“日志记录”窗格中为站点的日志文件设置选择了“日志文件和 ETW 事件”。
|
||||||||||||||||||||||||||||||||||||||||||||||
maxLogLineLength |
可选 uint 属性。 指定日志文件中行的最大长度。 可用于限制通过日志记录累积的数据量,节省磁盘空间,尤其是在添加自定义日志记录字段时。 范围从 2 到 65,536。 默认值为 65536 。 |
||||||||||||||||||||||||||||||||||||||||||||||
period |
可选 enum 属性。 指定 IIS 创建新日志文件的频率。 period 属性可为以下值之一。 默认值为 Daily 。
|
||||||||||||||||||||||||||||||||||||||||||||||
truncateSize |
可选 int64 属性。 指定日志文件的最大大小(以字节为单位),超过该大小后将创建新日志文件。 仅当为 period 属性选择了 MaxSize 时,此值才适用。 最小文件大小为 1,048,576 字节。 如果将此属性设置为小于 1,048,576 字节的值,则会隐式将默认值假定为 1,048,576 字节。 默认值为 20971520 。 |
子元素
元素 | 说明 |
---|---|
customFields |
可选元素。 指定 W3C 日志中自定义字段集合的配置设置。 |
配置示例
以下配置示例使用 <logFile>
元素的 logExtFileFlags 属性来指定 IIS 为名为 Contoso 的网站记录日志的设置。 period 属性使 IIS 每小时创建一个新的 W3C 日志文件;localTimeRollover 属性指定 IIS 使用本地服务器上的时间来确定何时创建新日志文件并为其命名。
<site name="Contoso" id="2" serverAutoStart="true">
<application path="/" applicationPool="Contoso">
<virtualDirectory path="/" physicalPath="C:\Contoso\Content" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:80:www.contoso.com" />
</bindings>
<logFile
period="Hourly"
localTimeRollover="true"
logExtFileFlags="Date, Time, ClientIP, UserName, ServerIP, Method, UriStem, UriQuery, HttpStatus, TimeTaken, ServerPort, UserAgent, HttpSubStatus" />
</site>
代码示例
以下示例为名为 Contoso 的站点配置日志记录。 每个示例都启用了站点日志记录,并将站点日志记录配置为每天生成一个新日志文件。 这些示例还将 IIS 配置为使用本地服务器上的时间来生成日志文件名和确定何时生成新日志文件。
AppCmd.exe
appcmd.exe set config -section:system.applicationHost/sites /[name='Contoso'].logFile.logFormat:"W3C"
appcmd.exe set config -section:system.applicationHost/sites /[name='Contoso'].logFile.period:"Daily"
appcmd.exe set config -section:system.applicationHost/sites /[name='Contoso'].logFile.localTimeRollover:"True"
appcmd.exe set config -section:system.applicationHost/sites /[name='Contoso'].logFile.enabled:"True" /commit:apphost
注意
使用 AppCmd.exe 配置这些设置时,必须确保将 commit 参数设置为 apphost
。 这会将配置设置提交到 ApplicationHost.config 文件中的相应位置部分。
C#
using System;
using System.Text;
using Microsoft.Web.Administration;
internal static class Sample
{
private static void Main()
{
using (ServerManager serverManager = new ServerManager())
{
Configuration config = serverManager.GetApplicationHostConfiguration();
ConfigurationSection sitesSection = config.GetSection("system.applicationHost/sites");
ConfigurationElementCollection sitesCollection = sitesSection.GetCollection();
ConfigurationElement siteElement = FindElement(sitesCollection, "site", "name", @"Contoso");
if (siteElement == null) throw new InvalidOperationException("Element not found!");
ConfigurationElement logFileElement = siteElement.GetChildElement("logFile");
logFileElement["logFormat"] = @"W3C";
logFileElement["period"] = @"Daily";
logFileElement["localTimeRollover"] = true;
logFileElement["enabled"] = true;
serverManager.CommitChanges();
}
}
private static ConfigurationElement FindElement(ConfigurationElementCollection collection, string elementTagName, params string[] keyValues)
{
foreach (ConfigurationElement element in collection)
{
if (String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase))
{
bool matches = true;
for (int i = 0; i < keyValues.Length; i += 2)
{
object o = element.GetAttributeValue(keyValues[i]);
string value = null;
if (o != null)
{
value = o.ToString();
}
if (!String.Equals(value, keyValues[i + 1], StringComparison.OrdinalIgnoreCase))
{
matches = false;
break;
}
}
if (matches)
{
return element;
}
}
}
return null;
}
}
VB.NET
Imports System
Imports System.Text
Imports Microsoft.Web.Administration
Module Sample
Sub Main()
Dim serverManager As ServerManager = New ServerManager
Dim config As Configuration = serverManager.GetApplicationHostConfiguration
Dim sitesSection As ConfigurationSection = config.GetSection("system.applicationHost/sites")
Dim sitesCollection As ConfigurationElementCollection = sitesSection.GetCollection
Dim siteElement As ConfigurationElement = FindElement(sitesCollection, "site", "name", "Contoso")
If (siteElement Is Nothing) Then
Throw New InvalidOperationException("Element not found!")
End If
Dim logFileElement As ConfigurationElement = siteElement.GetChildElement("logFile")
logFileElement("logFormat") = "W3C"
logFileElement("period") = "Daily"
logFileElement("localTimeRollover") = True
logFileElement("enabled") = True
serverManager.CommitChanges()
End Sub
Private Function FindElement(ByVal collection As ConfigurationElementCollection, ByVal elementTagName As String, ByVal ParamArray keyValues() As String) As ConfigurationElement
For Each element As ConfigurationElement In collection
If String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase) Then
Dim matches As Boolean = True
Dim i As Integer
For i = 0 To keyValues.Length - 1 Step 2
Dim o As Object = element.GetAttributeValue(keyValues(i))
Dim value As String = Nothing
If (Not (o) Is Nothing) Then
value = o.ToString
End If
If Not String.Equals(value, keyValues((i + 1)), StringComparison.OrdinalIgnoreCase) Then
matches = False
Exit For
End If
Next
If matches Then
Return element
End If
End If
Next
Return Nothing
End Function
End Module
JavaScript
var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST";
var sitesSection = adminManager.GetAdminSection("system.applicationHost/sites", "MACHINE/WEBROOT/APPHOST");
var sitesCollection = sitesSection.Collection;
var siteElementPos = FindElement(sitesCollection, "site", ["name", "Contoso"]);
if (siteElementPos == -1) throw "Element not found!";
var siteElement = sitesCollection.Item(siteElementPos);
var logFileElement = siteElement.ChildElements.Item("logFile");
logFileElement.Properties.Item("logFormat").Value = "W3C";
logFileElement.Properties.Item("period").Value = "Daily";
logFileElement.Properties.Item("localTimeRollover").Value = true;
logFileElement.Properties.Item("enabled").Value = true;
adminManager.CommitChanges();
function FindElement(collection, elementTagName, valuesToMatch) {
for (var i = 0; i < collection.Count; i++) {
var element = collection.Item(i);
if (element.Name == elementTagName) {
var matches = true;
for (var iVal = 0; iVal < valuesToMatch.length; iVal += 2) {
var property = element.GetPropertyByName(valuesToMatch[iVal]);
var value = property.Value;
if (value != null) {
value = value.toString();
}
if (value != valuesToMatch[iVal + 1]) {
matches = false;
break;
}
}
if (matches) {
return i;
}
}
}
return -1;
}
VBScript
Set adminManager = createObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST"
Set sitesSection = adminManager.GetAdminSection("system.applicationHost/sites", "MACHINE/WEBROOT/APPHOST")
Set sitesCollection = sitesSection.Collection
siteElementPos = FindElement(sitesCollection, "site", Array("name", "Contoso"))
If siteElementPos = -1 Then
WScript.Echo "Element not found!"
WScript.Quit
End If
Set siteElement = sitesCollection.Item(siteElementPos)
Set logFileElement = siteElement.ChildElements.Item("logFile")
logFileElement.Properties.Item("logFormat").Value = "W3C"
logFileElement.Properties.Item("period").Value = "Daily"
logFileElement.Properties.Item("localTimeRollover").Value = True
logFileElement.Properties.Item("enabled").Value = True
adminManager.CommitChanges()
Function FindElement(collection, elementTagName, valuesToMatch)
For i = 0 To CInt(collection.Count) - 1
Set element = collection.Item(i)
If element.Name = elementTagName Then
matches = True
For iVal = 0 To UBound(valuesToMatch) Step 2
Set property = element.GetPropertyByName(valuesToMatch(iVal))
value = property.Value
If Not IsNull(value) Then
value = CStr(value)
End If
If Not value = CStr(valuesToMatch(iVal + 1)) Then
matches = False
Exit For
End If
Next
If matches Then
Exit For
End If
End If
Next
If matches Then
FindElement = i
Else
FindElement = -1
End If
End Function