2015-06-19 3 views
3

Я пытаюсь зарегистрировать некоторую информацию в базе данных с помощью NLog, но я могу получить некоторые параметры DB только во время выполнения. Пробовал несколько решений, но безуспешно. Там мой NLog.config:
Вход с параметрами NLog и runtime в базу данных

<?xml version="1.0" encoding="utf-8" ?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    autoReload="true"> 

    <variable name="sqlDate" value="[${date:format=yyyy-MM-dd HH\:mm\:ss\.fff}]"/> 

    <targets> 
    <target name="dataBase" 
     xsi:type="Database" 
     dbProvider="System.Data.SqlClient" 
     connectionString="${gdc:item=myConnectionstring}" 
     dbDatabase="${gdc:item=myDataBase}"> 
     <commandText> 
     INSERT INTO [TABLE_NAME]([COL1], [COL2]) 
     VALUES(@val1, @val2) 
     </commandText> 
     <parameter name="@val1" layout="${event-context:item=val1}"/> 
     <parameter name="@val2" layout="${event-context:item=val2}"/> 
    </target> 
    </targets> 

    <rules> 
    <logger name="_dataBase" levels="Info" writeTo="dataBase" final="true" /> 
    </rules> 
</nlog> 

И есть мой .NET C# код:

public static class Log 
{ 
    private static NLog.Logger _logger = NLog.LogManager.GetCurrentClassLogger(); 
    private static Config _config = LoadConfig(); 

    public static void Info(string val1, string val2) 
    { 
     DatabaseTarget databaseTarget = (NLog.Targets.DatabaseTarget)NLog.LogManager.Configuration.FindTargetByName("dataBase"); 
     databaseTarget.ConnectionString = _config.ConnectString; 
     databaseTarget.DBDatabase = _config.DBName; 
     NLog.LogManager.ReconfigExistingLoggers(); 

     LogEventInfo info = new LogEventInfo(LogLevel.Info, "_dataBase", "Test_message"); 
     info.Properties["val1"] = val1; 
     info.Properties["val2"] = val2; 

     _logger.Log(info); 
    } 
} 

И это просто ничего не делать: не врезаться, а не писать любые данные в БД. Вот мой внутренний журнал NLog: http://pastebin.com/0tLi9zJ1
Как я могу это исправить?

P.S. Извините за мою последнюю попытку задать этот вопрос, похоже, я забыл предоставить ему необходимую информацию.

ответ

2

Таким образом, рабочий код:

<?xml version="1.0" encoding="utf-8" ?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    autoReload="true"> 

    <variable name="sqlDate" value="${date:format=yyyy-MM-dd HH\:mm\:ss\.fff}"/> 

    <targets> 
    <target name="dataBase" 
     xsi:type="Database" 
     dbProvider="System.Data.SqlClient" 
     connectionString="${gdc:item=myConnectionString}" 
     dbDatabase="${gdc:item=myDataBase}"> 
     <commandText> 
     INSERT INTO [TABLE_NAME]([COL1], [COL2]) 
     VALUES(@val1, @val2) 
     </commandText> 
     <parameter name="@val1" layout="${event-context:item=val1}"/> 
     <parameter name="@val2" layout="${event-context:item=val2}"/> 
    </target> 
    </targets> 

    <rules> 
    <logger name="_dataBase" levels="Info" writeTo="dataBase" final="true" /> 
    </rules> 
</nlog> 
public static class Log 
{ 
    private static Config _config = LoadConfig(); 

    public static void Info(string val1, string val2) 
    { 
      NLog.Logger logger = NLog.LogManager.GetLogger("_dataBase"); 

      GlobalDiagnosticsContext.Set("myConnectionString", _config.ConnectString); 
      GlobalDiagnosticsContext.Set("myDataBase", _config.DBName); 

      LogEventInfo info = new LogEventInfo(LogLevel.Info, "_dataBase", "Test_message"); 
      info.Properties["val1"] = val1; 
      info.Properties["val2"] = val2; 

      logger.Log(info); 
    } 
}