... aber auch jeder andere Logger.
Traditionell wird das Photon Server SDK mit log4net geliefert. Dies bedeutet jedoch nicht, dass jeder es verwenden sollte. Fast jeder Logger kann verwendet werden. Sie müssen lediglich eine eigene Adapterbaugruppe erstellen, die die Proxy-Klasse und die Factory dafür enthält.
Nehmen wir Serilog, das heute in Mode ist. Ich kenne ihn nicht, daher ist es möglich, dass etwas nicht auf die beste oder falsche Weise getan wird.
Und so fangen wir an.
Als erstes müssen wir eine Baugruppe für Ihren Adapter erstellen.
In SDK 4.0 befinden sich die Schnittstellen ExitGames.Logging.ILogger und ExitGames.Logging.ILoggerFactory in ExitGamesLibs.dll. In SDK 5.0 wurden sie in ExitGames.Logging.dll verschoben. ExitGames.Logging befindet sich im gleichnamigen Nuget-Paket. Diese Bibliotheken müssen als Abhängigkeiten hinzugefügt werden.
Als Nächstes erstellen wir eine Proxy-Klasse für den Logger. Ich werde nicht den gesamten Code angeben, um das Beispiel nicht aufzublasen.
class SerilogLogger : ILogger
{
private readonly global::Serilog.ILogger logger;
public bool IsDebugEnabled => this.logger.IsEnabled(LogEventLevel.Debug);
// not sure whether this is right implementation
public string Name => this.logger.ToString();
............................................................
public SerilogLogger(global::Serilog.ILogger logger)
{
this.logger = logger;
}
public void Debug(object message)
{
if (message is string str)
{
this.logger.Debug(str);
return;
}
throw new NotSupportedException("only strings are allowed");
}
public void Debug(object message, Exception exception)
{
if (message is string str)
{
this.logger.Debug(exception, str);
return;
}
throw new NotSupportedException("only strings are allowed");
}
public void DebugFormat(string format, params object[] args)
{
this.logger.Debug(format, args);
}
public void DebugFormat(IFormatProvider formatProvider, string format, params object[] args)
{
this.logger.Debug(format, args);
}
......................................................
Das nächste, was wir brauchen, ist eine Fabrikklasse.
public class SerilogLoggerFactory : ILoggerFactory
{
/// <summary>
/// Provides a static singleton instance for the <see cref="SerilogLoggerFactory"/> class.
/// </summary>
public static readonly SerilogLoggerFactory Instance = new SerilogLoggerFactory();
public ILogger CreateLogger(string name)
{
var serilogLogger = Log.ForContext(Constants.SourceContextPropertyName, name);
return new SerilogLogger(serilogLogger);
}
}
Der letzte Schliff ist die Installation unserer Fabrik
ExitGames.Logging.LogManager.SetLoggerFactory(SerilogLoggerFactory.Instance);
Dies muss erfolgen, bevor die Logger in Photon.SocketServer.dll initialisiert werden. Der statische Konstruktor Ihrer Photonenanwendung ist hierfür am besten geeignet.
Was Sie sonst noch über die Protokollierung wissen müssen
Verwenden Sie if (log.IsDebugEnabled)
, , , . , if-, . Info . Warning .
, - . . LogCountGuard. , . , . . . , ,
Um die Verwendung dieses Tools zu vereinfachen, wurden Erweiterungsmethoden hinzugefügt. Jetzt sieht alles so aus. Nehmen wir an, wir brauchen eine Nachricht, die nicht öfter als 10 Mal pro Minute erscheint. Sie müssen Folgendes tun:
//
private static readonly LogCountGuard msgLogGuard = new LogCountGuard(new TimeSpan(0, 0, 6), 1);
//
log.Warn(msgLogGuard, "message");
Fazit
Abschließend möchte ich allen viel Erfolg bei der Verwendung des Photon Server SDK wünschen und mich nicht von der Abwesenheit Ihres Lieblingsloggers abschrecken lassen.