From 575adc78aa06ead4b6c63c0e36cf97758cea6b8f Mon Sep 17 00:00:00 2001 From: Argo-MacBookPro Date: Fri, 2 Nov 2018 18:31:32 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BB=A3=E7=A0=81=EF=BC=9A?= =?UTF-8?q?=E9=87=8D=E5=86=99Exceptions=E8=A1=A8=E7=9B=B8=E5=85=B3SQL?= =?UTF-8?q?=E8=AF=AD=E5=8F=A5=EF=BC=8C=E5=AD=90=E7=B1=BB=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=8D=B3=E5=8F=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Bootstrap.DataAccess.MySQL/Exceptions.cs | 86 +------------------- Bootstrap.DataAccess.SQLite/Exceptions.cs | 86 +------------------- Bootstrap.DataAccess/Exceptions.cs | 12 ++- UnitTest/ExceptionsTest.cs | 98 +++++++++++++++++++++++ UnitTest/StaticMethods.cs | 23 ++++++ UnitTest/UnitTest.csproj | 18 ++++- UnitTest/UnitTest1.cs | 1 - 7 files changed, 150 insertions(+), 174 deletions(-) create mode 100644 UnitTest/ExceptionsTest.cs create mode 100644 UnitTest/StaticMethods.cs diff --git a/Bootstrap.DataAccess.MySQL/Exceptions.cs b/Bootstrap.DataAccess.MySQL/Exceptions.cs index 5f6ee09c..140d6b5b 100644 --- a/Bootstrap.DataAccess.MySQL/Exceptions.cs +++ b/Bootstrap.DataAccess.MySQL/Exceptions.cs @@ -1,92 +1,10 @@ -using Longbow; -using Longbow.Configuration; -using Longbow.Data; -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Data; -using System.Data.Common; - -namespace Bootstrap.DataAccess.MySQL +namespace Bootstrap.DataAccess.MySQL { /// /// /// public class Exceptions : DataAccess.Exceptions { - /// - /// - /// - private static void ClearExceptions() - { - System.Threading.Tasks.Task.Run(() => - { - string sql = $"delete from Exceptions where LogTime < date_add(now(), interval -{ConfigurationManager.AppSettings["KeepExceptionsPeriod"]} month)"; - DbCommand cmd = DbAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); - DbAccessManager.DBAccess.ExecuteNonQuery(cmd); - }); - } - /// - /// - /// - /// - /// - /// - public override bool Log(Exception ex, NameValueCollection additionalInfo) - { - if (additionalInfo == null) - { - additionalInfo = new NameValueCollection - { - ["UserId"] = null, - ["UserIp"] = null, - ["ErrorPage"] = null - }; - } - var errorPage = additionalInfo["ErrorPage"] ?? ex.GetType().Name; - var sql = "insert into Exceptions (AppDomainName, ErrorPage, UserID, UserIp, ExceptionType, Message, StackTrace, LogTime) values (@AppDomainName, @ErrorPage, @UserID, @UserIp, @ExceptionType, @Message, @StackTrace, now())"; - using (DbCommand cmd = DbAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) - { - cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@AppDomainName", AppDomain.CurrentDomain.FriendlyName)); - cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@ErrorPage", errorPage)); - cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@UserID", DbAdapterManager.ToDBValue(additionalInfo["UserId"]))); - cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@UserIp", DbAdapterManager.ToDBValue(additionalInfo["UserIp"]))); - cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@ExceptionType", ex.GetType().FullName)); - cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@Message", ex.Message)); - cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@StackTrace", DbAdapterManager.ToDBValue(ex.StackTrace))); - DbAccessManager.DBAccess.ExecuteNonQuery(cmd); - ClearExceptions(); - } - return true; - } - /// - /// 查询一周内所有异常 - /// - /// - public override IEnumerable RetrieveExceptions() - { - string sql = "select * from Exceptions where LogTime > date_add(now(), interval -7 day) order by LogTime desc"; - List exceptions = new List(); - DbCommand cmd = DbAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); - using (DbDataReader reader = DbAccessManager.DBAccess.ExecuteReader(cmd)) - { - while (reader.Read()) - { - exceptions.Add(new DataAccess.Exceptions() - { - Id = reader[0].ToString(), - AppDomainName = (string)reader[1], - ErrorPage = reader.IsDBNull(2) ? string.Empty : (string)reader[2], - UserId = reader.IsDBNull(3) ? string.Empty : (string)reader[3], - UserIp = reader.IsDBNull(4) ? string.Empty : (string)reader[4], - ExceptionType = (string)reader[5], - Message = (string)reader[6], - StackTrace = (string)reader[7], - LogTime = LgbConvert.ReadValue(reader[8], DateTime.MinValue) - }); - } - } - return exceptions; - } + } } diff --git a/Bootstrap.DataAccess.SQLite/Exceptions.cs b/Bootstrap.DataAccess.SQLite/Exceptions.cs index ffeab6fe..896aed3f 100644 --- a/Bootstrap.DataAccess.SQLite/Exceptions.cs +++ b/Bootstrap.DataAccess.SQLite/Exceptions.cs @@ -1,92 +1,10 @@ -using Longbow; -using Longbow.Configuration; -using Longbow.Data; -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Data; -using System.Data.Common; - -namespace Bootstrap.DataAccess.SQLite +namespace Bootstrap.DataAccess.SQLite { /// /// /// public class Exceptions : DataAccess.Exceptions { - /// - /// - /// - private static void ClearExceptions() - { - System.Threading.Tasks.Task.Run(() => - { - string sql = $"delete from Exceptions where LogTime < datetime('now', 'localtime', '-{ConfigurationManager.AppSettings["KeepExceptionsPeriod"]} month')"; - DbCommand cmd = DbAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); - DbAccessManager.DBAccess.ExecuteNonQuery(cmd); - }); - } - /// - /// - /// - /// - /// - /// - public override bool Log(Exception ex, NameValueCollection additionalInfo) - { - if (additionalInfo == null) - { - additionalInfo = new NameValueCollection - { - ["UserId"] = null, - ["UserIp"] = null, - ["ErrorPage"] = null - }; - } - var errorPage = additionalInfo["ErrorPage"] ?? ex.GetType().Name; - var sql = "insert into Exceptions (AppDomainName, ErrorPage, UserID, UserIp, ExceptionType, Message, StackTrace, LogTime) values (@AppDomainName, @ErrorPage, @UserID, @UserIp, @ExceptionType, @Message, @StackTrace, datetime('now', 'localtime'))"; - using (DbCommand cmd = DbAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) - { - cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@AppDomainName", AppDomain.CurrentDomain.FriendlyName)); - cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@ErrorPage", errorPage)); - cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@UserID", DbAdapterManager.ToDBValue(additionalInfo["UserId"]))); - cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@UserIp", DbAdapterManager.ToDBValue(additionalInfo["UserIp"]))); - cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@ExceptionType", ex.GetType().FullName)); - cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@Message", ex.Message)); - cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@StackTrace", DbAdapterManager.ToDBValue(ex.StackTrace))); - DbAccessManager.DBAccess.ExecuteNonQuery(cmd); - ClearExceptions(); - } - return true; - } - /// - /// 查询一周内所有异常 - /// - /// - public override IEnumerable RetrieveExceptions() - { - string sql = "select * from Exceptions where LogTime > datetime('now', 'localtime', '-7 day') order by LogTime desc"; - List exceptions = new List(); - DbCommand cmd = DbAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); - using (DbDataReader reader = DbAccessManager.DBAccess.ExecuteReader(cmd)) - { - while (reader.Read()) - { - exceptions.Add(new DataAccess.Exceptions() - { - Id = reader[0].ToString(), - AppDomainName = (string)reader[1], - ErrorPage = reader.IsDBNull(2) ? string.Empty : (string)reader[2], - UserId = reader.IsDBNull(3) ? string.Empty : (string)reader[3], - UserIp = reader.IsDBNull(4) ? string.Empty : (string)reader[4], - ExceptionType = (string)reader[5], - Message = (string)reader[6], - StackTrace = (string)reader[7], - LogTime = LgbConvert.ReadValue(reader[8], DateTime.MinValue) - }); - } - } - return exceptions; - } + } } diff --git a/Bootstrap.DataAccess/Exceptions.cs b/Bootstrap.DataAccess/Exceptions.cs index ffafaec0..f7cdf032 100644 --- a/Bootstrap.DataAccess/Exceptions.cs +++ b/Bootstrap.DataAccess/Exceptions.cs @@ -1,4 +1,5 @@ -using Longbow.Configuration; +using Longbow; +using Longbow.Configuration; using Longbow.Data; using System; using System.Collections.Generic; @@ -58,8 +59,9 @@ namespace Bootstrap.DataAccess { System.Threading.Tasks.Task.Run(() => { - string sql = $"delete from Exceptions where LogTime < DATEADD(MONTH, -{ConfigurationManager.AppSettings["KeepExceptionsPeriod"]}, GETDATE())"; + string sql = $"delete from Exceptions where LogTime < @LogTime"; DbCommand cmd = DbAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@LogTime", DateTime.Now.AddMonths(0 - LgbConvert.ReadValue(ConfigurationManager.AppSettings["KeepExceptionsPeriod"], 1)), DbType.DateTime)); DbAccessManager.DBAccess.ExecuteNonQuery(cmd); }); } @@ -82,7 +84,7 @@ namespace Bootstrap.DataAccess }; } var errorPage = additionalInfo["ErrorPage"] ?? (ex.GetType().Name.Length > 50 ? ex.GetType().Name.Substring(0, 50) : ex.GetType().Name); - var sql = "insert into Exceptions (AppDomainName, ErrorPage, UserID, UserIp, ExceptionType, Message, StackTrace, LogTime) values (@AppDomainName, @ErrorPage, @UserID, @UserIp, @ExceptionType, @Message, @StackTrace, GetDate())"; + var sql = "insert into Exceptions (AppDomainName, ErrorPage, UserID, UserIp, ExceptionType, Message, StackTrace, LogTime) values (@AppDomainName, @ErrorPage, @UserID, @UserIp, @ExceptionType, @Message, @StackTrace, @LogTime)"; using (DbCommand cmd = DbAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) { cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@AppDomainName", AppDomain.CurrentDomain.FriendlyName)); @@ -92,6 +94,7 @@ namespace Bootstrap.DataAccess cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@ExceptionType", ex.GetType().FullName)); cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@Message", ex.Message)); cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@StackTrace", DbAdapterManager.ToDBValue(ex.StackTrace))); + cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@LogTime", DateTime.Now, DbType.DateTime)); DbAccessManager.DBAccess.ExecuteNonQuery(cmd); ClearExceptions(); } @@ -103,9 +106,10 @@ namespace Bootstrap.DataAccess /// public virtual IEnumerable RetrieveExceptions() { - string sql = "select * from Exceptions where DATEDIFF(Week, LogTime, GETDATE()) = 0 order by LogTime desc"; + string sql = "select * from Exceptions where LogTime > @LogTime order by LogTime desc"; List exceptions = new List(); DbCommand cmd = DbAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@LogTime", DateTime.Now.AddDays(-7), DbType.DateTime)); using (DbDataReader reader = DbAccessManager.DBAccess.ExecuteReader(cmd)) { while (reader.Read()) diff --git a/UnitTest/ExceptionsTest.cs b/UnitTest/ExceptionsTest.cs new file mode 100644 index 00000000..0ed55f11 --- /dev/null +++ b/UnitTest/ExceptionsTest.cs @@ -0,0 +1,98 @@ +using Bootstrap.DataAccess; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace UnitTest +{ + public class ExceptionsTest + { + [Fact] + public void RetrieveExceptions_Array() + { + var config = new ConfigurationBuilder() + .SetBasePath(AppContext.BaseDirectory) + .AddInMemoryCollection(new List>() { + new KeyValuePair("DB:0:Enabled", "true"), + new KeyValuePair("DB:0:Widget", "Bootstrap.DataAccess"), + new KeyValuePair("DB:0:ConnectionStrings:ba", "Data Source=.;Initial Catalog=BootstrapAdmin;User ID=sa;Password=sa") + }) + .Build(); + + new ServiceCollection() + .AddSingleton(config) + .AddConfigurationManager(config) + .AddDbAdapter(config); + + Exceptions excep = new Exceptions(); + var result = excep.RetrieveExceptions(); + var num = result.Count(); + + Assert.True(num >= 0); + } + + [Fact] + public void RetrieveExceptions_SQLite_Array() + { + var config = new ConfigurationBuilder() + .SetBasePath(AppContext.BaseDirectory) + .AddInMemoryCollection(new List>() { + new KeyValuePair("DB:0:Enabled", "true"), + new KeyValuePair("DB:0:Widget", "Bootstrap.DataAccess.SQLite"), + new KeyValuePair("DB:0:DBProviderFactory", "Microsoft.Data.Sqlite.SqliteFactory, Microsoft.Data.Sqlite"), + new KeyValuePair("DB:0:ConnectionStrings:ba", "Data Source=BootstrapAdmin.db;") + }) + .Build(); + + new ServiceCollection() + .AddSingleton(config) + .AddConfigurationManager(config) + .AddDbAdapter(config); + + Exceptions excep = new Exceptions(); + var result = excep.RetrieveExceptions(); + var num = result.Count(); + + Assert.True(num >= 0); + } + + [Fact] + public void RetrieveExceptions_MySQL_Array() + { + var config = new ConfigurationBuilder() + .SetBasePath(AppContext.BaseDirectory) + .AddInMemoryCollection(new List>() { + new KeyValuePair("DB:0:Enabled", "true"), + new KeyValuePair("DB:0:Widget", "Bootstrap.DataAccess.MySQL"), + new KeyValuePair("DB:0:DBProviderFactory", "MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data"), + new KeyValuePair("DB:0:ConnectionStrings:ba", "Server=10.211.55.2;Database=BA;Uid=argozhang;Pwd=argo@163.com;SslMode=none;") + }) + .Build(); + + new ServiceCollection() + .AddSingleton(config) + .AddConfigurationManager(config) + .AddDbAdapter(config); + + Exceptions excep = new Exceptions(); + var result = excep.RetrieveExceptions(); + var num = result.Count(); + + Assert.True(num >= 0); + } + + [Fact] + public async void ClearExceptions_Void() + { + StaticMethods.Setup(); + Exceptions excep = new Exceptions(); + + var method = excep.GetType().GetMethod("ClearExceptions", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static); + method.Invoke(excep, null); + await System.Threading.Tasks.Task.Delay(1000); + } + } +} diff --git a/UnitTest/StaticMethods.cs b/UnitTest/StaticMethods.cs new file mode 100644 index 00000000..a2c457d5 --- /dev/null +++ b/UnitTest/StaticMethods.cs @@ -0,0 +1,23 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using System; + +namespace UnitTest +{ + internal static class StaticMethods + { + public static void Setup() + { + var config = new ConfigurationBuilder() + .SetBasePath(AppContext.BaseDirectory) + .AddJsonFile("appsettings.json", true, true) + .AddJsonFile("appsettings.Development.json", true, true) + .Build(); + + new ServiceCollection() + .AddSingleton(config) + .AddConfigurationManager(config) + .AddDbAdapter(config); + } + } +} diff --git a/UnitTest/UnitTest.csproj b/UnitTest/UnitTest.csproj index 5502219c..0af62409 100644 --- a/UnitTest/UnitTest.csproj +++ b/UnitTest/UnitTest.csproj @@ -2,7 +2,7 @@ netcoreapp2.1 - + true false @@ -10,6 +10,15 @@ + + + Always + + + Always + + + @@ -21,4 +30,11 @@ + + + + + + + diff --git a/UnitTest/UnitTest1.cs b/UnitTest/UnitTest1.cs index 220daad0..a239d751 100644 --- a/UnitTest/UnitTest1.cs +++ b/UnitTest/UnitTest1.cs @@ -13,7 +13,6 @@ namespace UnitTest { var server = new TestServer(WebHost.CreateDefaultBuilder() .UseStartup()); - } } }