c# - Agregar un registrador de memoria adicional temporal en nlog

CorePress2024-01-25  8

Tengo la configuración de nlog funcionando bien en un programa C#. la configuración de nlog se realiza a través del archivo independiente nlog.config Sin embargo, en una parte específica del código quiero crear un destino de registro de memoria adicional para guardar esta parte específica de los registros en un búfer (más adelante adjuntaré este búfer a un objeto específico en la base de datos).

Para hacerlo, intento agregar mediante programación el registrador y su configuración. Verifico que el registrador esté agregado y la regla esté agregada, sin embargo, no llega nada al registrador recién creado. Creo que me falta algo que decirle a nlog para que tenga en cuenta el nuevo registrador. una vez que se ejecuta la función de destino, quiero detenerme para registrar este fragmento de código, seguir usando los otros registradores y hacer lo mismo en el siguiente elemento.

Agrego el registrador de memoriacon estas líneas de código:

                MemoryTarget memoryLogger = new MemoryTarget("memoryTarget");
                memoryLogger.Layout = "${message}";
                LogManager.Configuration.AddTarget(memoryLogger);
                LogManager.Configuration.AddRule(LogLevel.Trace, LogLevel.Fatal, memoryLogger);

a continuación se ve la configuración de nlog antes de agregar el nuevo registrador:

debajo de la configuración después de agregar el nuevo registrador:

LogManager.Configuration.LoggingRules tiene un nuevo elemento LogManager.Configuration.AllTargets tiene un nuevo elemento sin embargo, en los detalles del objetivo veo: Está inicializado en falso Configuración de inicio de sesión en nulo (mientras agregué la regla a LogManager.Configuration la propiedad 'Registros' que debería contener todas las líneas registradas está vacía

No quiero reiniciar todo el nlog ya que restablecería mi archivo de registro y quiero un nuevo archivo de registro en cada inicio de proceso.

Después de haber completado la actualización de Configuration.LoggingRules, se debe llamar a LogManager.ReconfigExistingLoggers() para "confirmar" los cambios (Actualizar los objetos Logger ya creados)

- Rolf Kristensen

27/03/2021 a las 19:29



------------------------------------

Gracias @Rolf Kristensen,

de hecho,

LogManager.ReconfigExistingLoggers();

Permite inicializar el registrador de memoria sin restablecer mi otro registrador en Archivo. Al hacer esto, los eventos estáticos ConfigurationChanged/ConfigurationReloaded de LogManager ni siquiera se activan, ¡y funciona muy bien! ¡Genial!

Código final paraactivar y desactivar temporalmente los logs en memoria:

                MemoryTarget memoryTarget = new MemoryTarget("memoryTarget");
                memoryTarget.Layout = "${message}";
                LogManager.Configuration.AddTarget(memoryTarget);
                var memoryRule = new LoggingRule("memoryRule");
                memoryRule.EnableLoggingForLevels(LogLevel.Trace, LogLevel.Fatal);
                memoryRule.Targets.Add(memoryTarget);
                memoryRule.LoggerNamePattern = "*";
                LogManager.Configuration.LoggingRules.Add(memoryRule);
                LogManager.ReconfigExistingLoggers();
                _log.Debug("this is dumped in memory");
                foreach (string s in memoryTarget.Logs)
                {
                    Console.Write("---------mem dumped: {0}", s);
                }
                LogManager.Configuration.RemoveTarget(memoryTarget.Name);
                bool removed = LogManager.Configuration.LoggingRules.Remove(memoryRule);
                LogManager.ReconfigExistingLoggers();
                _log.Debug("no more in memory");

1

Tenga en cuenta que puede utilizar la lógica de NLog Layout dentro de las reglas de registro, para que puedan activarse bajo demanda. Por lo tanto, puede configurar objetivos y reglas de registro y luego simplemente invertir una variable GDC o NLog-Config para habilitar o deshabilitar los objetivos. Ver también: github.com/NLog/NLog/wiki/…

- Rolf Kristensen

28/03/2021 a las 13:44



------------------------------------

Si lees esta publicación, es posible que te interese obtener este fragmento de código:

    public class MemoryLogger
    {
        static Logger _log = LogManager.GetCurrentClassLogger();
        MemoryTarget _memoryTarget;
        LoggingRule _memoryRule;

        public void Start()
        {
            _memoryTarget = new MemoryTarget("memoryTarget");
            _memoryTarget.Layout = "${message}";
            LogManager.Configuration.AddTarget(_memoryTarget);
            _memoryRule = new LoggingRule("memoryRule");
            _memoryRule.EnableLoggingForLevels(LogLevel.Trace, LogLevel.Fatal);
            _memoryRule.Targets.Add(_memoryTarget);
            _memoryRule.LoggerNamePattern = "*";
            LogManager.Configuration.LoggingRules.Add(_memoryRule);
            LogManager.ReconfigExistingLoggers();
        }

        public StringBuilder Stop()
        {
            LogManager.Configuration.RemoveTarget(_memoryTarget.Name);
            bool removed = LogManager.Configuration.LoggingRules.Remove(_memoryRule);
            if (!removed)
                _log.Error("cannot remove rule "+_memoryRule.RuleName);
            LogManager.ReconfigExistingLoggers();
            var ret = new StringBuilder();
            foreach (string s in _memoryTarget.Logs)
            {
                ret.AppendLine(s);
            }
            return ret;
        }
    }

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare