예제 #1
0
        public ActionResult Log(LogViewModel formModel)
        {
            if (!string.IsNullOrEmpty(formModel.Message))
                Trace.TraceInformation("MasterAdminController.Log(formModel): " + formModel.Message);

            var levels = formModel.GetLevels();
            IEnumerable<WindowsAzureLogHelper.TraceLogsEntity> logsSource = WindowsAzureLogHelper.GetLogEvents(
                formModel.Page ?? 1, levels.ToArray(), formModel.FilterRoleInstance, formModel.FilterPath);

            var logs = logsSource
                .Select(
                    item => new LogViewModel.TraceLogItem(item.Message)
                        {
                            Timestamp = DateTime.Parse(item.Timestamp),
                            Level = item.Level,
                            RoleInstance = item.RoleInstance,
                            Role = item.Role,
                        });

            if (formModel.HasPathFilter())
                logs = logs.Where(l => l.Path.StartsWith(formModel.FilterPath));

            if (formModel.HasSourceFilter())
                logs = logs.Where(l => l.Source.Equals(formModel.FilterSource, StringComparison.InvariantCultureIgnoreCase));

            if (formModel.HasTextFilter())
                logs = logs.Where(l => l.Text.IndexOf(formModel.FilterText, StringComparison.InvariantCultureIgnoreCase) > 0);

            if (formModel.HasRoleInstanceFilter())
                logs = logs.Where(l => formModel.FilterRoleInstance == l.RoleInstance);

            if (formModel.HasLevelFilter())
                logs = logs.Where(l => levels.Contains(l.Level));

            if (formModel.HasSpecialFilter())
                logs = logs.Where(l => l.SpecialStrings.Any(s => formModel.FilterSpecial.Contains(s)));

            if (formModel.HasRoleFilter())
                logs = logs.Where(l => formModel.FilterRole == l.Role);

            if (formModel.HasTimestampFilter())
            {
                if (formModel.FilterTimestamp == "now")
                {
                    var vm = formModel.Clone();
                    vm.FilterLevel = null;
                    var q = UrlBuilder.GetListQueryParams("FilterSpecial", vm.FilterSpecial);
                    vm.FilterTimestamp = this.GetUtcNow().ToString("yyyy'-'MM'-'dd'-'HH'-'mm");

                    return this.Redirect(UrlBuilder.AppendQuery(this.Url.Action("Log", vm), q));
                }

                var date =
                    DateTime.Parse(
                        Regex.Replace(
                            formModel.FilterTimestamp,
                            @"(\d{4})\-(\d{2})\-(\d{2})\-(\d{2})\-(\d{2})",
                            @"$1-$2-$3T$4:$5:00"));

                logs = logs.Where(l => l.Timestamp > date);
            }

            formModel.Logs = logs.ToList();

            return this.View(formModel);
        }