Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Log4net zapisuje niestandardowy obiekt do bazy danych sql za pomocą niestandardowego appendera?

Ta strona wskazał mi właściwy kierunek.

Musiałem stworzyć niestandardowe LayoutPattern i PatternConverter, aby pomyślnie zapisać mój obiekt do dziennika. Okazuje się, że dziwny tekst "12wo", który otrzymywałem w bazie danych, był spowodowany tym, że wzorzec konwersji używa składni stylu printf c. W każdym razie, oto trochę kodu.

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

Oto jak uzyskać instancję rejestratora według nazwy:

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

Oto jak zapisać obiekt testowy w dzienniku.

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

Oto jak należy zdefiniować parametr w web.config.

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

Inną rzeczą, na którą należy zwrócić uwagę, są sekcje root i logger pliku web.config. W sekcji głównej znajduje się miejsce, w którym zdefiniowany jest domyślny rejestrator z ustawionym poziomem. Mogę zdefiniować mój niestandardowy TestLogger w sekcji rejestratora, która będzie odwoływać się do appendera, jak pokazano poniżej. To pozwala mi uzyskać dostęp do TestLoggera według nazwy, jak pokazano powyżej.

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

Odkryłem również, że jeśli chcesz po prostu dodać kilka właściwości do domyślnego ADONetAppender (i dodać kilka pól do tabeli), możesz zamiast tego użyć log4net.ThreadContext, aby ustawić te właściwości w następujący sposób:

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

Następnie w web.config w sekcji parametrów możesz uzyskać dostęp do tej właściwości w następujący sposób:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Blokada wiersza serwera SQL

  2. TOP spowalnia zapytanie

  3. Wybierz pierwsze wystąpienie rekordu

  4. Jaka jest poprawna składnia używania Database.ExecuteSqlCommand z parametrami?

  5. Użyj instrukcji LIKE dla SQL Server XML Datatype