Photon no se trata solo de log4net

... pero también cualquier otro registrador.





Tradicionalmente, Photon Server SDK se envía con log4net. Pero esto no significa que todo el mundo deba usarlo. Se puede utilizar casi cualquier registrador. Todo lo que necesita hacer es crear su propio conjunto de adaptador, que contendrá la clase de proxy y la fábrica correspondiente.





Tomemos Serilog, que está de moda hoy. No estoy familiarizado con él, por lo que es posible que algo no se haga de la mejor manera o mal.





Y entonces comencemos.





Lo primero que debemos hacer es crear un ensamblaje para su adaptador.





En SDK 4.0, las interfaces ExitGames.Logging.ILogger y ExitGames.Logging.ILoggerFactory están en ExitGamesLibs.dll. En SDK 5.0 se movieron a ExitGames.Logging.dll. ExitGames.Logging está en el paquete nuget del mismo nombre. Estas bibliotecas deben agregarse como dependencias.





A continuación, creamos una clase de proxy para el registrador. No daré todo su código, para no inflar el ejemplo.





    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);
        }
......................................................        

      
      



Lo siguiente que necesitamos es una clase de fábrica.





    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);
        }
    }

      
      



El toque final es la instalación de nuestra fábrica.





ExitGames.Logging.LogManager.SetLoggerFactory(SerilogLoggerFactory.Instance);

      
      



Esto debe hacerse antes de que se inicialicen los registradores en Photon.SocketServer.dll. El constructor estático de su aplicación de fotones es el mejor para esto.





¿Qué más necesita saber sobre el registro?

Usar si (log.IsDebugEnabled)

, , , . , if-, . Info . Warning .





, - . . LogCountGuard. , . , . . . , ,





Para que esta herramienta sea conveniente de usar, se han agregado métodos de extensión. Ahora todo se ve así. Digamos que necesitamos que un mensaje no aparezca más de 10 veces por minuto. Debes hacer lo siguiente,





  // 
  private static readonly LogCountGuard msgLogGuard = new LogCountGuard(new TimeSpan(0, 0, 6), 1);
  

  // 
  log.Warn(msgLogGuard, "message");

      
      



Conclusión

En conclusión, me gustaría desearles a todos éxito en el uso del Photon Server SDK y no deje que la ausencia de su registrador favorito lo asuste.








All Articles