sql >> Databáze >  >> RDS >> Sqlserver

Log4net zapisuje vlastní objekt do SQL databáze pomocí vlastního appenderu?

Tento web ukázal mi správným směrem.

Musel jsem vytvořit vlastní LayoutPattern a PatternConverter, abych mohl úspěšně zapsat svůj objekt do protokolu. Ukázalo se, že podivný text „12wo“, který jsem v databázi dostával, byl způsoben tím, že převodní vzor používá syntaxi stylu printfc. Každopádně tady je nějaký kód.

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

Zde je návod, jak získat instanci loggeru podle názvu:

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

Zde je návod, jak zapsat objekt Test do protokolu.

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

Zde je návod, jak by měl být parametr definován v souboru web.config.

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

Další věc, kterou je třeba poznamenat, je kořenová sekce a sekce logger v souboru web.config. V kořenové sekci je definován výchozí záznamník s nastavenou úrovní. Mohu definovat svůj vlastní TestLogger v sekci loggeru, která bude odkazovat na appender, jak je uvedeno níže. To mi umožňuje přistupovat k TestLoggeru podle jména, jak je uvedeno výše.

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

Také jsem zjistil, že pokud chcete do výchozího ADONetAppender přidat několik vlastností (a přidat několik polí do tabulky), můžete místo toho použít log4net.ThreadContext k nastavení těchto vlastností takto:

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

Potom v souboru web.config v sekci parametrů můžete přistupovat k této vlastnosti takto:

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



  1. Během provádění příkazu došlo k závažné chybě. v C#, když používám Insert Into

  2. případ, kdy v aktualizačním dotazu MySQL PDO

  3. Zkontrolujte, zda byl záznam mySQL přidán za posledních x sekund

  4. Změny GI 12.2