private static Dictionary <string, bool> LogExtFileFlagsRepresentation(LogExtFileFlags flags)
        {
            Dictionary <string, bool> logExtFileFlags = new Dictionary <string, bool>();

            logExtFileFlags.Add("date", flags.HasFlag(LogExtFileFlags.Date));
            logExtFileFlags.Add("time", flags.HasFlag(LogExtFileFlags.Time));
            logExtFileFlags.Add("client_ip", flags.HasFlag(LogExtFileFlags.ClientIP));
            logExtFileFlags.Add("username", flags.HasFlag(LogExtFileFlags.UserName));
            logExtFileFlags.Add("site_name", flags.HasFlag(LogExtFileFlags.SiteName));
            logExtFileFlags.Add("computer_name", flags.HasFlag(LogExtFileFlags.ComputerName));
            logExtFileFlags.Add("server_ip", flags.HasFlag(LogExtFileFlags.ServerIP));
            logExtFileFlags.Add("method", flags.HasFlag(LogExtFileFlags.Method));
            logExtFileFlags.Add("uri_stem", flags.HasFlag(LogExtFileFlags.UriStem));
            logExtFileFlags.Add("uri_query", flags.HasFlag(LogExtFileFlags.UriQuery));
            logExtFileFlags.Add("http_status", flags.HasFlag(LogExtFileFlags.HttpStatus));
            logExtFileFlags.Add("win_32_status", flags.HasFlag(LogExtFileFlags.Win32Status));
            logExtFileFlags.Add("bytes_sent", flags.HasFlag(LogExtFileFlags.BytesSent));
            logExtFileFlags.Add("bytes_recv", flags.HasFlag(LogExtFileFlags.BytesRecv));
            logExtFileFlags.Add("time_taken", flags.HasFlag(LogExtFileFlags.TimeTaken));
            logExtFileFlags.Add("server_port", flags.HasFlag(LogExtFileFlags.ServerPort));
            logExtFileFlags.Add("user_agent", flags.HasFlag(LogExtFileFlags.UserAgent));
            logExtFileFlags.Add("cookie", flags.HasFlag(LogExtFileFlags.Cookie));
            logExtFileFlags.Add("referer", flags.HasFlag(LogExtFileFlags.Referer));
            logExtFileFlags.Add("protocol_version", flags.HasFlag(LogExtFileFlags.ProtocolVersion));
            logExtFileFlags.Add("host", flags.HasFlag(LogExtFileFlags.Host));
            logExtFileFlags.Add("http_sub_status", flags.HasFlag(LogExtFileFlags.HttpSubStatus));

            return(logExtFileFlags);
        }
예제 #2
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="enableLogging"></param>
 /// <param name="extraLogFlagsToAdd"></param>
 /// <returns></returns>
 public SiteConfig WithLogging(bool enableLogging, LogExtFileFlags extraLogFlagsToAdd)
 {
     foreach (var site in GetCurrentSites())
     {
         site.LogFile.Enabled          = enableLogging;
         site.LogFile.LogExtFileFlags |= extraLogFlagsToAdd;
     }
     return(this);
 }
예제 #3
0
            private static string ToString(LogExtFileFlags flag)
            {
                FieldInfo            fi  = typeof(LogExtFileFlags).GetField(flag.ToString());
                DescriptionAttribute dna =
                    (DescriptionAttribute)Attribute.GetCustomAttribute(
                        fi, typeof(DescriptionAttribute));

                return(dna.Description);
            }
		public void SetWebServerDefaultLoggingSettings(LogExtFileFlags svrLoggingFlags)
		{
			using (var srvman = GetServerManager())
			{
				// Update logging settings
				srvman.SiteDefaults.LogFile.LogExtFileFlags |= svrLoggingFlags;
				//
				srvman.CommitChanges();
			}
		}
 public void SetWebServerDefaultLoggingSettings(LogExtFileFlags svrLoggingFlags)
 {
     using (var srvman = GetServerManager())
     {
         // Update logging settings
         srvman.SiteDefaults.LogFile.LogExtFileFlags |= svrLoggingFlags;
         //
         srvman.CommitChanges();
     }
 }
예제 #6
0
        public Fields(SiteLogFile file)
        {
            Element         = file;
            CustomLogFields = new List <CustomLogField>();
            foreach (CustomLogField item in file.CustomLogFields)
            {
                CustomLogFields.Add(item);
            }

            LogExtFileFlags = file.LogExtFileFlags;
        }
        // throws JsonSerializationException, ApiArgumentException
        private static LogExtFileFlags SetLogFieldFlags(LogExtFileFlags flags, dynamic model)
        {
            Dictionary <string, bool> logFields = JsonConvert.DeserializeObject <Dictionary <string, bool> >(model.ToString());

            if (logFields == null)
            {
                throw new ApiArgumentException(string.Empty);
            }

            Dictionary <string, LogExtFileFlags> flagPairs = new Dictionary <string, LogExtFileFlags>
            {
                { "date", LogExtFileFlags.Date },
                { "time", LogExtFileFlags.Time },
                { "client_ip", LogExtFileFlags.ClientIP },
                { "username", LogExtFileFlags.UserName },
                { "site_name", LogExtFileFlags.SiteName },
                { "computer_name", LogExtFileFlags.ComputerName },
                { "server_ip", LogExtFileFlags.ServerIP },
                { "method", LogExtFileFlags.Method },
                { "uri_stem", LogExtFileFlags.UriStem },
                { "uri_query", LogExtFileFlags.UriQuery },
                { "http_status", LogExtFileFlags.HttpStatus },
                { "win_32_status", LogExtFileFlags.Win32Status },
                { "bytes_sent", LogExtFileFlags.BytesSent },
                { "bytes_recv", LogExtFileFlags.BytesRecv },
                { "time_taken", LogExtFileFlags.TimeTaken },
                { "server_port", LogExtFileFlags.ServerPort },
                { "user_agent", LogExtFileFlags.UserAgent },
                { "cookie", LogExtFileFlags.Cookie },
                { "referer", LogExtFileFlags.Referer },
                { "protocol_version", LogExtFileFlags.ProtocolVersion },
                { "host", LogExtFileFlags.Host },
                { "http_sub_status", LogExtFileFlags.HttpSubStatus },
            };

            foreach (var key in flagPairs.Keys)
            {
                if (logFields.ContainsKey(key))
                {
                    if (logFields[key])
                    {
                        flags |= flagPairs[key];
                    }
                    else
                    {
                        flags &= ~flagPairs[key];
                    }
                }
            }

            return(flags);
        }
예제 #8
0
        public FieldsDialog(IServiceProvider serviceProvider, Fields logFile)
            : base(serviceProvider)
        {
            InitializeComponent();
            if (logFile.CustomLogFields != null)
            {
                foreach (CustomLogField custom in logFile.CustomLogFields)
                {
                    lvCustom.Items.Add(new CustomListViewItem(custom));
                }
            }

            foreach (LogExtFileFlags flag in Enum.GetValues(typeof(LogExtFileFlags)))
            {
                lvStandard.Items.Add(new StandardListViewItem(flag)
                {
                    Checked = (logFile.LogExtFileFlags & flag) == flag
                });
            }

            btnAdd.Enabled = logFile.CustomLogFields != null;

            var container = new CompositeDisposable();

            FormClosed += (sender, args) => container.Dispose();

            container.Add(
                Observable.FromEventPattern <EventArgs>(lvCustom, "SelectedIndexChanged")
                .ObserveOn(System.Threading.SynchronizationContext.Current)
                .Subscribe(evt =>
            {
                btnRemove.Enabled = lvCustom.SelectedItems.Count > 0;
                btnEdit.Enabled   = lvCustom.SelectedItems.Count == 1;
            }));

            container.Add(
                Observable.FromEventPattern <EventArgs>(lvStandard, "ItemChecked")
                .ObserveOn(System.Threading.SynchronizationContext.Current)
                .Subscribe(evt =>
            {
                if (enabled)
                {
                    btnOK.Enabled = true;
                }
            }));

            container.Add(
                Observable.FromEventPattern <EventArgs>(btnAdd, "Click")
                .ObserveOn(System.Threading.SynchronizationContext.Current)
                .Subscribe(evt =>
            {
                using (var dialog = new AddFieldDialog(ServiceProvider, null, logFile))
                {
                    if (dialog.ShowDialog() != DialogResult.OK)
                    {
                        return;
                    }

                    lvCustom.Items.Add(new CustomListViewItem(dialog.Custom));
                }
                btnOK.Enabled = true;
            }));

            container.Add(
                Observable.FromEventPattern <EventArgs>(btnEdit, "Click")
                .ObserveOn(System.Threading.SynchronizationContext.Current)
                .Subscribe(evt =>
            {
                var selected = (CustomListViewItem)lvCustom.SelectedItems[0];
                using (var dialog = new AddFieldDialog(ServiceProvider, selected.Custom, logFile))
                {
                    if (dialog.ShowDialog() != DialogResult.OK)
                    {
                        return;
                    }
                }

                selected.Update();
                btnOK.Enabled = true;
            }));

            container.Add(
                Observable.FromEventPattern <EventArgs>(btnRemove, "Click")
                .ObserveOn(System.Threading.SynchronizationContext.Current)
                .Subscribe(evt =>
            {
                foreach (CustomListViewItem item in lvCustom.SelectedItems)
                {
                    item.Remove();
                    item.Custom.Delete();
                    logFile.CustomLogFields.Remove(item.Custom);
                }

                btnOK.Enabled = true;
            }));

            container.Add(
                Observable.FromEventPattern <EventArgs>(btnOK, "Click")
                .ObserveOn(System.Threading.SynchronizationContext.Current)
                .Subscribe(evt =>
            {
                LogExtFileFlags flags = 0;
                foreach (StandardListViewItem item in lvStandard.Items)
                {
                    if (item.Checked)
                    {
                        flags |= item.Flag;
                    }
                }

                logFile.LogExtFileFlags = flags;
                DialogResult            = DialogResult.OK;
            }));
        }
예제 #9
0
 public StandardListViewItem(LogExtFileFlags flag)
 {
     Text = ToString(flag);
     Flag = flag;
 }
예제 #10
0
        /// <summary>
        /// 新建网站站点
        /// </summary>
        /// <param name="siteName">站点名</param>
        /// <param name="protocol">站点协议,如:http</param>
        /// <param name="bindingInformation">绑定的相关信息 "*:&lt;port&gt;:&lt;hostname&gt;" <example>"*:80:myhost.com"</example></param>
        /// <param name="physicalPath">物理路径</param>
        /// <param name="createAppPool">是否新建应用程序池</param>
        /// <param name="appPoolName">应用程序池名称</param>
        /// <param name="queueLength">队列长度</param>
        /// <param name="identityType">进程模型标识</param>
        /// <param name="idleTimeout">闲着超时时间(秒)</param>
        /// <param name="appPoolUserName">应用程序池特殊用户的用户名</param>
        /// <param name="appPoolPassword">应用程序池特殊用户的密码</param>
        /// <param name="maxProcesses">最大工作进程数</param>
        /// <param name="appPoolPipelineMode">应用程序池托管管道模式</param>
        /// <param name="managedRuntimeVersion">.net clr版本</param>
        /// <param name="rapidFailProtectionMaxCrashes">最大故障数</param>
        /// <param name="logDirectoryPath">IIS日志目录路径</param>
        /// <param name="logFormat">日志格式</param>
        /// <param name="logExtFileFlags">日志存储的字段</param>
        /// <param name="loggingRolloverPeriod">日志的存储计划</param>
        /// <param name="logTruncateSize">日志单个文件最大大小(MB) 最小为1MB<paramref name="loggingRolloverPeriod">LoggingRolloverPeriod.MaxSize</paramref> </param>
        public static void CreateSite(string siteName, string protocol, string bindingInformation, string physicalPath, bool createAppPool, string appPoolName, long queueLength, ProcessModelIdentityType identityType, long idleTimeout, string appPoolUserName, string appPoolPassword, long maxProcesses, ManagedPipelineMode appPoolPipelineMode, string managedRuntimeVersion, long rapidFailProtectionMaxCrashes, string logDirectoryPath, LogFormat logFormat, LogExtFileFlags logExtFileFlags, LoggingRolloverPeriod loggingRolloverPeriod, long logTruncateSize)
        {
            if (logTruncateSize < 1)
            {
                throw new Exception("日志单个文件最大大小的值必须>=1MB");
            }
            using (var mgr = new ServerManager(ApplicationHostConfigurationPath))
            {
                var site = mgr.Sites[siteName];
                if (site == null)
                {
                    site = mgr.Sites.Add(siteName, protocol, bindingInformation, physicalPath);
                    site.LogFile.Enabled         = true;
                    site.ServerAutoStart         = true;
                    site.LogFile.Directory       = logDirectoryPath;
                    site.LogFile.Period          = loggingRolloverPeriod;
                    site.LogFile.LogExtFileFlags = logExtFileFlags;
                    site.LogFile.TruncateSize    = logTruncateSize * 1024 * 1024;
                    site.LogFile.LogFormat       = logFormat;

                    if (createAppPool)
                    {
                        var pool = mgr.ApplicationPools.Add(siteName);
                        pool.Name = appPoolName;
                        pool.ManagedRuntimeVersion     = managedRuntimeVersion;
                        pool.QueueLength               = queueLength;
                        pool.ProcessModel.MaxProcesses = maxProcesses;
                        if (pool.ProcessModel.IdentityType != identityType)
                        {
                            pool.ProcessModel.IdentityType = identityType;
                        }
                        pool.ProcessModel.IdleTimeout = TimeSpan.FromSeconds(idleTimeout);
                        if (!String.IsNullOrEmpty(appPoolUserName))
                        {
                            pool.ProcessModel.UserName = appPoolUserName;
                            pool.ProcessModel.Password = appPoolPassword;
                        }
                        if (pool.ManagedPipelineMode != appPoolPipelineMode)
                        {
                            pool.ManagedPipelineMode = appPoolPipelineMode;
                        }
                        pool.Failure.RapidFailProtectionMaxCrashes = rapidFailProtectionMaxCrashes;
                        mgr.Sites[siteName].Applications[0].ApplicationPoolName = pool.Name;
                    }
                    mgr.CommitChanges();
                }
                else
                {
                    throw new Exception($"the web site:{siteName} is already exist");
                }
            }
        }
예제 #11
0
 /// <summary>
 /// 新建网站站点
 /// </summary>
 /// <param name="siteName">站点名</param>
 /// <param name="ip">ip 空字符串则为则直接默认 * </param>
 /// <param name="port">端口</param>
 /// <param name="hostName">主机名</param>
 /// <param name="physicalPath">物理路径</param>
 /// <param name="queueLength">队列长度</param>
 /// <param name="maxProcesses">最大工作进程数</param>
 /// <param name="netVersion">.net clr版本</param>
 /// <param name="appPoolPipelineMode">应用程序池托管管道模式</param>
 /// <param name="rapidFailProtectionMaxCrashes">最大故障数</param>
 /// <param name="logDirectoryPath">IIS日志目录路径</param>
 /// <param name="logFormat">日志格式</param>
 /// <param name="logExtFileFlags">日志存储的字段</param>
 /// <param name="loggingRolloverPeriod">日志的存储计划</param>
 /// <param name="logTruncateSize">日志单个文件最大大小(字节)</param>
 public static void CreateSite(string siteName, string ip, int port, string hostName, string physicalPath, long queueLength, long maxProcesses, NetVersion netVersion, ManagedPipelineMode appPoolPipelineMode, long rapidFailProtectionMaxCrashes, string logDirectoryPath, LogFormat logFormat, LogExtFileFlags logExtFileFlags, LoggingRolloverPeriod loggingRolloverPeriod, long logTruncateSize)
 {
     ip = String.IsNullOrWhiteSpace(ip) ? "*" : ip;
     CreateSite(siteName, $"{ip}:{port}:{hostName}", physicalPath, queueLength, maxProcesses, netVersion, appPoolPipelineMode, rapidFailProtectionMaxCrashes, logDirectoryPath, logFormat, logExtFileFlags, loggingRolloverPeriod, logTruncateSize);
 }
예제 #12
0
        /// <summary>
        /// 新建网站站点
        /// </summary>
        /// <param name="siteName">站点名</param>
        /// <param name="bindingInfo">绑定的相关信息 "*:&lt;port&gt;:&lt;hostname&gt;" <example>"*:80:myhost.com"</example></param>
        /// <param name="physicalPath">物理路径</param>
        /// <param name="queueLength">队列长度</param>
        /// <param name="maxProcesses">最大工作进程数</param>
        /// <param name="netVersion">.net clr版本</param>
        /// <param name="appPoolPipelineMode">应用程序池托管管道模式</param>
        /// <param name="rapidFailProtectionMaxCrashes">最大故障数</param>
        /// <param name="logDirectoryPath">IIS日志目录路径</param>
        /// <param name="logFormat">日志格式</param>
        /// <param name="logExtFileFlags">日志存储的字段</param>
        /// <param name="loggingRolloverPeriod">日志的存储计划</param>
        /// <param name="logTruncateSize">日志单个文件最大大小(字节)</param>
        public static void CreateSite(string siteName, string bindingInfo, string physicalPath, long queueLength, long maxProcesses, NetVersion netVersion, ManagedPipelineMode appPoolPipelineMode, long rapidFailProtectionMaxCrashes, string logDirectoryPath, LogFormat logFormat, LogExtFileFlags logExtFileFlags, LoggingRolloverPeriod loggingRolloverPeriod, long logTruncateSize)
        {
            var managedRuntimeVersion = netVersion == NetVersion.V2 ? NetVersion2 : NetVersion4;

            CreateSite(siteName, "http", bindingInfo, physicalPath, true, siteName, queueLength, ProcessModelIdentityType.ApplicationPoolIdentity, 120, null, null, maxProcesses, appPoolPipelineMode, managedRuntimeVersion, rapidFailProtectionMaxCrashes, logDirectoryPath, logFormat, logExtFileFlags, loggingRolloverPeriod, logTruncateSize);
        }