/// <summary> /// add log service provider to service container /// </summary> /// <param name="services">Service container</param> /// <param name="dbLogConnection">connection string to db log</param> public static void AddDbLog(this IServiceCollection services, string dbLogConnection) { using var localizedDbContext = new DbLogDbContext(new DbContextOptionsBuilder <DbLogDbContext>().UseSqlServer(dbLogConnection).Options); localizedDbContext.Database.Migrate(); services.Configure <DbLogOptions>(option => option.UseSettings(dbLogConnection)); services.AddSingleton <ILoggerProvider, DbLoggerProvider>(); services.AddSingleton <IBackgroundLogTaskQueue, LogBackgroundTaskQueue>(); services.AddHostedService <LogQueuedHostedService>(); services.AddTransient <ISystemLogData, SystemLogData>(); }
public void Log <TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func <TState, Exception, string> formatter) { if (!IsEnabled(logLevel)) { return; } if (formatter == null) { throw new ArgumentNullException(nameof(formatter)); } var logBuilder = new StringBuilder(); var message = formatter(state, exception); if (string.IsNullOrEmpty(message) && exception != null) { message = exception.Message; } SystemLog createEntity = new SystemLog() { Message = CoreUtility.TruncateString(message, 512) ?? "Empty", FullMessage = CreateFullMessage(logLevel, eventId, message, exception) ?? "Empty", Level = logLevel }; if (_contextAccessor?.HttpContext != null) { createEntity.IpAddress = _contextAccessor.HttpContext.GetCurrentIpAddress(); createEntity.PageUrl = _contextAccessor.HttpContext.GetThisPageUrl(); createEntity.ReferrerUrl = _contextAccessor.HttpContext.GetUrlReferrer(); createEntity.UserAgent = _contextAccessor.HttpContext.Request?.Headers["User-Agent"]; } _logtaskQueue.QueueBackgroundWorkItem(async token => { using var localizedDbContext = new DbLogDbContext(new DbContextOptionsBuilder <DbLogDbContext>().UseSqlServer(_dbLogOptions.ConnectionString).Options); localizedDbContext.SystemLogs.Add(createEntity); await localizedDbContext.SaveChangesAsync(); }); string CreateFullMessage(LogLevel logLevel, EventId eventId, string message, Exception exception) { var logBuilder = new StringBuilder(); var logLevelString = logLevel.ToString(); logBuilder.Append($"{DateTime.Now.ToString(new System.Globalization.CultureInfo("vi-VN"))} - {logLevelString} - {_name}"); if (null != eventId && eventId.Id > 0) { logBuilder.Append($" [ {eventId.Id} - {eventId.Name ?? "null"} ] "); } AppendAndReplaceNewLine(logBuilder, message); if (exception != null) { logBuilder.Append(' '); AppendAndReplaceNewLine(logBuilder, exception.ToString()); } return(logBuilder.ToString());
public SystemLogData(DbLogDbContext dbLogDbContext) : base(dbLogDbContext) { }