【问题标题】:Nlog can't send logs to Oracle DatabaseNlog 无法将日志发送到 Oracle 数据库
【发布时间】:2022-09-30 18:07:06
【问题描述】:

我们正在尝试将日志发送到 Oracle 数据库,但无法运行 Nlogs,因为我们收到一条错误消息:

2021-11-18 13:00:25.5506 Error DatabaseTarget(Name=oracle): Failed to create ConnectionType from DBProvider=Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess Exception: System.IO.FileNotFoundException: Could not load file or assembly \'Oracle.ManagedDataAccess, Culture=neutral, PublicKeyToken=null\'. The system cannot find the file specified.
File name: \'Oracle.ManagedDataAccess, Culture=neutral, PublicKeyToken=null\'
   at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, StackCrawlMarkHandle stackMark, ObjectHandleOnStack assemblyLoadContext, ObjectHandleOnStack type, ObjectHandleOnStack keepalive)
   at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, StackCrawlMark& stackMark, AssemblyLoadContext assemblyLoadContext)
   at System.RuntimeType.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase, StackCrawlMark& stackMark)
   at System.Type.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase)
   at NLog.Targets.DatabaseTarget.SetConnectionType()
   at NLog.Targets.DatabaseTarget.InitializeTarget()
2021-11-18 13:00:25.5726 Error Database Target[oracle]: Error initializing target Exception: System.IO.FileNotFoundException: Could not load file or assembly \'Oracle.ManagedDataAccess, Culture=neutral, PublicKeyToken=null\'. The system cannot find the file specified.
File name: \'Oracle.ManagedDataAccess, Culture=neutral, PublicKeyToken=null\'
   at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, StackCrawlMarkHandle stackMark, ObjectHandleOnStack assemblyLoadContext, ObjectHandleOnStack type, ObjectHandleOnStack keepalive)
   at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, StackCrawlMark& stackMark, AssemblyLoadContext assemblyLoadContext)
   at System.RuntimeType.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase, StackCrawlMark& stackMark)
   at System.Type.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase)
   at NLog.Targets.DatabaseTarget.SetConnectionType()
   at NLog.Targets.DatabaseTarget.InitializeTarget()
   at NLog.Targets.Target.Initialize(LoggingConfiguration configuration)
2021-11-18 13:00:25.5726 Trace Initializing BufferingWrapper Target[OracleDatabase_wrapped](Database Target[oracle])

我们在运行进程的路径文件夹中有 Oracle.ManagedDataAccess.dll,我们的 nlog 配置文件是:

      <target xsi:type=\"BufferingWrapper\" name=\"OracleDatabase\" bufferSize=\"100\" flushTimeout=\"5000\" slidingTimeout=\"false\">
      <target xsi:type=\"Database\" name=\"oracle\" dbProvider=\"Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess\" connectionString=\"${ui-connection-strings:item=oracle}\" keepConnection=\"true\">
            <commandText>
                insert into ....
            </commandText>
            <parameter name=\"....\" />

        </target>
      </target>

日志:4.7.7

我们需要组装dll吗?哪个可能是此错误的原因?

  • Oracle dll 是 32 位还是 64 位?如果您的代码是为 x86 或 x64 显式编译的,请检查它是否有效
  • 不熟悉connectionString值,但是${ui-connection-strings:item=oracle}是在某处定义的变量吗?它是否在 nlog 配置文件中定义?

标签: .net nlog oracle-manageddataaccess


【解决方案1】:

我尝试了下面的代码,它运行良好。

在 Nugets 下面你必须包含在项目中

  • NLog
  • NLog.Database
  • NLog.Extension.Logging
  • NLog.Web.AspNetCore
  • Oracle.ManagedDataAccess.Core

在 appsettings.json 中添加连接字符串信息

nlog.config 文件必须如下(根据您编辑连接字符串和日志文件路径信息)

<?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="Warn"
      internalLogFile="C:\temp\Logs\internal-nlog4txt">
    <extensions>
        <add assembly="NLog.Database"/>
        <add assembly="NLog.Web.AspNetCore"/>
    </extensions>

    <targets>
        <target name="database"
                xsi:type="Database"
                connectionString="${configsetting:item:=ConnectionStrings.your_connectionstring_namefrom_appsettings_json_file}"
                dbProvider="Oracle.ManagedDataAccess.Client.OracleConnection,Oracle.ManagedDataAccess"
                commandText="INSERT INTO APPLICATIONLOG (ACTIONTIME,DETAILS) VALUES (sysdate,:details)"
                commandType="Text">
            <parameter name="details" layout="${message}" />
        </target>
    </targets>
    
    <rules>
        <logger name="*" minlevel="Trace" writeTo="database" />
    </rules>
</nlog>

程序.cs

     public class Program
    {
        public static void Main(string[] args)
        {
            var logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
            try
            {
                //logger.Debug("init main function");
                CreateWebHostBuilder(args).Build().Run();
            }
            catch (Exception ex)
            {
                logger.Error(ex, "Error in init");
                throw;
            }
            finally
            {
                NLog.LogManager.Shutdown();
            }
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .ConfigureLogging(logging =>
                {
                    logging.ClearProviders();
                    logging.SetMinimumLevel(LogLevel.Information);
                })
                .UseNLog();
    }

Startup.cs 类中没有任何内容

在控制器中注入并使用 Logger,如下所示

public class ValuesController : ControllerBase
{
    private readonly ILogger<ValuesController> _logger;

    public ValuesController(ILogger<ValuesController> logger)
    {
        _logger = logger;
    }

    [HttpGet("{id}")]
    public ActionResult<IEnumerable<string>> Get(int id)
    {
        _logger.LogInformation("Start : Getting item details for {ID} ", id);

        List<string> list = new List<string>();

        list.Add("A");
        list.Add("B");

        _logger.LogInformation($"Completed : Item details for  {string.Join(", ", list)}");

        return list;
    }
}

谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 2022-07-07
    相关资源
    最近更新 更多