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 model) { using var db = new LogDbContext(); var query = db.Set().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 { 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 list) { if (list == null) { throw new ArgumentNullException(nameof(list)); } try { using var db = new LogDbContext(); var query = db.Set(); 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().HasKey(o => o.Id); } } }