Как настроить NLog для записи в базу данных?
Я пытаюсь заставить NLog писать в базу данных, однако с моим текущим кодом он генерирует исключение при попытке отладки, исключение: инициализатор типа для "NotifyIcon.Program" выдал исключение.
Ниже приведен код моего файла конфигурации 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">
<!--
See http://nlog-project.org/wiki/Configuration_file
for information on customizing logging rules and outputs.
-->
<targets>
<!-- add your targets here -->
<target name="database" xsi:type="Database" />
<target xsi:type="Database"
name="String"
dbUserName="Layout"
dbProvider="sqlserver"
useTransactions="false"
connectionStringName="String"
connectionString="Data Source=AC-02\SQLEXPRESS;Initial Catalog=master;Integrated Security=True"
keepConnection="true"
dbDatabase="Layout"
dbPassword="Layout"
dbHost="Layout"
installConnectionString="Layout"
commandText="INSERT INTO Logs (Machine_Name, Username, Logon_Time, Screensaver_On, Screensaver_Off, Logoff_Time, Program_Start) Values @MachineName, @Username, @LogonTime, @Screensaver_On, @Screensaver_Off, @LogoffTime, @ProgramStart "/>
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="database" />
</rules>
</nlog>
любая и вся помощь будет принята с благодарностью =]
Ответы
Ответ 1
Кажется, у вас отсутствуют параметры, которые нужно вставить.
См. примеры в http://justinpdavis.blogspot.com/2010/04/logging-to-database-with-nlog.html
В веб-странице nLog не очень ясно сказано, что это необходимо, но если вы прищурились и прочитали https://github.com/nlog/NLog/wiki/Database-target, вы должны обнаружить, что они требуется.
Ответ 2
U также написал 2 цели. А также множество атрибутов, которые вам не нужно устанавливать. Должно быть только:
<target name="DbLog" xsi:type="Database" connectionString="YourConStr"
commandText="insert into [blablablabal] (Col1) values (@val1)">
<parameter name="@val1" layout="${level}" /></target>
Что-то вроде этого. Легко нет?:)
Ответ 3
Похоже, ваша строка вставки не в правильном формате? Вы отсутствуете() вокруг списка параметров.
commandText="INSERT INTO Logs (Machine_Name, Username, Logon_Time, Screensaver_On, Screensaver_Off, Logoff_Time, Program_Start) Values (@MachineName, @Username, @LogonTime, @Screensaver_On, @Screensaver_Off, @LogoffTime, @ProgramStart) "
Ответ 4
Итак, вы имеете в виду, что если вы запустите свой запрос в своей БД, используя консоль БД, с образцами данных, вы получите сообщение об ошибке. Если да, то проблема заключается в схеме БД, где вы хотите войти в систему. вы пытаетесь вставить данные в БД, которые не соответствуют его схеме
Ответ 5
Простой пример,
Config:
<target type="Database" name="database" connectionstring="Server=localhost;Database=NLog;Trusted_Connection=True;">
<commandText>
INSERT INTO NLogEntries ([Origin], [Message], [LogLevel],[CreatedOn],[OrderId]) VALUES (@Origin,@Message,@LogLevel,@Date, @OrderId);
</commandText>
<parameter name="@Date" layout="${date}" dbType="DbType.Date"/>
<parameter name="@Origin" layout="${callsite}"/>
<parameter name="@LogLevel" layout="${level}"/>
<parameter name="@message" layout="${message}"/>
<parameter name="@OrderId" layout="${event-properties:MyOrderId}" dbType="DbType.Int32"/> <!-- custom field! Note also the DB Type. Using Logger.WithProperty -->
</target>
Обратите внимание, что NLog 4.6 также поддерживает DbType - см. Https://nlog-project.org/2019/03/20/nlog-4-6-is-live.html.