sql >> Database >  >> RDS >> Sqlserver

Log4net schrijft aangepast object naar SQL-database met behulp van aangepaste appender?

Deze site wees me in de goede richting.

Ik moest een aangepast LayoutPattern en PatternConverter maken om mijn object met succes naar het logboek te schrijven. Blijkt dat de rare "12wo" -tekst die ik in de database kreeg, was omdat het conversiepatroon de syntaxis van de printf c-stijl gebruikt. Hoe dan ook, hier is wat code.

public class TestLayoutPattern : PatternLayout
{
    public TestLayoutPattern()
    {
        AddConverter(new ConverterInfo
        {
            Name = "test",
            Type = typeof (TestConverter)
        });
    }
}
public class TestConverter : PatternConverter
{
    protected override void Convert(System.IO.TextWriter writer, object state)
    {
        if (state == null)
        {
            writer.Write(SystemInfo.NullText);
            return;
        }

        var loggingEvent = state as LoggingEvent;
        if (loggingEvent == null)
            throw new NullReferenceException("loggingEvent");

        var test = loggingEvent.MessageObject as Test;

        if (test == null)
        {
            writer.Write(SystemInfo.NullText);
        }
        else
        {
            switch (Option.ToLower())
            {
                case "one":
                    writer.Write(test.One);
                    break;
                case "two":
                    writer.Write(test.Two);
                    break;                    
                default:
                    writer.Write(SystemInfo.NullText);
                    break;
            }
        }
    }
}

Hier leest u hoe u een exemplaar van de logger op naam kunt krijgen:

private static readonly ILog TestLogger = LogManager.GetLogger("TestLogger");

Hier leest u hoe u een testobject naar het logboek schrijft.

TestLogger.Info(new Test {One = "field one", Two = "field two"});

Hier is hoe een parameter moet worden gedefinieerd in de web.config.

<parameter>
  <parameterName value="@one" />
  <dbType value="String" />
  <size value="50" />
  <layout type="MyApp.TestLayoutPattern">
    <conversionPattern value="%test{one}" />
  </layout>
</parameter>

Een ander ding om op te merken zijn de root- en logger-secties van de web.config. In de root sectie is waar de standaard logger is gedefinieerd met zijn niveau ingesteld. Ik kan mijn aangepaste TestLogger definiëren in een logger-sectie die zal verwijzen naar de bijlage zoals hieronder weergegeven. Hierdoor heb ik toegang tot de TestLogger op naam zoals hierboven weergegeven.

<root>
  <level value="ALL"/>
  <appender-ref ref="ADONetAppender"/>
</root>
<logger additivity="false" name="TestLogger">
  <level value="ALL"/>
  <appender-ref ref="TestAppender" />
</logger>

Ik ontdekte ook dat als je maar een paar eigenschappen aan de standaard ADONetAppender wilt toevoegen (en een paar velden aan de tabel wilt toevoegen), je in plaats daarvan de log4net.ThreadContext kunt gebruiken om die eigenschappen als volgt in te stellen:

log4net.ThreadContext.Properties["MyCustomPrperty"] = value;

Dan kun je in de web.config onder de parametersectie als volgt toegang krijgen tot die eigenschap:

<parameter>
  <parameterName value="@myCustomProperty"/>
  <dbType value="String"/>
  <layout type="log4net.Layout.RawPropertyLayout">
    <key value="MyCustomProperty" />
  </layout>
</parameter>



  1. Controleer niet-verzonden e-mail in SQL Server (T-SQL)

  2. UnicodeDecodeError:'ascii'-codec kan byte 0x92 op positie 47 niet decoderen:ordinaal niet binnen bereik (128)

  3. Laravel join-query's AS

  4. Een processor selecteren voor SQL Server 2014 – deel 2