public static void Update()

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);
            }
        }