add sqlite log

Former-commit-id: ff1d6bb0bfb3220bcb85008ccb33b91b80f69c48
Former-commit-id: 4d3f29a246015ec31bed1be0fd58dbb4b9b70cb2
1.0
wanggang 4 years ago
parent 51cbfeaef1
commit d40cc649aa

@ -5,7 +5,6 @@ namespace Infrastructure.Email
{
public class EmailSender : IEmailSender
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Security", "CA5359:请勿禁用证书验证", Justification = "<挂起>")]
public void SendMail(string name,
string from,
string to,

@ -18,8 +18,7 @@ namespace Infrastructure.Extensions
public static string MemberName<T, V>(this Expression<Func<T, V>> expression)
{
var memberExpression = expression.Body as MemberExpression;
if (memberExpression == null)
if (expression.Body is not MemberExpression memberExpression)
throw new InvalidOperationException("Expression must be a member expression");
return memberExpression.Member.Name;

@ -10,35 +10,35 @@
<ItemGroup>
<PackageReference Include="Jint" Version="2.11.58" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="5.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="4.2.0" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.MessagePack" Version="5.0.1" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" Version="5.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="5.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="5.0.4" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="5.0.0" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.MessagePack" Version="5.0.4" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" Version="5.0.4" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="5.0.4" />
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="5.0.1" />
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="5.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="5.0.1" />
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="5.0.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="5.0.4" />
<PackageReference Include="Microsoft.AspNetCore.SignalR" Version="1.1.0" />
<PackageReference Include="Microsoft.Extensions.Localization" Version="5.0.1" />
<PackageReference Include="NJsonSchema" Version="10.3.2" />
<PackageReference Include="System.ServiceModel.Http" Version="4.8.0" />
<PackageReference Include="System.ServiceModel.Primitives" Version="4.8.0" />
<PackageReference Include="Microsoft.Extensions.Localization" Version="5.0.4" />
<PackageReference Include="NJsonSchema" Version="10.3.11" />
<PackageReference Include="System.ServiceModel.Http" Version="4.8.1" />
<PackageReference Include="System.ServiceModel.Primitives" Version="4.8.1" />
<PackageReference Include="Minio" Version="3.1.13" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="5.0.1" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="5.0.2" />
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="5.0.0-alpha.2" />
<PackageReference Include="DotNetCore.NPOI" Version="1.2.3" />
<PackageReference Include="HtmlAgilityPack.NetCore" Version="1.5.0.1" />
<PackageReference Include="MailKit" Version="2.10.0" />
<PackageReference Include="MailKit" Version="2.10.1" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="Serilog.AspNetCore" Version="3.4.0" />
<PackageReference Include="Serilog.AspNetCore" Version="4.0.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="3.1.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" />
<PackageReference Include="Serilog.Sinks.File" Version="4.1.0" />
<PackageReference Include="Serilog.Sinks.InfluxDB.Standard" Version="1.0.5" />
<PackageReference Include="Serilog.Sinks.RollingFile" Version="3.3.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.6.3" />
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="5.6.3" />
<PackageReference Include="System.Drawing.Common" Version="5.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.1.0" />
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="6.1.0" />
<PackageReference Include="System.Drawing.Common" Version="5.0.2" />
<PackageReference Include="System.Management" Version="5.0.0" />
<PackageReference Include="ValueInjecter" Version="3.2.0" />
<PackageReference Include="Flurl" Version="3.0.1" />

@ -38,9 +38,7 @@ namespace Infrastructure.Sms
{
try
{
#pragma warning disable CA2000 // 丢失范围之前释放对象
var client = this._httpClientFactory.CreateClient();
#pragma warning restore CA2000 // 丢失范围之前释放对象
var formData = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("AppKey", this._appKey),
@ -50,9 +48,7 @@ namespace Infrastructure.Sms
formData.Add(new KeyValuePair<string, string>("CurTime", seconds));
var sumValue = string.Format(CultureInfo.InvariantCulture, "{0}{1}{2}", this._appSecret, formData[1].Value, formData[2].Value);
var sumBytes = Encoding.UTF8.GetBytes(sumValue);
#pragma warning disable CA5350 // 不要使用弱加密算法
using var sha1 = SHA1.Create();
#pragma warning restore CA5350 // 不要使用弱加密算法
var sumHash = sha1.ComputeHash(sumBytes);
var hashValue = string.Empty;
var builder = new StringBuilder();

@ -279,7 +279,6 @@ namespace Infrastructure.Web
{
if (!context.Request.IsAjax())
{
var basePath = this.Configuration.GetAppSetting("BasePath");
var linkGenerator = context.HttpContext.RequestServices.GetRequiredService<LinkGenerator>();
var url = linkGenerator.GetPathByAction("Login","Account",pathBase:context.HttpContext.Request.PathBase);
context.Response.Redirect(url);

@ -7,11 +7,11 @@
<Version>1.1.0.0</Version>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="5.0.1" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="5.0.1" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client.Core" Version="5.0.1" />
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="5.0.4" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="5.0.4" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client.Core" Version="5.0.4" />
<PackageReference Include="Microsoft.OpenApi.Readers" Version="1.2.3" />
<PackageReference Include="System.IO.Ports" Version="5.0.0" />
<PackageReference Include="System.IO.Ports" Version="5.0.1" />
<PackageReference Include="Vibrant.InfluxDB.Client" Version="4.0.4" />
<PackageReference Include="UoN.ExpressiveAnnotations.NetCore" Version="1.0.0" />
</ItemGroup>

@ -7,7 +7,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Kveer.XmlRPC" Version="1.1.1" />
<PackageReference Include="Serilog.AspNetCore" Version="3.4.0" />
<PackageReference Include="Serilog.AspNetCore" Version="4.0.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="3.1.0" />
<PackageReference Include="Serilog.Sinks.File" Version="4.1.0" />
</ItemGroup>

@ -13,7 +13,7 @@
<EmbeddedResource Include="wwwroot\js\site.js" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="5.0.1" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="5.0.4" />
<PackageReference Include="Kveer.XmlRPC" Version="1.1.1" />
</ItemGroup>
<ItemGroup>

@ -0,0 +1,114 @@
using Infrastructure.Application;
using Infrastructure.Extensions;
using Infrastructure.Web;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Serilog.Events;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
namespace Platform.Controllers
{
public class LogController : BaseController
{
public IActionResult Index(PagedListModel<Logs> model)
{
using var db = new LogDbContext();
var query = db.Set<Logs>().AsNoTracking()
.WhereIf(!string.IsNullOrEmpty(model.Query.Level), o => o.Level == model.Query.Level)
.WhereIf(!string.IsNullOrEmpty(model.Query.RenderedMessage), o => o.RenderedMessage.Contains(model.Query.RenderedMessage.Trim()))
.WhereIf(!string.IsNullOrEmpty(model.Query.Exception), o => o.Exception.Contains(model.Query.Exception.Trim()))
.WhereIf(!string.IsNullOrEmpty(model.Query.Properties), o => o.Properties.Contains(model.Query.Properties.Trim()));
model.TotalCount = query.Count();
var list = query
.Skip((model.PageIndex - 1) * model.PageSize)
.Take(model.PageSize)
.ToList();
model.List.AddRange(list);
var levels = new List<string> {
nameof(LogEventLevel.Verbose),
nameof(LogEventLevel.Debug),
nameof(LogEventLevel.Information),
nameof(LogEventLevel.Warning),
nameof(LogEventLevel.Error),
nameof(LogEventLevel.Fatal)
};
ViewData.SelectList(o => model.Query.Level, () => new SelectList(levels, model.Query.Level));
return View(model);
}
[HttpPost]
public virtual IActionResult Delete(List<int> list)
{
if (list == null)
{
throw new ArgumentNullException(nameof(list));
}
try
{
using var db = new LogDbContext();
var query = db.Set<Logs>();
foreach (var id in list)
{
var entity = query.FirstOrDefault(o => o.Id == id);
query.Remove(entity);
}
db.SaveChanges();
return RedirectTo();
}
catch (Exception ex)
{
ex.PrintStack();
return RedirectTo(rawMesage:ex.Message);
}
}
}
public class Logs
{
[Display(Name = "主键")]
public int Id { get; set; }
[Display(Name ="时间")]
[DataType(DataType.DateTime)]
public DateTime? Timestamp { get; set; }
[Display(Name = "等级")]
[SelectList]
public string Level { get; set; }
[Display(Name = "异常")]
public string Exception { get; set; }
[Display(Name = "消息")]
public string RenderedMessage { get; set; }
[Display(Name = "属性")]
public string Properties { get; set; }
}
internal class LogDbContext : DbContext
{
public static readonly ILoggerFactory MyLoggerFactory = LoggerFactory.Create(builder =>
{
builder.AddDebug();
builder.AddConsole();
});
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite("Data Source=log.db");
optionsBuilder?.UseLoggerFactory(MyLoggerFactory);
optionsBuilder?.EnableSensitiveDataLogging();
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Logs>().HasKey(o => o.Id);
}
}
}

@ -10,6 +10,7 @@
<PackageReference Include="Hangfire.AspNetCore" Version="1.7.18" />
<PackageReference Include="Hangfire.MySqlStorage" Version="2.0.3" />
<PackageReference Include="Hangfire.Storage.SQLite" Version="0.2.4" />
<PackageReference Include="Serilog.Sinks.SQLite" Version="5.0.0" />
<PackageReference Include="sqlite-net-pcl" Version="1.7.335" />
<PackageReference Include="Microsoft.ReverseProxy" Version="1.0.0-preview.7.20562.2" />
</ItemGroup>

@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Serilog;
using Serilog.Settings.Configuration;
using System;
using System.IO;
using System.Text;
@ -15,20 +16,41 @@ namespace Platform
public static void Main(string[] args)
{
Console.OutputEncoding = Encoding.UTF8;
var config = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true)
.Build();
WebHost.CreateDefaultBuilder(args)
var logConfig = new LoggerConfiguration()
.ReadFrom.Configuration(config, ConfigurationAssemblySource.AlwaysScanDllFiles)
.WriteTo.Console();
logConfig = config.GetSection("AppSetting").GetValue("Log", "File") == "File"
? logConfig.WriteTo.File("logs/log.txt", rollOnFileSizeLimit: true, fileSizeLimitBytes: 100 * 1024 * 1024, rollingInterval: RollingInterval.Infinite)
: logConfig.WriteTo.SQLite(Path.Combine(Directory.GetCurrentDirectory(), "log.db"));
Log.Logger = logConfig.CreateLogger();
try
{
Log.Information("web host start");
WebHost.CreateDefaultBuilder(args)
.UseConfiguration(config)
.ConfigureLogging((c, o) =>
{
Log.Logger = new LoggerConfiguration().WriteTo.Console().CreateLogger();
o.AddSerilog();
Log.Logger.Information(string.IsNullOrEmpty(config["docker"]) ? "start..." : "docker...");
})
.UseSerilog()
.UseStartup<Startup>()
.Build()
.Run();
Log.Information("web host end");
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly");
return;
}
finally
{
Log.CloseAndFlush();
}
}
}
}

@ -0,0 +1,91 @@
@model PagedListModel<Platform.Controllers.Logs>
@{
var start = 0;
}
<form action="@Url.Action(null,null)" method="get" class="form-horizontal query">
<div class="card">
<div class="card-header">
<div class="row">
<div class="col-12 col-sm-6 col-md-4 col-lg-3">
<div class="form-group row">
<label class="col-sm-3 col-form-label" style="text-align:right;overflow:hidden;">等级:</label>
<div class="col-sm-9">
@Html.EditorFor(o => o.Query.Level)
</div>
</div>
</div>
<div class="col-12 col-sm-6 col-md-4 col-lg-3">
<div class="form-group row">
<label class="col-sm-3 col-form-label" style="text-align:right;overflow:hidden;">消息:</label>
<div class="col-sm-9">
@Html.EditorFor(o => o.Query.RenderedMessage)
</div>
</div>
</div>
<div class="col-12 col-sm-6 col-md-4 col-lg-3">
<div class="form-group row">
<label class="col-sm-3 col-form-label" style="text-align:right;overflow:hidden;">异常:</label>
<div class="col-sm-9">
@Html.EditorFor(o => o.Query.Exception)
</div>
</div>
</div>
<div class="col-12 col-sm-6 col-md-4 col-lg-3">
<div class="form-group row">
<label class="col-sm-3 col-form-label" style="text-align:right;overflow:hidden;">属性:</label>
<div class="col-sm-9">
@Html.EditorFor(o => o.Query.Properties)
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-12 col-sm-6 col-md-4 col-lg-3">
<div class="form-group row">
<div class="col-sm-3"></div>
<div class="col-sm-9">
<button type="submit" class="action query btn btn-primary cancel" data-action="@Url.Action(null,null)">
查询
</button>
<button type="submit" class="action confirm btn btn-danger" data-action="@Url.Action("Delete")">
删除
</button>
</div>
</div>
</div>
</div>
</div>
<div class="card-body" style="overflow-x:auto;">
<table class="table table-hover text-nowrap table-bordered dataTable dtr-inline projects">
<tr>
<th><input type="checkbox" class="select_all" /></th>
<th>行号</th>
<th>Id</th>
<th>Timestamp</th>
<th>Level</th>
<th>Exception</th>
<th>RenderedMessage</th>
<th>Properties</th>
</tr>
@foreach (var item in Model.List)
{
<tr>
<td title="@item.Id">
<input type="checkbox" name="list[]" value="@item.Id" />
</td>
<td>@(++start)</td>
<td>@item.Id</td>
<td>@item.Timestamp</td>
<td>@item.Level</td>
<td>@item.Exception
<td>@item.RenderedMessage</td>
<td>@item.Properties</td>
</tr>
}
</table>
</div>
<div class="card-footer clearfix">
@(await Html.PartialAsync("_Paged"))
</div>
</div>
</form>

@ -14,9 +14,10 @@
"BasePath": "/platform",
"TablePrefix": "",
"Database": "MySQL",
"JobDatabase": "MySQL",
"Log": "SQLite",
"FileServer": "MinIO",
"Cache": "Redis",
"JobDatabase": "MySQL",
"sms": "url=https://api.netease.im/sms/sendcode.action;key=54ebdf1f4364ddd8ff6f82f88d630a76;secret=c49d42b67798@"
},
"ConnectionStrings": {

@ -6,6 +6,6 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.SpaServices.Extensions" Version="5.0.1" />
<PackageReference Include="Microsoft.AspNetCore.SpaServices.Extensions" Version="5.0.4" />
</ItemGroup>
</Project>

@ -6,6 +6,6 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.SpaServices.Extensions" Version="5.0.1" />
<PackageReference Include="Microsoft.AspNetCore.SpaServices.Extensions" Version="5.0.4" />
</ItemGroup>
</Project>
Loading…
Cancel
Save