【问题标题】:NLog Database Target for .net Core 2.0.net Core 2.0 的 NLog 数据库目标
【发布时间】:2018-06-19 06:29:07
【问题描述】:

我正在尝试使用 .net Core 2.0 中的 NLog 将各种日志写入数据库和文件。问题是,将日志写入文件工作得很好。但是在将日志写入数据库时​​总是出现以下错误:

2018-01-10 08:48:29.5666 初始化目标“数据库目标 [db]”时出错。异常:System.TypeLoadException:无法从程序集“NLog,版本=4.0.0.0,Culture=neutral,PublicKeyToken=5120e14c03d0593c”加载类型“System.Data.SqlClient”。 在 System.RuntimeTypeHandle.GetTypeByName(字符串名称,布尔 throwOnError,布尔 ignoreCase,布尔反射,StackCrawlMarkHandle stackMark,IntPtr pPrivHostBinder,布尔 loadTypeFromPartialName,ObjectHandleOnStack 类型,ObjectHandleOnStack keepalive) 在 System.RuntimeTypeHandle.GetTypeByName(字符串名称,布尔 throwOnError,布尔 ignoreCase,布尔反射,StackCrawlMark 和 stackMark,IntPtr pPrivHostBinder,布尔 loadTypeFromPartialName) 在 System.RuntimeType.GetType(字符串类型名称,布尔 throwOnError,布尔忽略大小写,布尔反射,StackCrawlMark 和 stackMark) 在 System.Type.GetType(字符串类型名,布尔 throwOnError) 在 NLog.Targets.DatabaseTarget.SetConnectionType() 在 NLog.Targets.DatabaseTarget.InitializeTarget() 在 NLog.Targets.Target.Initialize(LoggingConfiguration 配置)

但我的项目中有 System.Data.SqlClient 如下:

<ItemGroup>
    <PackageReference Include="EPPlus.Core" Version="1.5.4" />
    <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.2.0-beta3" />
    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.3" />
    <PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="2.0.1" />
    <PackageReference Include="Microsoft.AspNetCore.Cors" Version="2.0.1" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.0.1" />
    <PackageReference Include="Microsoft.AspNetCore.Session" Version="2.0.1" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.1" PrivateAssets="All" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.1" PrivateAssets="All" />
    <PackageReference Include="NLog" Version="4.5.0-rc03" />
    <PackageReference Include="NLog.Web.AspNetCore" Version="4.5.0-rc2" />
    <PackageReference Include="System.ComponentModel" Version="4.3.0" />
    <PackageReference Include="System.Configuration.ConfigurationManager" Version="4.5.0-preview1-25914-04" />
    <PackageReference Include="System.Data.SqlClient" Version="4.4.2" />
</ItemGroup>

我的 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="info" internalLogFile="C:\*****\Log2\asdaf.log">
<targets>
    <target
        xsi:type="File"
        name="allfile"
        fileName="C:\*****\Logs\${shortdate}.log"
        layout="${longdate}|${event-properties:item=EventId.Id}|${uppercase:${level}}|${logger}|${message} ${exception}" >
    </target> 

    <target xsi:type="Database" name="db">
        <commandText>INSERT INTO [LogEntries](TimeStamp, Message, Level, Logger) VALUES(getutcdate(), @msg, @level, @logger)</commandText>
        <parameter name="@msg" layout="${message}" />
        <parameter name="@level" layout="${level}" />
        <parameter name="@logger" layout="${logger}" />
        <dbProvider>System.Data.SqlClient</dbProvider>
        <connectionString>*****</connectionString>
    </target>

    <target xsi:type="Null" name="blackhole" />
</targets>
<rules>
    <logger name="*" minlevel="Trace" writeTo="allOutputs" />
    <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
    <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
</rules>
</nlog>

我在 Github 上搜索了这个问题,但没有一个解决方案适合我。从 Nuget 获取 System.Data.SqlClient 应该就足够了,但不幸的是,Nlog.config 先生想要别的东西,我不知道是什么。

【问题讨论】:

  • 仅仅因为包在 nuget packages.config 中并不一定意味着它在您的项目中。您的顶级 .csproj 项目还应包括 PackageReferenceSystem.Data.SqlClient。您还可以在构建后检查 bin 文件夹以查看 DLL 是否存在。
  • 我的 .csproj 说 System.Data.SqlClient 存在。
  • 另外,bin 文件夹中有System.Data.SqlClient.dll。在我看来,项目有它,但 NLog 找不到它。
  • 我的猜测是&lt;dbProvider&gt; 的值不太正确。 NLog 似乎试图将其作为自己程序集的资源(如错误消息所述),而它可以在 calling 程序集中找到它作为资源。也许docs 可以提供帮助?
  • ^^ 有一个paragraph,如果遇到您所遇到的错误,它明确有一个可能的解决方案:“使用 Microsoft.Data.Sqlite 的完全限定名称的示例(对于 dotnet core 2.0): dbProvider="Microsoft.Data.Sqlite.SqliteConnection, Microsoft.Data.Sqlite, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60"" 所以你需要找到对应的System.Data.SqlClient 并使用它。

标签: c# nlog asp.net-core-2.0


【解决方案1】:

这是因为我为我的数据库目标写了&lt;dbProvider&gt;System.Data.SqlClient&lt;/dbProvider&gt;。看起来有人应该更新文档。

顺便说一句,我不知道为什么删除 dbProvider 对我有用。

工作代码如下:

<?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="info" internalLogFile="C:\Users\maliozt\source\MyProjects\MapApplication\MapApplication\Log2\asdaf.log">
<targets>
    <target
    xsi:type="File"
    name="mapFile"
    fileName="C:\Users\maliozt\source\MyProjects\MapApplication\MapApplication\Logs\${shortdate}.log"
    layout="${longdate}|${event-properties:item=EventId.Id}|${uppercase:${level}}|${logger}|${message} ${exception}" >
    </target>

    <target 
    xsi:type="Database" 
    name="mapDataBase">
        <commandText>INSERT INTO MapApplication.dbo.LogEntries(TimeStamp, Message, Level, Logger) VALUES(GETDATE(), @message, @level, @logger)</commandText>
        <parameter name="@message" layout="${message}" />
        <parameter name="@level" layout="${level}" />
        <parameter name="@logger" layout="${logger}" />
        <!--<dbProvider>System.Data.SqlClient</dbProvider>-->
        <connectionString>Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=master;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False</connectionString>
    </target>
</targets>
<rules>
    <logger name="*" minlevel="Warn" writeTo="mapFile" />
    <logger name="*" minlevel="Error" writeTo="mapDataBase" />
</rules>
</nlog>

【讨论】:

  • 在 oracle 数据库的情况下它对我不起作用。你能帮我做同样的事情吗?
  • 我想要,但我没有足够的 Oracle 知识。也许你需要写一些不同的东西而不是connectionString
  • 删除 dbProvider 仅适用于 Sql Server,因为 Sqlclient 是默认提供程序。这也是它不适用于 Oracle 的原因。对于 Oracle,您需要提供 dbProvider="Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess"。见github.com/nlog/NLog/wiki/Database-target
【解决方案2】:

就我而言,我发现错误来自表名

无效的对象名称“dbo.Journal”

我刚刚删除了“dbo”,它可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    相关资源
    最近更新 更多