From a8b75bffe4c820cbb1ead69c61d5ea485b28f5be Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 7 Aug 2018 11:54:22 -0400 Subject: [PATCH] Logging without microsoft BS in the way is so much cleaner --- .../Controllers/ApiController.cs | 2 +- .../Controllers/HomeController.cs | 3 +++ .../Controllers/InteropController.cs | 2 +- src/Tgstation.Server.Host/Core/JobManager.cs | 4 +++ .../Models/DatabaseContext.cs | 27 +++++++++++++------ .../MySqlDesignTimeDbContextFactory.cs | 3 ++- .../SqlServerDesignTimeDbContextFactory.cs | 3 ++- .../Models/MySqlDatabaseContext.cs | 4 ++- .../Models/SqlServerDatabaseContext.cs | 4 ++- .../Models/SqliteDatabaseContext.cs | 15 +++-------- 10 files changed, 42 insertions(+), 25 deletions(-) diff --git a/src/Tgstation.Server.Host/Controllers/ApiController.cs b/src/Tgstation.Server.Host/Controllers/ApiController.cs index b97a3eb2e3..e013a02d7e 100644 --- a/src/Tgstation.Server.Host/Controllers/ApiController.cs +++ b/src/Tgstation.Server.Host/Controllers/ApiController.cs @@ -188,7 +188,7 @@ namespace Tgstation.Server.Host.Controllers } } - Logger.LogInformation("Request made by User ID {0}. Api version: {1}. User-Agent: {2}", AuthenticationContext?.User.Id.ToString(CultureInfo.InvariantCulture) ?? "NULL", ApiHeaders.ApiVersion, ApiHeaders.UserAgent); + Logger.LogTrace("Request made by User ID {0}. Api version: {1}. User-Agent: {2}. Type: {3}. Route {4}", AuthenticationContext?.User.Id.ToString(CultureInfo.InvariantCulture) ?? "NULL", ApiHeaders.ApiVersion, ApiHeaders.UserAgent, Request.Method, Request.Path); await base.OnActionExecutionAsync(context, next).ConfigureAwait(false); } } diff --git a/src/Tgstation.Server.Host/Controllers/HomeController.cs b/src/Tgstation.Server.Host/Controllers/HomeController.cs index bc1b3f63fa..08cc614df5 100644 --- a/src/Tgstation.Server.Host/Controllers/HomeController.cs +++ b/src/Tgstation.Server.Host/Controllers/HomeController.cs @@ -127,6 +127,9 @@ namespace Tgstation.Server.Host.Controllers var token = tokenFactory.CreateToken(user, out var expiry); if (identity != null) identityCache.CacheSystemIdentity(user, identity, expiry.AddSeconds(10)); //expire the identity slightly after the auth token in case of lag + + Logger.LogDebug("Successfully logged in user {0} ({1})!", user.Id, user.CanonicalName); + return Json(token); } } diff --git a/src/Tgstation.Server.Host/Controllers/InteropController.cs b/src/Tgstation.Server.Host/Controllers/InteropController.cs index 990f2f671f..55bd53d731 100644 --- a/src/Tgstation.Server.Host/Controllers/InteropController.cs +++ b/src/Tgstation.Server.Host/Controllers/InteropController.cs @@ -14,7 +14,7 @@ namespace Tgstation.Server.Host.Controllers /// Handles requests from DreamDaemon /// [Route("/Interop")] - public sealed class InteropController : Controller + public sealed class InteropController : Controller //not an ApiController because "lol im byond and who is headers?" { /// /// The for the diff --git a/src/Tgstation.Server.Host/Core/JobManager.cs b/src/Tgstation.Server.Host/Core/JobManager.cs index 8cf31a4801..4dc1d28461 100644 --- a/src/Tgstation.Server.Host/Core/JobManager.cs +++ b/src/Tgstation.Server.Host/Core/JobManager.cs @@ -89,13 +89,16 @@ namespace Tgstation.Server.Host.Core databaseContext = scope.ServiceProvider.GetRequiredService(); databaseContext.Jobs.Attach(job); } + logger.LogDebug("Job {0} completed!", job.Id); } catch (OperationCanceledException) { + logger.LogDebug("Job {0} exited with cancelled!", job.Id); job.Cancelled = true; } catch (Exception e) { + logger.LogDebug("Job {0} exited with error! Exception: {1}", job.Id, e); job.ExceptionDetails = e.ToString(); } job.StoppedAt = DateTimeOffset.Now; @@ -136,6 +139,7 @@ namespace Tgstation.Server.Host.Core } databaseContext.Jobs.Add(job); await databaseContext.Save(cancellationToken).ConfigureAwait(false); + logger.LogDebug("Starting job {0}: {1}...", job.Id, job.Description); var jobHandler = JobHandler.Create(x => RunJob(job, (jobParam, serviceProvider, ct) => operation(jobParam, serviceProvider, y => { diff --git a/src/Tgstation.Server.Host/Models/DatabaseContext.cs b/src/Tgstation.Server.Host/Models/DatabaseContext.cs index 1a9e5bac6e..9165ab4f15 100644 --- a/src/Tgstation.Server.Host/Models/DatabaseContext.cs +++ b/src/Tgstation.Server.Host/Models/DatabaseContext.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using System; #if !DEBUG @@ -62,6 +63,11 @@ namespace Tgstation.Server.Host.Models /// public DbSet WatchdogReattachInformations { get; set; } + /// + /// The for the + /// + protected ILogger Logger { get; } + /// /// The connection string for the /// @@ -82,15 +88,18 @@ namespace Tgstation.Server.Host.Models /// The for the /// The containing the value of /// The value of - public DatabaseContext(DbContextOptions dbContextOptions, IOptions databaseConfigurationOptions, IDatabaseSeeder databaseSeeder) : base(dbContextOptions) + /// The value of + public DatabaseContext(DbContextOptions dbContextOptions, IOptions databaseConfigurationOptions, IDatabaseSeeder databaseSeeder, ILogger logger) : base(dbContextOptions) { databaseConfiguration = databaseConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(databaseConfigurationOptions)); this.databaseSeeder = databaseSeeder ?? throw new ArgumentNullException(nameof(databaseSeeder)); + Logger = logger ?? throw new ArgumentNullException(nameof(logger)); } /// protected override void OnModelCreating(ModelBuilder modelBuilder) { + Logger.LogDebug("Building entity framework context..."); base.OnModelCreating(modelBuilder); var userModel = modelBuilder.Entity(); @@ -125,16 +134,12 @@ namespace Tgstation.Server.Host.Models instanceModel.HasMany(x => x.Jobs).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade); } - /// - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { - base.OnConfiguring(optionsBuilder); - } - /// public async Task Initialize(CancellationToken cancellationToken) { + Logger.LogInformation("Migrating database..."); #if DEBUG + Logger.LogWarning("Running in debug mode. Using all or nothing strategy!"); await Database.EnsureCreatedAsync().ConfigureAwait(false); var wasEmpty = (await Users.CountAsync().ConfigureAwait(false)) == 0; #else @@ -143,9 +148,15 @@ namespace Tgstation.Server.Host.Models await Database.MigrateAsync(cancellationToken).ConfigureAwait(false); #endif if (wasEmpty) + { + Logger.LogInformation("Seeding database..."); await databaseSeeder.SeedDatabase(this, cancellationToken).ConfigureAwait(false); - else if(databaseConfiguration.ResetAdminPassword) + } + else if (databaseConfiguration.ResetAdminPassword) + { + Logger.LogWarning("Enabling and resetting admin password due to configuration!"); await databaseSeeder.ResetAdminPassword(this, cancellationToken).ConfigureAwait(false); + } } /// diff --git a/src/Tgstation.Server.Host/Models/Migrations/MySqlDesignTimeDbContextFactory.cs b/src/Tgstation.Server.Host/Models/Migrations/MySqlDesignTimeDbContextFactory.cs index fd55e611c1..14aafaca46 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/MySqlDesignTimeDbContextFactory.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/MySqlDesignTimeDbContextFactory.cs @@ -1,6 +1,7 @@ using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; +using Microsoft.Extensions.Logging; using Tgstation.Server.Host.Security; namespace Tgstation.Server.Host.Models.Migrations @@ -9,6 +10,6 @@ namespace Tgstation.Server.Host.Models.Migrations sealed class MySqlDesignTimeDbContextFactory : IDesignTimeDbContextFactory { /// - public MySqlDatabaseContext CreateDbContext(string[] args) => new MySqlDatabaseContext(new DbContextOptions(), DesignTimeDbContextFactoryHelpers.GetDbContextOptions(), new DatabaseSeeder(new CryptographySuite(new PasswordHasher()))); + public MySqlDatabaseContext CreateDbContext(string[] args) => new MySqlDatabaseContext(new DbContextOptions(), DesignTimeDbContextFactoryHelpers.GetDbContextOptions(), new DatabaseSeeder(new CryptographySuite(new PasswordHasher())), new LoggerFactory().CreateLogger()); } } diff --git a/src/Tgstation.Server.Host/Models/Migrations/SqlServerDesignTimeDbContextFactory.cs b/src/Tgstation.Server.Host/Models/Migrations/SqlServerDesignTimeDbContextFactory.cs index 75a1b97053..bf903b09c8 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/SqlServerDesignTimeDbContextFactory.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/SqlServerDesignTimeDbContextFactory.cs @@ -1,6 +1,7 @@ using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; +using Microsoft.Extensions.Logging; using Tgstation.Server.Host.Security; namespace Tgstation.Server.Host.Models.Migrations @@ -9,6 +10,6 @@ namespace Tgstation.Server.Host.Models.Migrations sealed class SqlServerDesignTimeDbContextFactory : IDesignTimeDbContextFactory { /// - public SqlServerDatabaseContext CreateDbContext(string[] args) => new SqlServerDatabaseContext(new DbContextOptions(), DesignTimeDbContextFactoryHelpers.GetDbContextOptions(), new DatabaseSeeder(new CryptographySuite(new PasswordHasher()))); + public SqlServerDatabaseContext CreateDbContext(string[] args) => new SqlServerDatabaseContext(new DbContextOptions(), DesignTimeDbContextFactoryHelpers.GetDbContextOptions(), new DatabaseSeeder(new CryptographySuite(new PasswordHasher())), new LoggerFactory().CreateLogger()); } } diff --git a/src/Tgstation.Server.Host/Models/MySqlDatabaseContext.cs b/src/Tgstation.Server.Host/Models/MySqlDatabaseContext.cs index 0f70b29fcd..eb6f0c81cd 100644 --- a/src/Tgstation.Server.Host/Models/MySqlDatabaseContext.cs +++ b/src/Tgstation.Server.Host/Models/MySqlDatabaseContext.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Tgstation.Server.Host.Configuration; @@ -15,7 +16,8 @@ namespace Tgstation.Server.Host.Models /// The for the /// The of for the /// The for the - public MySqlDatabaseContext(DbContextOptions dbContextOptions, IOptions databaseConfiguration, IDatabaseSeeder databaseSeeder) : base(dbContextOptions, databaseConfiguration, databaseSeeder) + /// The for the + public MySqlDatabaseContext(DbContextOptions dbContextOptions, IOptions databaseConfiguration, IDatabaseSeeder databaseSeeder, ILogger logger) : base(dbContextOptions, databaseConfiguration, databaseSeeder, logger) { } /// diff --git a/src/Tgstation.Server.Host/Models/SqlServerDatabaseContext.cs b/src/Tgstation.Server.Host/Models/SqlServerDatabaseContext.cs index 19f6736cc9..b0f7ae1372 100644 --- a/src/Tgstation.Server.Host/Models/SqlServerDatabaseContext.cs +++ b/src/Tgstation.Server.Host/Models/SqlServerDatabaseContext.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Tgstation.Server.Host.Configuration; @@ -15,7 +16,8 @@ namespace Tgstation.Server.Host.Models /// The for the /// The of for the /// The for the - public SqlServerDatabaseContext(DbContextOptions dbContextOptions, IOptions databaseConfiguration, IDatabaseSeeder databaseSeeder) : base(dbContextOptions, databaseConfiguration, databaseSeeder) + /// The for the + public SqlServerDatabaseContext(DbContextOptions dbContextOptions, IOptions databaseConfiguration, IDatabaseSeeder databaseSeeder, ILogger logger) : base(dbContextOptions, databaseConfiguration, databaseSeeder, logger) { } /// diff --git a/src/Tgstation.Server.Host/Models/SqliteDatabaseContext.cs b/src/Tgstation.Server.Host/Models/SqliteDatabaseContext.cs index 011893939c..9af5b1be9a 100644 --- a/src/Tgstation.Server.Host/Models/SqliteDatabaseContext.cs +++ b/src/Tgstation.Server.Host/Models/SqliteDatabaseContext.cs @@ -11,22 +11,15 @@ namespace Tgstation.Server.Host.Models /// sealed class SqliteDatabaseContext : DatabaseContext { - /// - /// The for the - /// - readonly ILogger logger; - /// /// Construct a /// /// The for the /// The of for the /// The for the - /// The value of - public SqliteDatabaseContext(DbContextOptions dbContextOptions, IOptions databaseConfiguration, IDatabaseSeeder databaseSeeder, ILogger logger) : base(dbContextOptions, databaseConfiguration, databaseSeeder) - { - this.logger = logger ?? throw new ArgumentNullException(nameof(logger)); - } + /// The for the + public SqliteDatabaseContext(DbContextOptions dbContextOptions, IOptions databaseConfiguration, IDatabaseSeeder databaseSeeder, ILogger logger) : base(dbContextOptions, databaseConfiguration, databaseSeeder, logger) + { } /// protected override void OnConfiguring(DbContextOptionsBuilder options) @@ -35,7 +28,7 @@ namespace Tgstation.Server.Host.Models //on the off chance that connection string is null here we default to a db file next to the executable since this is the default database if (ConnectionString == null) { - logger.LogWarning("No database configured! Defaulting to SQLite in the working directory!"); + Logger.LogWarning("No database configured! Defaulting to SQLite in the working directory!"); options.UseSqlite("Data Source=TgsDatabase.db3"); } else