LayoutRenderer personalizado de NLog para la sangría del alcance

¿Alguien puede proporcionarme un layoutrenderer personalizado de muestra para nlog?

Quiero hacer una sangría mientras estoy registrando, por ejemplo

si estoy llamando al Método B desde el Método C

el archivo de registro de texto es así:

Inside Method C
       Inside Method B

y así sucesivamente.

preguntado el 10 de mayo de 11 a las 13:05

1 Respuestas

aquí está:

[LayoutRenderer("IndentationLayout")]
public sealed class IndentationLayoutRenderer : LayoutRenderer
{
    // Value to substract from stack count
    private uint _ignore = 12;

    // Value to pad with.
    private string _ipadding = "| ";

    /// <summary>Set the number of (top) stackframes to ignore</summary>
    public uint Ignore
    {
        get { return _ignore; }
        set { _ignore = value; }
    }

    /// <summary>Set the padding value</summary>
    public string IndentationPadding
    {
        get { return _ipadding; }
        set { _ipadding = value; }
    }

    protected override void Append(StringBuilder builder, LogEventInfo ev)
    {
        // Get current stack depth, insert padding chars.
        StackTrace st = new StackTrace();
        long indent = st.FrameCount;
        indent = indent > _ignore ? indent - _ignore : 0;
        for (int i = 0; i < indent; ++i)
        {
            builder.Append(_ipadding);
        }
    }
}

Registro:

if(NLog.Config.ConfigurationItemFactory.Default.LayoutRenderers.AllRegisteredItems.ContainsKey(
                "IndentationLayout"))
                return;

NLog.Config.ConfigurationItemFactory.Default.LayoutRenderers.RegisterDefinition("IndentationLayout", typeof(IndentationLayoutRenderer));

respondido 15 nov., 18:14

¿Sabes si puedo configurar LayoutRenderers en el archivo nlog.config? - Radu D

StackTrace might not report as many method calls as expected, due to code transformations that occur during optimization. - MSDN. Consideraría la creación de métodos de sangría estática, UnIndent que toman un registrador además de tener un private static Dictionary<Logger.LoggerName, IndentLevel>. Luego, en Append, verifique el diccionario usando LogEventInfo.LoggerName para obtener su IndentLevel. - Jake Berger

Puede configurar esto en nlog.config así: ${IndentationLayout}{message} - Juliano

Tenga en cuenta que hay una gran penalización de rendimiento al usar este LayoutRenderer (debido a la captura de StackTrace) - Rolf Kristensen

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.