2016-01-21 2 views
1

У меня есть NLog 4.2.3, выполненный с возможностью записи в базу данных и текстовый файл с помощью следующей конфигурации:NLog исключения при записи в базу данных

<?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" internalLogLevel="Error" internalLogFile="C:/tmp/NLog.txt"> 
    <targets> 
     <target name="database" xsi:type="Database" dbProvider="Npgsql.NpgsqlFactory,Npgsql,Version=2.0.12.00,Culture=neutral,PublicKeyToken=5d8b90d52f46fda7" connectionString="Server=xxx.xxx.xxx.xxx;Port=5432;User Id=userid;Password=password;Database=testdb;"> 
     <commandText>INSERT INTO invoice_log (message, level, logger) VALUES (@msg, @level, @logger)</commandText> 

     <parameter name="@msg" layout="${message}" /> 
     <parameter name="@level" layout="${level}" /> 
     <parameter name="@logger" layout="${logger}" /> 
    </target> 

    <target name="log" xsi:type="File" layout="${longdate} | ${logger} | ${level:uppercase=true}: ${message}" fileName="${basedir}/Logs.txt" keepFileOpen="false" encoding="iso-8859-2" /> 
    </targets> 

    <rules> 
    <logger name="*" minlevel="Trace" writeTo="database" /> 
    <logger name="*" minlevel="Trace" writeTo="log" /> 
    </rules> 
</nlog> 

Я пытаюсь войти простое Info сообщение. Он правильно записывает в текстовый файл, но он не для базы данных, и я получаю следующее сообщение об ошибке во внутреннем файле журнала NLog:

Error Error when writing to database System.MissingMethodException: No parameterless constructor defined for this object. 
    at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) 
    at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) 
    at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) 
    at System.Activator.CreateInstance(Type type, Boolean nonPublic) 
    at System.Activator.CreateInstance(Type type) 
    at NLog.Targets.DatabaseTarget.OpenConnection(String connectionString) 
    at NLog.Targets.DatabaseTarget.EnsureConnectionOpen(String connectionString) 
    at NLog.Targets.DatabaseTarget.WriteEventToDatabase(LogEventInfo logEvent) 
    at NLog.Targets.DatabaseTarget.Write(LogEventInfo logEvent) 

Я смотрел на конфиги от других подобных вопросов (NLog is not writing to database table, NLog to PostgreSQL connection), но Я не вижу, что у меня пропало?

+0

@mikez Спасибо, что подобрали это. Ошибка перехода на NpgsqlConnection. Добавьте свои комментарии в качестве ответа. –

+0

Хорошо, переместил мой комментарий на ответ. –

ответ

1

Согласно nlog docs, dbProvider - это имя инварианта для фабрики, зарегистрированной в файле конфигурации, или полное имя типа, реализующего IDbConnection. Npgsql.NpgsqlConnection реализует требуемый интерфейс и имеет беззадачный конструктор. NpgsqlFactory не имеет и без конструктора без параметров (причина ошибки).

Смежные вопросы