2019-03-18 17:49:28 +08:00
using Longbow.Web.Mvc ;
using PetaPoco ;
using System ;
using System.Collections.Generic ;
using System.Collections.Specialized ;
2019-05-01 16:46:24 +08:00
using System.Data.Common ;
2019-03-18 17:49:28 +08:00
namespace Bootstrap.DataAccess
{
/// <summary>
///
/// </summary>
public class Exceptions
{
/// <summary>
///
/// </summary>
public string Id { get ; set ; }
/// <summary>
///
/// </summary>
public string AppDomainName { get ; set ; }
/// <summary>
///
/// </summary>
public string ErrorPage { get ; set ; }
/// <summary>
///
/// </summary>
public string UserId { get ; set ; }
/// <summary>
///
/// </summary>
public string UserIp { get ; set ; }
/// <summary>
///
/// </summary>
public string ExceptionType { get ; set ; }
/// <summary>
///
/// </summary>
public string Message { get ; set ; }
/// <summary>
///
/// </summary>
public string StackTrace { get ; set ; }
/// <summary>
///
/// </summary>
public DateTime LogTime { get ; set ; }
/// <summary>
/// 获得/设置 时间描述 2分钟内为刚刚
/// </summary>
public string Period { get ; set ; }
2019-05-01 16:46:24 +08:00
/// <summary>
///
2019-04-16 17:58:46 +08:00
/// </summary>
public string Category { get ; set ; }
2019-03-18 17:49:28 +08:00
private static void ClearExceptions ( ) = > System . Threading . Tasks . Task . Run ( ( ) = >
{
DbManager . Create ( ) . Execute ( "delete from Exceptions where LogTime < @0" , DateTime . Now . AddMonths ( 0 - DictHelper . RetrieveExceptionsLogPeriod ( ) ) ) ;
} ) ;
/// <summary>
///
/// </summary>
/// <param name="ex"></param>
/// <param name="additionalInfo"></param>
/// <returns></returns>
public virtual bool Log ( Exception ex , NameValueCollection additionalInfo )
{
if ( ex = = null ) return true ;
2019-05-01 16:46:24 +08:00
var errorPage = additionalInfo ? [ "ErrorPage" ] ? ? ( ex . GetType ( ) . Name . Length > 50 ? ex . GetType ( ) . Name . Substring ( 0 , 50 ) : ex . GetType ( ) . Name ) ;
var loopEx = ex ;
var category = "App" ;
while ( loopEx ! = null )
{
if ( typeof ( DbException ) . IsAssignableFrom ( loopEx . GetType ( ) ) )
{
category = "DB" ;
break ;
}
loopEx = loopEx . InnerException ;
2019-04-16 17:58:46 +08:00
}
2019-03-18 17:49:28 +08:00
DbManager . Create ( ) . Insert ( new Exceptions
{
AppDomainName = AppDomain . CurrentDomain . FriendlyName ,
ErrorPage = errorPage ,
UserId = additionalInfo ? [ "UserId" ] ,
UserIp = additionalInfo ? [ "UserIp" ] ,
ExceptionType = ex . GetType ( ) . FullName ,
Message = ex . Message ,
StackTrace = ex . StackTrace ,
2019-04-16 17:58:46 +08:00
LogTime = DateTime . Now ,
Category = category
2019-03-18 17:49:28 +08:00
} ) ;
ClearExceptions ( ) ;
return true ;
}
/// <summary>
/// 查询一周内所有异常
/// </summary>
/// <returns></returns>
public virtual IEnumerable < Exceptions > Retrieves ( ) = > DbManager . Create ( ) . Fetch < Exceptions > ( "select * from Exceptions where LogTime > @0 order by LogTime desc" , DateTime . Now . AddMonths ( 0 - DictHelper . RetrieveExceptionsLogPeriod ( ) ) ) ;
/// <summary>
///
/// </summary>
/// <param name="po"></param>
/// <param name="startTime"></param>
/// <param name="endTime"></param>
/// <returns></returns>
public virtual Page < Exceptions > RetrievePages ( PaginationOption po , DateTime ? startTime , DateTime ? endTime )
{
var sql = new Sql ( "select * from Exceptions" ) ;
if ( startTime . HasValue ) sql . Append ( "where LogTime > @0" , startTime . Value ) ;
if ( endTime . HasValue ) sql . Append ( "where LogTime < @0" , endTime . Value . AddDays ( 1 ) . AddSeconds ( - 1 ) ) ;
if ( startTime = = null & & endTime = = null ) sql . Append ( "where LogTime > @0" , DateTime . Today . AddMonths ( 0 - DictHelper . RetrieveExceptionsLogPeriod ( ) ) ) ;
sql . Append ( $"order by {po.Sort} {po.Order}" ) ;
return DbManager . Create ( ) . Page < Exceptions > ( po . PageIndex , po . Limit , sql ) ;
}
}
}