using Cowain.Base.Models; using Microsoft.Extensions.Configuration; using MySqlConnector; using Serilog; using Serilog.Events; using Serilog.Sinks.MSSqlServer; using System; using System.Data; namespace Cowain.TestProject.Services; public static class LoggerConfigurationExtensions { public static LoggerConfiguration ConfigureDatabaseSink( this LoggerConfiguration loggerConfig, IConfiguration configuration) { var databaseType = configuration.GetSection("Database")["db"]; if (string.IsNullOrEmpty(databaseType) || !Enum.TryParse(databaseType.ToUpper(), out var dbType)) { return loggerConfig; } return dbType switch { DataBaseType.MYSQL => ConfigureMySqlSink(loggerConfig, configuration), DataBaseType.SQLSERVER => ConfigureSqlServerSink(loggerConfig, configuration), DataBaseType.POSTGRES => ConfigurePostgreSqlSink(loggerConfig, configuration), DataBaseType.SQLITE => ConfigureSqliteSink(loggerConfig, configuration), _ => loggerConfig }; } private static LoggerConfiguration ConfigureMySqlSink(LoggerConfiguration loggerConfig, IConfiguration configuration) { var connectionString = configuration.GetConnectionString("MySqlConn"); return loggerConfig.WriteTo.MySQL( connectionString: connectionString, tableName: "Logs", restrictedToMinimumLevel: LogEventLevel.Information ); } private static LoggerConfiguration ConfigureSqlServerSink(LoggerConfiguration loggerConfig, IConfiguration configuration) { var connectionString = configuration.GetConnectionString("SqlServerConn"); return loggerConfig.WriteTo.MSSqlServer( connectionString: connectionString, sinkOptions: new MSSqlServerSinkOptions { TableName = "Logs", AutoCreateSqlTable = true } ); } private static LoggerConfiguration ConfigurePostgreSqlSink(LoggerConfiguration loggerConfig, IConfiguration configuration) { var connectionString = configuration.GetConnectionString("PostGresConn"); return loggerConfig.WriteTo.PostgreSQL(connectionString: connectionString, tableName: "Logs", restrictedToMinimumLevel: LogEventLevel.Information); } private static LoggerConfiguration ConfigureSqliteSink(LoggerConfiguration loggerConfig, IConfiguration configuration) { var connectionString = configuration.GetConnectionString("SqlLiteConn"); return loggerConfig.WriteTo.SQLite( sqliteDbPath: connectionString?.Replace("Data Source=", "").Trim(), tableName: "Logs" ); } }