Update to some stat stuff to fix some latent issues

This commit is contained in:
RaidMax 2019-08-23 18:34:31 -05:00
parent f6857ac635
commit 91078eec0f
11 changed files with 107 additions and 119 deletions

View File

@ -70,7 +70,6 @@ namespace IW4MAdmin.Application.IO
foreach (var ev in events) foreach (var ev in events)
{ {
_server.Manager.GetEventHandler().AddEvent(ev); _server.Manager.GetEventHandler().AddEvent(ev);
await ev.WaitAsync(Utilities.DefaultCommandTimeout, _server.Manager.CancellationToken);
} }
previousFileSize = fileSize; previousFileSize = fileSize;

View File

@ -31,7 +31,7 @@ namespace IW4MAdmin.Application.IO
public long Length => -1; public long Length => -1;
public int UpdateInterval => 250; public int UpdateInterval => 500;
public async Task<ICollection<GameEvent>> ReadEventsFromLog(Server server, long fileSizeDiff, long startPosition) public async Task<ICollection<GameEvent>> ReadEventsFromLog(Server server, long fileSizeDiff, long startPosition)
{ {

View File

@ -16,7 +16,7 @@ namespace IW4MAdmin.Plugins.Stats.Commands
{ {
public static async Task<List<string>> GetMostPlayed(Server s) public static async Task<List<string>> GetMostPlayed(Server s)
{ {
long serverId = await StatManager.GetIdForServer(s); long serverId = StatManager.GetIdForServer(s);
List<string> mostPlayed = new List<string>() List<string> mostPlayed = new List<string>()
{ {

View File

@ -17,7 +17,7 @@ namespace IW4MAdmin.Plugins.Stats.Commands
if (E.Origin.ClientNumber >= 0) if (E.Origin.ClientNumber >= 0)
{ {
long serverId = await Helpers.StatManager.GetIdForServer(E.Owner); long serverId = Helpers.StatManager.GetIdForServer(E.Owner);
EFClientStatistics clientStats; EFClientStatistics clientStats;
using (var ctx = new DatabaseContext(disableTracking: true)) using (var ctx = new DatabaseContext(disableTracking: true))

View File

@ -17,7 +17,7 @@ namespace IW4MAdmin.Plugins.Stats.Commands
{ {
public static async Task<List<string>> GetTopStats(Server s) public static async Task<List<string>> GetTopStats(Server s)
{ {
long serverId = await StatManager.GetIdForServer(s); long serverId = StatManager.GetIdForServer(s);
List<string> topStatsText = new List<string>() List<string> topStatsText = new List<string>()
{ {
$"^5--{Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_STATS_COMMANDS_TOP_TEXT"]}--" $"^5--{Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_STATS_COMMANDS_TOP_TEXT"]}--"

View File

@ -42,7 +42,7 @@ namespace IW4MAdmin.Plugins.Stats.Commands
} }
} }
long serverId = await StatManager.GetIdForServer(E.Owner); long serverId = StatManager.GetIdForServer(E.Owner);
using (var ctx = new DatabaseContext(disableTracking: true)) using (var ctx = new DatabaseContext(disableTracking: true))
{ {

View File

@ -36,7 +36,7 @@ namespace IW4MAdmin.Plugins.Stats.Web.Controllers
if (server != null) if (server != null)
{ {
serverId = await StatManager.GetIdForServer(server); serverId = StatManager.GetIdForServer(server);
} }
var results = await Plugin.Manager.GetTopStats(offset, count, serverId); var results = await Plugin.Manager.GetTopStats(offset, count, serverId);

View File

@ -21,17 +21,28 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
{ {
private readonly ConcurrentDictionary<long, ServerStats> _servers; private readonly ConcurrentDictionary<long, ServerStats> _servers;
private readonly ILogger _log; private readonly ILogger _log;
private static List<EFServer> serverModels;
private readonly SemaphoreSlim OnProcessingPenalty; private readonly SemaphoreSlim OnProcessingPenalty;
private readonly SemaphoreSlim OnProcessingSensitive; private readonly SemaphoreSlim OnProcessingSensitive;
private readonly List<EFClientKill> _hitCache;
public StatManager(IManager mgr) public StatManager(IManager mgr)
{ {
_servers = new ConcurrentDictionary<long, ServerStats>(); _servers = new ConcurrentDictionary<long, ServerStats>();
_hitCache = new List<EFClientKill>();
_log = mgr.GetLogger(0); _log = mgr.GetLogger(0);
OnProcessingPenalty = new SemaphoreSlim(1, 1); OnProcessingPenalty = new SemaphoreSlim(1, 1);
OnProcessingSensitive = new SemaphoreSlim(1, 1); OnProcessingSensitive = new SemaphoreSlim(1, 1);
} }
private void SetupServerIds()
{
using (var ctx = new DatabaseContext(disableTracking: true))
{
serverModels = ctx.Set<EFServer>().ToList();
}
}
public EFClientStatistics GetClientStats(int clientId, long serverId) public EFClientStatistics GetClientStats(int clientId, long serverId)
{ {
return _servers[serverId].PlayerStats[clientId]; return _servers[serverId].PlayerStats[clientId];
@ -188,7 +199,12 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
// insert the server if it does not exist // insert the server if it does not exist
try try
{ {
long serverId = GetIdForServer(sv).Result; if (serverModels == null)
{
SetupServerIds();
}
long serverId = GetIdForServer(sv);
EFServer server; EFServer server;
using (var ctx = new DatabaseContext(disableTracking: true)) using (var ctx = new DatabaseContext(disableTracking: true))
@ -263,7 +279,7 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
try try
{ {
long serverId = await GetIdForServer(pl.CurrentServer); long serverId = GetIdForServer(pl.CurrentServer);
if (!_servers.ContainsKey(serverId)) if (!_servers.ContainsKey(serverId))
{ {
@ -363,7 +379,7 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
clientStats.SessionScore = pl.Score; clientStats.SessionScore = pl.Score;
clientStats.LastScore = pl.Score; clientStats.LastScore = pl.Score;
if (!detectionStats.TryAdd(pl.ClientId, new Cheat.Detection(_log, clientStats))) if (!detectionStats.TryAdd(pl.ClientId, new Detection(_log, clientStats)))
{ {
_log.WriteWarning("Could not add client to detection"); _log.WriteWarning("Could not add client to detection");
} }
@ -397,7 +413,7 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
{ {
pl.CurrentServer.Logger.WriteInfo($"Removing {pl} from stats"); pl.CurrentServer.Logger.WriteInfo($"Removing {pl} from stats");
long serverId = await GetIdForServer(pl.CurrentServer); long serverId = GetIdForServer(pl.CurrentServer);
var playerStats = _servers[serverId].PlayerStats; var playerStats = _servers[serverId].PlayerStats;
var detectionStats = _servers[serverId].PlayerDetections; var detectionStats = _servers[serverId].PlayerDetections;
var serverStats = _servers[serverId].ServerStatistics; var serverStats = _servers[serverId].ServerStatistics;
@ -406,8 +422,8 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
{ {
pl.CurrentServer.Logger.WriteWarning($"Client disconnecting not in stats {pl}"); pl.CurrentServer.Logger.WriteWarning($"Client disconnecting not in stats {pl}");
// remove the client from the stats dictionary as they're leaving // remove the client from the stats dictionary as they're leaving
playerStats.TryRemove(pl.ClientId, out EFClientStatistics removedValue1); playerStats.TryRemove(pl.ClientId, out _);
detectionStats.TryRemove(pl.ClientId, out Detection removedValue2); detectionStats.TryRemove(pl.ClientId, out _);
return; return;
} }
@ -415,8 +431,8 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
var clientStats = playerStats[pl.ClientId]; var clientStats = playerStats[pl.ClientId];
// remove the client from the stats dictionary as they're leaving // remove the client from the stats dictionary as they're leaving
playerStats.TryRemove(pl.ClientId, out EFClientStatistics removedValue3); playerStats.TryRemove(pl.ClientId, out _);
detectionStats.TryRemove(pl.ClientId, out Detection removedValue4); detectionStats.TryRemove(pl.ClientId, out _);
// sync their stats before they leave // sync their stats before they leave
clientStats = UpdateStats(clientStats); clientStats = UpdateStats(clientStats);
@ -433,20 +449,6 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
public void AddDamageEvent(string eventLine, int attackerClientId, int victimClientId, long serverId) public void AddDamageEvent(string eventLine, int attackerClientId, int victimClientId, long serverId)
{ {
// todo: maybe do something with this
//string regex = @"^(D);(.+);([0-9]+);(allies|axis);(.+);([0-9]+);(allies|axis);(.+);(.+);([0-9]+);(.+);(.+)$";
//var match = Regex.Match(eventLine, regex, RegexOptions.IgnoreCase);
//if (match.Success)
//{
// // this gives us what team the player is on
// var attackerStats = Servers[serverId].PlayerStats[attackerClientId];
// var victimStats = Servers[serverId].PlayerStats[victimClientId];
// IW4Info.Team victimTeam = (IW4Info.Team)Enum.Parse(typeof(IW4Info.Team), match.Groups[4].ToString(), true);
// IW4Info.Team attackerTeam = (IW4Info.Team)Enum.Parse(typeof(IW4Info.Team), match.Groups[7].ToString(), true);
// attackerStats.Team = attackerTeam;
// victimStats.Team = victimTeam;
//}
} }
/// <summary> /// <summary>
@ -516,10 +518,9 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
AnglesList = snapshotAngles AnglesList = snapshotAngles
}; };
if ((hit.DeathType == IW4Info.MeansOfDeath.MOD_SUICIDE && if (hit.HitLoc == IW4Info.HitLocation.shield)
hit.Damage == 100000) || hit.HitLoc == IW4Info.HitLocation.shield)
{ {
// suicide by switching teams so let's not count it against them // we don't care about shield hits
return; return;
} }
@ -550,21 +551,27 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
clientStats.HitLocations.Single(hl => hl.Location == hit.HitLoc).HitCount += 1; clientStats.HitLocations.Single(hl => hl.Location == hit.HitLoc).HitCount += 1;
} }
using (var ctx = new DatabaseContext(disableTracking: true))
{
ctx.Set<EFClientStatistics>().Update(clientStats);
await ctx.SaveChangesAsync();
}
using (var ctx = new DatabaseContext())
{
try try
{ {
if (Plugin.Config.Configuration().StoreClientKills) if (Plugin.Config.Configuration().StoreClientKills)
{ {
ctx.Set<EFClientKill>().Add(hit); _hitCache.Add(hit);
if (_hitCache.Count > Detection.MAX_TRACKED_HIT_COUNT)
{
using (var ctx = new DatabaseContext())
{
ctx.AddRange(_hitCache);
await ctx.SaveChangesAsync();
} }
_hitCache.Clear();
}
}
if (Plugin.Config.Configuration().EnableAntiCheat && !attacker.IsBot && attacker.ClientId != victim.ClientId) if (Plugin.Config.Configuration().EnableAntiCheat && !attacker.IsBot && attacker.ClientId != victim.ClientId)
{ {
DetectionPenaltyResult result = new DetectionPenaltyResult() { ClientPenalty = EFPenalty.PenaltyType.Any }; DetectionPenaltyResult result = new DetectionPenaltyResult() { ClientPenalty = EFPenalty.PenaltyType.Any };
@ -582,11 +589,15 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
clientDetection.TrackedHits.Remove(oldestHit); clientDetection.TrackedHits.Remove(oldestHit);
result = clientDetection.ProcessHit(oldestHit, isDamage); result = clientDetection.ProcessHit(oldestHit, isDamage);
await ApplyPenalty(result, attacker, ctx); await ApplyPenalty(result, attacker);
if (clientDetection.Tracker.HasChanges && result.ClientPenalty != EFPenalty.PenaltyType.Any) if (clientDetection.Tracker.HasChanges && result.ClientPenalty != EFPenalty.PenaltyType.Any)
{
using (var ctx = new DatabaseContext())
{ {
SaveTrackedSnapshots(clientDetection, ctx); SaveTrackedSnapshots(clientDetection, ctx);
await ctx.SaveChangesAsync();
}
if (result.ClientPenalty == EFPenalty.PenaltyType.Ban) if (result.ClientPenalty == EFPenalty.PenaltyType.Ban)
{ {
@ -604,9 +615,6 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
clientDetection.TrackedHits.Add(hit); clientDetection.TrackedHits.Add(hit);
} }
} }
ctx.Set<EFHitLocationCount>().UpdateRange(clientStats.HitLocations);
await ctx.SaveChangesAsync();
} }
catch (Exception ex) catch (Exception ex)
@ -615,9 +623,8 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
_log.WriteDebug(ex.GetExceptionInfo()); _log.WriteDebug(ex.GetExceptionInfo());
} }
} }
}
async Task ApplyPenalty(DetectionPenaltyResult penalty, EFClient attacker, DatabaseContext ctx) async Task ApplyPenalty(DetectionPenaltyResult penalty, EFClient attacker)
{ {
var penaltyClient = Utilities.IW4MAdminClient(attacker.CurrentServer); var penaltyClient = Utilities.IW4MAdminClient(attacker.CurrentServer);
switch (penalty.ClientPenalty) switch (penalty.ClientPenalty)
@ -713,7 +720,7 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
public async Task AddStandardKill(EFClient attacker, EFClient victim) public async Task AddStandardKill(EFClient attacker, EFClient victim)
{ {
long serverId = await GetIdForServer(attacker.CurrentServer); long serverId = GetIdForServer(attacker.CurrentServer);
EFClientStatistics attackerStats = null; EFClientStatistics attackerStats = null;
if (!_servers[serverId].PlayerStats.ContainsKey(attacker.ClientId)) if (!_servers[serverId].PlayerStats.ContainsKey(attacker.ClientId))
@ -743,7 +750,6 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
// update the total stats // update the total stats
_servers[serverId].ServerStatistics.TotalKills += 1; _servers[serverId].ServerStatistics.TotalKills += 1;
await Sync(attacker.CurrentServer);
// this happens when the round has changed // this happens when the round has changed
if (attackerStats.SessionScore == 0) if (attackerStats.SessionScore == 0)
@ -801,16 +807,6 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
attackerStats.LastStatHistoryUpdate = DateTime.UtcNow; attackerStats.LastStatHistoryUpdate = DateTime.UtcNow;
await UpdateStatHistory(attacker, attackerStats); await UpdateStatHistory(attacker, attackerStats);
} }
// todo: do we want to save this immediately?
using (var ctx = new DatabaseContext(disableTracking: true))
{
var clientStatsSet = ctx.Set<EFClientStatistics>();
clientStatsSet.Attach(attackerStats).State = EntityState.Modified;
clientStatsSet.Attach(victimStats).State = EntityState.Modified;
await ctx.SaveChangesAsync();
}
} }
/// <summary> /// <summary>
@ -824,12 +820,12 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
int currentSessionTime = (int)(DateTime.UtcNow - client.LastConnection).TotalSeconds; int currentSessionTime = (int)(DateTime.UtcNow - client.LastConnection).TotalSeconds;
// don't update their stat history if they haven't played long // don't update their stat history if they haven't played long
#if DEBUG == false //#if DEBUG == false
if (currentSessionTime < 60) if (currentSessionTime < 60)
{ {
return; return;
} }
#endif //#endif
int currentServerTotalPlaytime = clientStats.TimePlayed + currentSessionTime; int currentServerTotalPlaytime = clientStats.TimePlayed + currentSessionTime;
@ -1218,7 +1214,7 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
public async Task Sync(Server sv) public async Task Sync(Server sv)
{ {
long serverId = await GetIdForServer(sv); long serverId = GetIdForServer(sv);
using (var ctx = new DatabaseContext(disableTracking: true)) using (var ctx = new DatabaseContext(disableTracking: true))
{ {
@ -1237,7 +1233,7 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
_servers[serverId].IsTeamBased = isTeamBased; _servers[serverId].IsTeamBased = isTeamBased;
} }
public static async Task<long> GetIdForServer(Server server) public static long GetIdForServer(Server server)
{ {
if ($"{server.IP}:{server.Port.ToString()}" == "66.150.121.184:28965") if ($"{server.IP}:{server.Port.ToString()}" == "66.150.121.184:28965")
{ {
@ -1248,13 +1244,9 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
id = id < 0 ? Math.Abs(id) : id; id = id < 0 ? Math.Abs(id) : id;
long? serverId; long? serverId;
// todo: cache this eventually, as it shouldn't change serverId = serverModels.FirstOrDefault(_server => _server.ServerId == server.EndPoint ||
using (var ctx = new DatabaseContext(disableTracking: true))
{
serverId = (await ctx.Set<EFServer>().FirstOrDefaultAsync(_server => _server.ServerId == server.EndPoint ||
_server.EndPoint == server.ToString() || _server.EndPoint == server.ToString() ||
_server.ServerId == id))?.ServerId; _server.ServerId == id)?.ServerId;
}
if (!serverId.HasValue) if (!serverId.HasValue)
{ {

View File

@ -50,12 +50,12 @@ namespace IW4MAdmin.Plugins.Stats
if (!string.IsNullOrEmpty(E.Data) && if (!string.IsNullOrEmpty(E.Data) &&
E.Origin.ClientId > 1) E.Origin.ClientId > 1)
{ {
await Manager.AddMessageAsync(E.Origin.ClientId, await StatManager.GetIdForServer(E.Owner), E.Data); await Manager.AddMessageAsync(E.Origin.ClientId, StatManager.GetIdForServer(E.Owner), E.Data);
} }
break; break;
case GameEvent.EventType.MapChange: case GameEvent.EventType.MapChange:
Manager.SetTeamBased(await StatManager.GetIdForServer(E.Owner), E.Owner.Gametype != "dm"); Manager.SetTeamBased(StatManager.GetIdForServer(E.Owner), E.Owner.Gametype != "dm");
Manager.ResetKillstreaks(await StatManager.GetIdForServer(E.Owner)); Manager.ResetKillstreaks(StatManager.GetIdForServer(E.Owner));
break; break;
case GameEvent.EventType.MapEnd: case GameEvent.EventType.MapEnd:
break; break;
@ -77,7 +77,7 @@ namespace IW4MAdmin.Plugins.Stats
break; break;
case GameEvent.EventType.ScriptKill: case GameEvent.EventType.ScriptKill:
string[] killInfo = (E.Data != null) ? E.Data.Split(';') : new string[0]; string[] killInfo = (E.Data != null) ? E.Data.Split(';') : new string[0];
if (killInfo.Length >= 14 && !ShouldIgnoreEvent(E.Origin, E.Target)) if (E.Owner.CustomCallback && killInfo.Length >= 14 && !ShouldIgnoreEvent(E.Origin, E.Target))
{ {
// this treats "world" damage as self damage // this treats "world" damage as self damage
if (IsWorldDamage(E.Origin)) if (IsWorldDamage(E.Origin))
@ -85,7 +85,7 @@ namespace IW4MAdmin.Plugins.Stats
E.Origin = E.Target; E.Origin = E.Target;
} }
await Manager.AddScriptHit(false, E.Time, E.Origin, E.Target, await StatManager.GetIdForServer(E.Owner), S.CurrentMap.Name, killInfo[7], killInfo[8], await Manager.AddScriptHit(false, E.Time, E.Origin, E.Target, StatManager.GetIdForServer(E.Owner), S.CurrentMap.Name, killInfo[7], killInfo[8],
killInfo[5], killInfo[6], killInfo[3], killInfo[4], killInfo[9], killInfo[10], killInfo[11], killInfo[12], killInfo[13], killInfo[14], killInfo[15]); killInfo[5], killInfo[6], killInfo[3], killInfo[4], killInfo[9], killInfo[10], killInfo[11], killInfo[12], killInfo[13], killInfo[14], killInfo[15]);
} }
break; break;
@ -100,10 +100,6 @@ namespace IW4MAdmin.Plugins.Stats
await Manager.AddStandardKill(E.Origin, E.Target); await Manager.AddStandardKill(E.Origin, E.Target);
} }
else
{
throw new Exception();
}
break; break;
case GameEvent.EventType.Damage: case GameEvent.EventType.Damage:
if (!E.Owner.CustomCallback && !ShouldIgnoreEvent(E.Origin, E.Target)) if (!E.Owner.CustomCallback && !ShouldIgnoreEvent(E.Origin, E.Target))
@ -114,12 +110,12 @@ namespace IW4MAdmin.Plugins.Stats
E.Origin = E.Target; E.Origin = E.Target;
} }
Manager.AddDamageEvent(E.Data, E.Origin.ClientId, E.Target.ClientId, await StatManager.GetIdForServer(E.Owner)); Manager.AddDamageEvent(E.Data, E.Origin.ClientId, E.Target.ClientId, StatManager.GetIdForServer(E.Owner));
} }
break; break;
case GameEvent.EventType.ScriptDamage: case GameEvent.EventType.ScriptDamage:
killInfo = (E.Data != null) ? E.Data.Split(';') : new string[0]; killInfo = (E.Data != null) ? E.Data.Split(';') : new string[0];
if (killInfo.Length >= 14 && !ShouldIgnoreEvent(E.Origin, E.Target)) if (E.Owner.CustomCallback && killInfo.Length >= 14 && !ShouldIgnoreEvent(E.Origin, E.Target))
{ {
// this treats "world" damage as self damage // this treats "world" damage as self damage
if (IsWorldDamage(E.Origin)) if (IsWorldDamage(E.Origin))
@ -127,7 +123,7 @@ namespace IW4MAdmin.Plugins.Stats
E.Origin = E.Target; E.Origin = E.Target;
} }
await Manager.AddScriptHit(true, E.Time, E.Origin, E.Target, await StatManager.GetIdForServer(E.Owner), S.CurrentMap.Name, killInfo[7], killInfo[8], await Manager.AddScriptHit(true, E.Time, E.Origin, E.Target, StatManager.GetIdForServer(E.Owner), S.CurrentMap.Name, killInfo[7], killInfo[8],
killInfo[5], killInfo[6], killInfo[3], killInfo[4], killInfo[9], killInfo[10], killInfo[11], killInfo[12], killInfo[13], killInfo[14], killInfo[15]); killInfo[5], killInfo[6], killInfo[3], killInfo[4], killInfo[9], killInfo[10], killInfo[11], killInfo[12], killInfo[13], killInfo[14], killInfo[15]);
} }
break; break;

View File

@ -19,7 +19,7 @@ namespace Stats.ViewComponents
if (server != null) if (server != null)
{ {
serverId = await StatManager.GetIdForServer(server); serverId = StatManager.GetIdForServer(server);
} }
return View("_List", await Plugin.Manager.GetTopStats(offset, count, serverId)); return View("_List", await Plugin.Manager.GetTopStats(offset, count, serverId));

View File

@ -22,6 +22,7 @@ namespace SharedLibraryCore.Database
public DbSet<EFMeta> EFMeta { get; set; } public DbSet<EFMeta> EFMeta { get; set; }
public DbSet<EFChangeHistory> EFChangeHistory { get; set; } public DbSet<EFChangeHistory> EFChangeHistory { get; set; }
[Obsolete] [Obsolete]
private static readonly ILoggerFactory _loggerFactory = new LoggerFactory(new[] { private static readonly ILoggerFactory _loggerFactory = new LoggerFactory(new[] {
new ConsoleLoggerProvider((category, level) => level == LogLevel.Information, true) new ConsoleLoggerProvider((category, level) => level == LogLevel.Information, true)
@ -113,9 +114,9 @@ namespace SharedLibraryCore.Database
#if DEBUG #if DEBUG
#pragma warning disable CS0612 // Type or member is obsolete #pragma warning disable CS0612 // Type or member is obsolete
optionsBuilder.UseLoggerFactory(_loggerFactory) // optionsBuilder.UseLoggerFactory(_loggerFactory)
#pragma warning restore CS0612 // Type or member is obsolete #pragma warning restore CS0612 // Type or member is obsolete
.EnableSensitiveDataLogging(); // .EnableSensitiveDataLogging();
#endif #endif
} }