sql >> Database teknologi >  >> RDS >> Sqlserver

Log4net skriver brugerdefineret objekt til sql-database ved hjælp af brugerdefineret appender?

Dette websted pegede mig i den rigtige retning.

Jeg var nødt til at oprette et brugerdefineret LayoutPattern og PatternConverter for at kunne skrive mit objekt til loggen med succes. Det viste sig, at den mærkelige "12wo"-tekst, jeg fik i databasen, skyldtes, at konverteringsmønsteret bruger printf c-stilsyntaks. Uanset hvad, her er noget kode.

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

Sådan får du en forekomst af loggeren ved navn:

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

Sådan skriver du et testobjekt til loggen.

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

Her er hvordan en parameter skal defineres i web.config.

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

En anden ting at bemærke er root- og logger-sektionerne af web.config. I rodsektionen er standardloggeren defineret med dens niveausæt. Jeg kan definere min brugerdefinerede TestLogger i en logger sektion, som vil referere til appenderen som vist nedenfor. Dette giver mig adgang til TestLogger ved navn som vist ovenfor.

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

Jeg fandt også ud af, at hvis du blot ville tilføje et par egenskaber til standard ADONetAppender (og tilføje et par felter til tabellen), kunne du i stedet bruge log4net.ThreadContext til at indstille disse egenskaber som sådan:

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

Så i web.config under parametersektionen kan du få adgang til egenskaben sådan her:

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



  1. Hvis erklæring inden for Hvor-klausulen

  2. hvordan opsætter man psql-kommandoen i cygwin?

  3. Vælg hvor rækkenummer =rækkenummer

  4. SQL-forespørgsel efter flere tabeller med flere joinforbindelser og kolonnefelt med kommasepareret liste