修改BUG:修复程序异常页面查询、排序功能,完善查看服务器日志格式化文件流
This commit is contained in:
parent
2bdc2603c4
commit
8bab03dbb9
|
@ -1,4 +1,31 @@
|
||||||
.hidden-tb {
|
.logfile {
|
||||||
|
color: #d41404;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logfile:focus, .logfile:active, .logfile:hover {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logfile span {
|
||||||
|
margin-left: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logTs, .logSql, .logDbExcep {
|
||||||
|
color: red;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logExcep {
|
||||||
|
color: #337ab7;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logMsg {
|
||||||
|
color: #ce2520;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hidden-tb {
|
||||||
margin-left: 6px;
|
margin-left: 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
// handler modal window show event
|
// handler modal window show event
|
||||||
if (this.options.modal && this.options.modal.constructor === String) {
|
if (this.options.modal && this.options.modal.constructor === String) {
|
||||||
$('#' + this.options.modal).on('show.bs.modal', function (e) {
|
$('#' + this.options.modal).on('show.bs.modal', function (e) {
|
||||||
if (that.options.validateForm.constructor === String) {
|
if (that.options.validateForm && that.options.validateForm.constructor === String) {
|
||||||
var v = $('#' + that.options.validateForm);
|
var v = $('#' + that.options.validateForm);
|
||||||
var vf = v.validate();
|
var vf = v.validate();
|
||||||
vf.currentElements.each(function () { $(this).popover('destroy'); })
|
vf.currentElements.each(function () { $(this).popover('destroy'); })
|
||||||
|
@ -274,12 +274,11 @@
|
||||||
|
|
||||||
function success(result) {
|
function success(result) {
|
||||||
if ($.isFunction(data.callback)) {
|
if ($.isFunction(data.callback)) {
|
||||||
|
var formatData = result;
|
||||||
if ($.isArray(result)) {
|
if ($.isArray(result)) {
|
||||||
var formatData = result;
|
|
||||||
if ($.isFunction(data.html)) formatData = data.html(result);
|
if ($.isFunction(data.html)) formatData = data.html(result);
|
||||||
data.callback(formatData);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
data.callback(formatData);
|
||||||
}
|
}
|
||||||
else if ($.isPlainObject(data.callback) && data.callback.modal !== undefined) {
|
else if ($.isPlainObject(data.callback) && data.callback.modal !== undefined) {
|
||||||
$("#" + data.callback.modal).modal('hide');
|
$("#" + data.callback.modal).modal('hide');
|
||||||
|
@ -288,7 +287,6 @@
|
||||||
if (result) { swal("成功", data.title, "success"); }
|
if (result) { swal("成功", data.title, "success"); }
|
||||||
else { swal("失败", data.title, "error"); }
|
else { swal("失败", data.title, "error"); }
|
||||||
}
|
}
|
||||||
if ($.isFunction(data.callback)) data.callback(result);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Roles
|
// Roles
|
||||||
|
@ -420,12 +418,12 @@
|
||||||
title: "程序异常日志",
|
title: "程序异常日志",
|
||||||
html: function (result) {
|
html: function (result) {
|
||||||
return result.map(function (ele) {
|
return result.map(function (ele) {
|
||||||
return $.format('<div class="form-group col-lg-3 col-md-3 col-sm-4 col-xs-6"><a href="#">{0}</a></div>', ele);
|
return $.format('<div class="form-group col-lg-3 col-md-3 col-sm-4 col-xs-6"><a class="logfile" href="#"><i class="fa fa-file-text-o"></i><span>{0}</span></a></div>', ele);
|
||||||
}).join('');
|
}).join('');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Exceptions.getFiles = function (callback) {
|
Exceptions.getFiles = function (callback) {
|
||||||
processData.call(this, { Id: "", callback: callback });
|
processData.call(this, { Id: "", callback: callback, swal: false });
|
||||||
}
|
}
|
||||||
Exceptions.getFileByName = function (fileName, callback) {
|
Exceptions.getFileByName = function (fileName, callback) {
|
||||||
processData.call(this, { Id: "", callback: callback, method: "PUT", swal: false, data: { "": fileName } });
|
processData.call(this, { Id: "", callback: callback, method: "PUT", swal: false, data: { "": fileName } });
|
||||||
|
|
|
@ -3,6 +3,7 @@ using Bootstrap.DataAccess;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
using System.Web;
|
using System.Web;
|
||||||
using System.Web.Http;
|
using System.Web.Http;
|
||||||
|
|
||||||
|
@ -37,14 +38,27 @@ namespace Bootstrap.Admin.Controllers
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpPut]
|
[HttpPut]
|
||||||
public dynamic Put([FromBody]string fileName)
|
public string Put([FromBody]string fileName)
|
||||||
{
|
{
|
||||||
var logName = HttpContext.Current.Server.MapPath(string.Format("~/App_Data/ErrorLog/{0}.log", fileName));
|
var logName = HttpContext.Current.Server.MapPath(string.Format("~/App_Data/ErrorLog/{0}.log", fileName));
|
||||||
if (!File.Exists(logName)) return new { content = string.Empty };
|
if (!File.Exists(logName)) return "无此日志文件";
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
using (StreamReader reader = new StreamReader(logName))
|
using (StreamReader reader = new StreamReader(logName))
|
||||||
{
|
{
|
||||||
return new { content = reader.ReadToEnd().Replace("<", "<").Replace(">", ">").Replace("\r\n", "</br>") };
|
while (!reader.EndOfStream)
|
||||||
|
{
|
||||||
|
var line = reader.ReadLine().Replace("<", "<").Replace(">", ">");
|
||||||
|
if (line == "General Information ") sb.AppendFormat("<h4><b>{0}</b></h4>", line);
|
||||||
|
else if (line.StartsWith("TimeStamp:")) sb.AppendFormat("<div class='logTs'>{0}</div>", line);
|
||||||
|
else if (line.EndsWith("Exception Information")) sb.AppendFormat("<div class='logExcep'>{0}</div>", line);
|
||||||
|
else if (line.StartsWith("Message:")) sb.AppendFormat("<div class='logMsg'>{0}</div>", line);
|
||||||
|
else if (line.StartsWith("ErrorSql:")) sb.AppendFormat("<div class='logSql'>{0}</div>", line);
|
||||||
|
else if (line.StartsWith("Exception Type: Longbow.Data.DBAccessException")) sb.AppendFormat("<div class='logDbExcep'>{0}</div>", line);
|
||||||
|
else if (line.StartsWith("StackTrace Information")) sb.AppendFormat("<b>{0}</b><br>", line);
|
||||||
|
else sb.AppendFormat("{0}<br>", line);
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
return sb.ToString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,11 +11,11 @@ namespace Bootstrap.Admin.Models
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string OperateTimeStart { get; set; }
|
public DateTime StartTime { get; set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string OperateTimeEnd { get; set; }
|
public DateTime EndTime { get; set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -23,45 +23,35 @@ namespace Bootstrap.Admin.Models
|
||||||
public QueryData<Exceptions> RetrieveData()
|
public QueryData<Exceptions> RetrieveData()
|
||||||
{
|
{
|
||||||
var data = ExceptionHelper.RetrieveExceptions();
|
var data = ExceptionHelper.RetrieveExceptions();
|
||||||
|
if (StartTime > DateTime.MinValue)
|
||||||
if (!string.IsNullOrEmpty(OperateTimeStart))
|
{
|
||||||
{
|
data = data.Where(t => t.LogTime > StartTime);
|
||||||
DateTime opTimeStart = StringToDateTime(OperateTimeStart);
|
|
||||||
if (opTimeStart != null)
|
|
||||||
data = data.Where(t => IsSmallThen(opTimeStart, t.LogTime));
|
|
||||||
}
|
}
|
||||||
if (!string.IsNullOrEmpty(OperateTimeEnd))
|
if (EndTime > DateTime.MinValue)
|
||||||
{
|
{
|
||||||
DateTime opTimeEnd = StringToDateTime(OperateTimeEnd);
|
data = data.Where(t => t.LogTime < EndTime);
|
||||||
if (opTimeEnd != null)
|
|
||||||
data = data.Where(t => IsSmallThen(t.LogTime, opTimeEnd));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var ret = new QueryData<Exceptions>();
|
var ret = new QueryData<Exceptions>();
|
||||||
ret.total = data.Count();
|
ret.total = data.Count();
|
||||||
data = Order == "asc" ? data.OrderBy(t => t.AppDomainName) : data.OrderByDescending(t => t.AppDomainName);
|
switch (Sort)
|
||||||
|
{
|
||||||
|
case "ErrorPage":
|
||||||
|
data = Order == "asc" ? data.OrderBy(t => t.ErrorPage) : data.OrderByDescending(t => t.ErrorPage);
|
||||||
|
break;
|
||||||
|
case "UserID":
|
||||||
|
data = Order == "asc" ? data.OrderBy(t => t.UserID) : data.OrderByDescending(t => t.UserID);
|
||||||
|
break;
|
||||||
|
case "UserIp":
|
||||||
|
data = Order == "asc" ? data.OrderBy(t => t.UserIp) : data.OrderByDescending(t => t.UserIp);
|
||||||
|
break;
|
||||||
|
case "LogTime":
|
||||||
|
data = Order == "asc" ? data.OrderBy(t => t.LogTime) : data.OrderByDescending(t => t.LogTime);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
ret.rows = data.Skip(Offset).Take(Limit);
|
ret.rows = data.Skip(Offset).Take(Limit);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
private static DateTime StringToDateTime(string dt_str)
|
|
||||||
{
|
|
||||||
DateTime dt;
|
|
||||||
DateTimeFormatInfo dtFormat = new DateTimeFormatInfo();
|
|
||||||
dtFormat.ShortDatePattern = "yyyy-MM-dd HH:mm:ss";
|
|
||||||
dt = Convert.ToDateTime(dt_str, dtFormat);
|
|
||||||
return dt;
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// 比较两个DateTime
|
|
||||||
/// (去掉了毫秒)
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="d1"></param>
|
|
||||||
/// <param name="d2"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
private static bool IsSmallThen(DateTime d1, DateTime d2)
|
|
||||||
{
|
|
||||||
return new DateTime(d1.Year, d1.Month, d1.Day, d1.Hour, d1.Minute, d1.Second) <=
|
|
||||||
new DateTime(d2.Year, d2.Month, d2.Day, d2.Hour, d2.Minute, d2.Second);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
$(function () {
|
$(function () {
|
||||||
|
var url = '../api/Exceptions/';
|
||||||
var $dialog = $('#dialogNew');
|
var $dialog = $('#dialogNew');
|
||||||
var $dataForm = $('#dataForm');
|
var $dataForm = $('#dataForm');
|
||||||
var $dataFormDetail = $('#dataFormDetail');
|
var $dataFormDetail = $('#dataFormDetail');
|
||||||
|
@ -6,14 +7,20 @@
|
||||||
var $errorDetail = $('#errorDetail');
|
var $errorDetail = $('#errorDetail');
|
||||||
var $errorDetailTitle = $('#myDetailModalLabel');
|
var $errorDetailTitle = $('#myDetailModalLabel');
|
||||||
|
|
||||||
|
var bsa = new BootstrapAdmin({
|
||||||
|
url: url,
|
||||||
|
bootstrapTable: null,
|
||||||
|
validateForm: null
|
||||||
|
});
|
||||||
|
|
||||||
$('table').smartTable({
|
$('table').smartTable({
|
||||||
url: '../api/Exceptions',
|
url: url,
|
||||||
sortName: 'LogTime',
|
sortName: 'LogTime',
|
||||||
queryParams: function (params) { return $.extend(params, { OperateTimeStart: $("#txt_operate_start").val(), OperateTimeEnd: $("#txt_operate_end").val() }); },
|
queryParams: function (params) { return $.extend(params, { StartTime: $("#txt_operate_start").val(), EndTime: $("#txt_operate_end").val() }); },
|
||||||
columns: [{ checkbox: true },
|
columns: [{ checkbox: true },
|
||||||
{ title: "请求网址", field: "ErrorPage", sortable: false },
|
{ title: "请求网址", field: "ErrorPage", sortable: true },
|
||||||
{ title: "用户名", field: "UserID", sortable: false },
|
{ title: "用户名", field: "UserID", sortable: true },
|
||||||
{ title: "IP", field: "UserIp", sortable: false },
|
{ title: "IP", field: "UserIp", sortable: true },
|
||||||
{ title: "错误", field: "Message", sortable: false },
|
{ title: "错误", field: "Message", sortable: false },
|
||||||
{ title: "记录时间", field: "LogTime", sortable: true }
|
{ title: "记录时间", field: "LogTime", sortable: true }
|
||||||
]
|
]
|
||||||
|
@ -32,13 +39,13 @@
|
||||||
});
|
});
|
||||||
|
|
||||||
$dialog.on('click', 'a', function () {
|
$dialog.on('click', 'a', function () {
|
||||||
var fileName = $(this).text();
|
var fileName = $(this).find('span').text();
|
||||||
$errorDetailTitle.text(fileName);
|
$errorDetailTitle.text(fileName);
|
||||||
$errorList.hide();
|
$errorList.hide();
|
||||||
$errorDetail.show();
|
$errorDetail.show();
|
||||||
$dataFormDetail.html('<div class="text-center"><i class="fa fa-spinner fa-pulse fa-3x fa-fw"></i></div>');
|
$dataFormDetail.html('<div class="text-center"><i class="fa fa-spinner fa-pulse fa-3x fa-fw"></i></div>');
|
||||||
Exceptions.getFileByName(fileName, function (data) {
|
Exceptions.getFileByName(fileName, function (data) {
|
||||||
$dataFormDetail.html(data.content);
|
$dataFormDetail.html(data);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
<div class="form-group col-xs-12 col-sm-6 col-md-5 col-lg-5">
|
<div class="form-group col-xs-12 col-sm-6 col-md-5 col-lg-5">
|
||||||
<label class="control-label" for="txt_operate_end">终止时间</label>
|
<label class="control-label" for="txt_operate_end">终止时间</label>
|
||||||
<div class="input-group input-append date form_datetime">
|
<div class="input-group input-append date form_datetime">
|
||||||
<input type="datetime" class="form-control" id="txt_operate_start" />
|
<input type="datetime" class="form-control" id="txt_operate_end" />
|
||||||
<span class="input-group-btn">
|
<span class="input-group-btn">
|
||||||
<button class="btn btn-default" type="button"><i class="fa fa-calendar" aria-hidden="true"></i></button>
|
<button class="btn btn-default" type="button"><i class="fa fa-calendar" aria-hidden="true"></i></button>
|
||||||
</span>
|
</span>
|
||||||
|
|
Loading…
Reference in New Issue