Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Log4net пише персонализиран обект в sql база данни с помощта на персонализиран appender?

Този сайт ме насочи в правилната посока.

Трябваше да създам персонализиран LayoutPattern и PatternConverter, за да запиша успешно моя обект в дневника. Оказа се, че странният текст „12wo“, който получавах в базата данни, е защото моделът за преобразуване използва синтаксис в стил printf c. Както и да е, ето малко код.

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

Ето как да получите екземпляр на регистратора по име:

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

Ето как да напишете тестов обект в дневника.

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

Ето как трябва да се дефинира параметър в web.config.

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

Друго нещо, което трябва да се отбележи, са секциите root и logger на web.config. В основната секция е мястото, където се дефинира регистраторът по подразбиране с набор от нива. Мога да дефинирам моя персонализиран TestLogger в секция за регистратор, която ще препраща към appender, както е показано по-долу. Това ми позволява да получа достъп до TestLogger по име, както е показано по-горе.

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

Също така открих, че ако искате просто да добавите няколко свойства към ADONetAppender по подразбиране (и да добавите няколко полета към таблицата), можете вместо това да използвате log4net.ThreadContext, за да зададете тези свойства по следния начин:

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

След това в web.config под секцията с параметри можете да получите достъп до това свойство по следния начин:

<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. SQL Server - вътрешно присъединяване при актуализиране

  2. SQL Server - Изберете колони, които отговарят на определени условия?

  3. Функцията YEARFRAC на SQL Server не работи

  4. SQL - не показвайте ред, когато са изпълнени два критерия

  5. запитване на двоична колона, като се използва като в sql сървър