in src/Microsoft.IIS.Administration.WebServer.Logging/LoggingHelper.cs [156:423]
public static void Update(dynamic model, IFileProvider fileProvider, Site site, string path, string configScope = null)
{
if(model == null) {
throw new ApiArgumentException("model");
}
// Cannot configure at any path below site
if(site != null && path != "/")
{
throw new InvalidScopeTypeException(string.Format("{0}{1}", (site == null ? "" : site.Name), path ?? ""));
}
LogSection logSection = GetLogSection(site, path, configScope);
HttpLoggingSection httpLoggingSection = GetHttpLoggingSection(site, path, configScope);
// Site log settings are set in the site defaults if Configuration target is server
// If target is a site then the site's logfile element is used
SiteLogFile siteLogFile = site == null ? ManagementUnit.Current.ServerManager.SiteDefaults.LogFile : site.LogFile;
try {
bool? enabled = DynamicHelper.To<bool>(model.enabled);
if(enabled != null) {
TrySetLoggingEnabled(enabled.Value, httpLoggingSection, logSection, siteLogFile, site, configScope);
}
// Extract rollover from model
dynamic rollover = model.rollover;
if (rollover != null && !(rollover is JObject)) {
throw new ApiArgumentException("rollover", ApiArgumentException.EXPECTED_OBJECT);
}
// Only accessible at server level
if (site == null) {
DynamicHelper.If<bool>((object)model.log_per_site, v => logSection.CentralLogFileMode = v ? CentralLogFileMode.Site : CentralLogFileMode.CentralW3C);
DynamicHelper.If<FileLogFormat>((object)model.log_file_format, v => {
// Site log mode exposes 4 possible log formats
if(logSection.CentralLogFileMode == CentralLogFileMode.Site) {
switch(v) {
case FileLogFormat.Custom:
siteLogFile.LogFormat = LogFormat.Custom;
break;
case FileLogFormat.Iis:
siteLogFile.LogFormat = LogFormat.Iis;
break;
case FileLogFormat.W3c:
siteLogFile.LogFormat = LogFormat.W3c;
break;
case FileLogFormat.Ncsa:
siteLogFile.LogFormat = LogFormat.Ncsa;
break;
default:
throw new ApiArgumentException("log_file_format");
}
}
// Server log mode exposes 2 possible log formats
else {
switch (v) {
case FileLogFormat.W3c:
logSection.CentralLogFileMode = CentralLogFileMode.CentralW3C;
break;
case FileLogFormat.Binary:
logSection.CentralLogFileMode = CentralLogFileMode.CentralBinary;
break;
default:
throw new ApiArgumentException("log_file_format");
}
}
});
DynamicHelper.If((object)model.log_file_encoding, v => {
switch(v.ToLower()) {
case "utf-8":
logSection.LogInUTF8 = true;
break;
case "ansi":
logSection.LogInUTF8 = false;
break;
default:
throw new ApiArgumentException("log_file_encoding");
}
});
// Binary log mode settings
if (logSection.CentralLogFileMode == CentralLogFileMode.CentralBinary) {
dynamic bSettings = model;
CentralBinaryLogFile bFile = logSection.CentralBinaryLogFile;
DynamicHelper.If((object)bSettings.directory, v => {
EnsureCanUseDirectory(ref v, fileProvider);
bFile.Directory = v;
});
if(rollover != null) {
DynamicHelper.If<LoggingRolloverPeriod>((object)PeriodFromRepresentation(rollover.period), v => bFile.Period = v);
DynamicHelper.If((object)rollover.truncate_size, 1048576, 4294967295, v => bFile.TruncateSize = v);
DynamicHelper.If<bool>((object)rollover.use_local_time, v => bFile.LocalTimeRollover = v);
}
}
// W3C log mode settings
if (logSection.CentralLogFileMode == CentralLogFileMode.CentralW3C) {
dynamic wSettings = model;
CentralW3CLogFile wFile = logSection.CentralW3CLogFile;
DynamicHelper.If((object)wSettings.directory, v => {
EnsureCanUseDirectory(ref v, fileProvider);
wFile.Directory = v;
});
if(rollover != null) {
DynamicHelper.If<LoggingRolloverPeriod>((object)PeriodFromRepresentation(rollover.period), v => wFile.Period = v);
DynamicHelper.If((object)rollover.truncate_size, 1048576, 4294967295, v => wFile.TruncateSize = v);
DynamicHelper.If<bool>((object)rollover.use_local_time, v => wFile.LocalTimeRollover = v);
}
if (wSettings.log_fields != null) {
try {
wFile.LogExtFileFlags = SetLogFieldFlags(wFile.LogExtFileFlags, wSettings.log_fields);
}
catch (ApiArgumentException e) {
throw new ApiArgumentException("w3c_settings.log_fields", e);
}
catch (JsonSerializationException e) {
throw new ApiArgumentException("w3c_settings.log_fields", e);
}
}
}
}
//
// Per site mode format
DynamicHelper.If<FileLogFormat>((object)model.log_file_format, v => {
if (logSection.CentralLogFileMode == CentralLogFileMode.Site) {
switch (v) {
case FileLogFormat.Custom:
siteLogFile.LogFormat = LogFormat.Custom;
break;
case FileLogFormat.Iis:
siteLogFile.LogFormat = LogFormat.Iis;
break;
case FileLogFormat.W3c:
siteLogFile.LogFormat = LogFormat.W3c;
break;
case FileLogFormat.Ncsa:
siteLogFile.LogFormat = LogFormat.Ncsa;
break;
default:
throw new ApiArgumentException("log_file_format");
}
}
});
// Site settings
if (logSection.CentralLogFileMode == CentralLogFileMode.Site) {
dynamic siteSettings = model;
DynamicHelper.If((object)siteSettings.directory, v => {
EnsureCanUseDirectory(ref v, fileProvider);
siteLogFile.Directory = v;
});
if(rollover != null) {
DynamicHelper.If<LoggingRolloverPeriod>((object)PeriodFromRepresentation(rollover.period), v => siteLogFile.Period = v);
DynamicHelper.If((object)rollover.truncate_size, 1048576, 4294967295, v => siteLogFile.TruncateSize = v);
DynamicHelper.If<bool>((object)rollover.use_local_time, v => siteLogFile.LocalTimeRollover = v);
}
if (siteSettings.log_fields != null) {
try {
siteLogFile.LogExtFileFlags = SetLogFieldFlags(siteLogFile.LogExtFileFlags, siteSettings.log_fields);
}
catch (ApiArgumentException e) {
throw new ApiArgumentException("site_settings.log_fields", e);
}
catch (JsonSerializationException e) {
throw new ApiArgumentException("site_settings.log_fields", e);
}
}
if (siteSettings.log_target != null && siteLogFile.Schema.HasAttribute(LogTargetW3CAttribute)) {
try {
Dictionary<string, bool> logTargets = JsonConvert.DeserializeObject<Dictionary<string, bool>>(siteSettings.log_target.ToString());
if (logTargets == null) {
throw new ApiArgumentException("site_settings.log_target_w3c");
}
LogTargetW3C logTargetW3C = siteLogFile.LogTargetW3C;
if (logTargets.ContainsKey("etw")) {
if(logTargets["etw"]) {
logTargetW3C |= LogTargetW3C.ETW;
}
else {
logTargetW3C &= ~LogTargetW3C.ETW;
}
}
if (logTargets.ContainsKey("file")) {
if (logTargets["file"]) {
logTargetW3C |= LogTargetW3C.File;
}
else {
logTargetW3C &= ~LogTargetW3C.File;
}
}
siteLogFile.LogTargetW3C = logTargetW3C;
}
catch (JsonSerializationException e) {
throw new ApiArgumentException("site_settings.log_fields", e);
}
}
if (siteSettings.custom_log_fields != null && siteLogFile.Schema.HasChildElement(CustomFieldsElement)) {
IEnumerable<dynamic> customFields = siteSettings.custom_log_fields;
List<CustomField> tempCustFields = new List<CustomField>();
foreach (dynamic field in customFields) {
string fieldName = DynamicHelper.Value(field.field_name);
string sourceName = DynamicHelper.Value(field.source_name);
CustomLogFieldSourceType? sourceType = SourceTypeFromRepresentation(field.source_type);
if (string.IsNullOrEmpty(fieldName)) {
throw new ApiArgumentException("custom_log_field.field_name");
}
if (string.IsNullOrEmpty(sourceName)) {
throw new ApiArgumentException("custom_log_field.source_name");
}
if (sourceType == null) {
throw new ApiArgumentException("custom_log_field.source_type");
}
tempCustFields.Add(new CustomField() {
FieldName = fieldName,
SourceName = sourceName,
SourceType = sourceType.Value
});
}
siteLogFile.CustomLogFields.Clear();
tempCustFields.ForEach(f => siteLogFile.CustomLogFields.Add(f.FieldName, f.SourceName, f.SourceType));
}
}
if (model.metadata != null) {
DynamicHelper.If<OverrideMode>((object)model.metadata.override_mode, v => httpLoggingSection.OverrideMode = v);
}
}
catch (FileLoadException e) {
throw new LockedException(logSection.SectionPath + "|" + httpLoggingSection.SectionPath, e);
}
catch (DirectoryNotFoundException e) {
throw new ConfigScopeNotFoundException(e);
}
}