Nlog 未写入 ORACLE DATABASE .net 6.0 Web 应用程序

问题描述 投票:0回答:1

我在 .NET 6 应用程序中配置了 Nlog,它正确记录到文件和控制台,但是当我尝试写入 ORACLE 数据库时,它会抛出 Nlog 内部日志文件中缺少 Select 关键字的错误。

下面是我的 nlog.config 文件。我使用 github 上的示例对其进行了配置,并更改了 ORACLE 所需的 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"
      throwConfigExceptions="true"
      internalLogLevel="Trace"
      internalLogFile="c:\Temp\nlog-internal.txt">

  <extensions>
    <add assembly="NLog.Web.AspNetCore"/>
  </extensions>

  <targets>
    <!-- Database Target: Logs to Oracle Database -->
    <target name="database" xsi:type="Database"
            dbProvider="Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess"
            connectionString ="Data Source=DataSource;User Id=username;Password=pwd;"
            commandText ="insert into LogTable(Level, Message, CreatedOn, Exception, URL, Logger, Action) values(:level, :message, :date, :exception, :url, :logger, :action)"
            commandType ="Text">
            <parameter name="level" layout="${level}" />
            <parameter name="message" layout="${message}" />
            <parameter name="date" layout="${longdate}" dbType="DateTime"/>
            <parameter name="exception" layout="${exception:format=ToString}" />
            <parameter name="url" layout="${aspnet-request-url}" />
            <parameter name="logger" layout="${logger}" />
            <parameter name="action" layout="${aspnet-mvc-action}" />
    </target>

    <!-- Console Target: Logs to Console -->
    <target name="console" xsi:type="ColoredConsole" layout="${longdate} ${logger} ${level:uppercase=true} - ${message}" />
  <target xsi:type="File" name="ownFile-web" fileName="c:\temp\nlog-AspNetCore6-own.log"
        layout="${longdate}|${event-properties:item=EventId:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}|${callsite}" />
  </targets>

  <rules>
    <!-- Log all messages to database and console -->
    <logger name="Microsoft.*" maxlevel="off" final="true" />
    <logger name="System.Net.Http.*" maxlevel="off" final="true" />
     <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
    <logger name="*" minlevel="Trace" writeTo="database,console" />
  </rules>
</nlog>

以下是我的 nlog 内部日志文件中的错误:

2023-11-08 07:45:15.3687 Trace DatabaseTarget(Name=database): Open connection.
2023-11-08 07:45:15.3756 Trace DatabaseTarget(Name=database): Executing Text: insert into LogTable(Level, Message, CreatedOn, Exception, URL, Logger, Action) values(:level, :message, :date, :exception, :url, :logger, :action)
2023-11-08 07:45:15.3756 Trace   DatabaseTarget: Parameter: 'level' = 'Info' (String)
2023-11-08 07:45:15.3756 Trace   DatabaseTarget: Parameter: 'message' = 'Successfully fetched data' (String)
2023-11-08 07:45:15.3756 Trace   DatabaseTarget: Parameter: 'date' = '11/08/2023 07:45:15' (DateTime)
2023-11-08 07:45:15.3910 Trace   DatabaseTarget: Parameter: 'exception' = '' (String)
2023-11-08 07:45:15.3910 Trace   DatabaseTarget: Parameter: 'url' = 'http://localhost/api/message/get' (String)
2023-11-08 07:45:15.3910 Trace   DatabaseTarget: Parameter: 'logger' = 'Controller' (String)
2023-11-08 07:45:15.3910 Trace   DatabaseTarget: Parameter: 'action' = 'GetPage' (String)
2023-11-08 07:45:15.4523 Error DatabaseTarget(Name=database): Error when writing to database. Exception: Oracle.ManagedDataAccess.Client.OracleException (0x80004005): ORA-00928: missing SELECT keyword
   at OracleInternal.ServiceObjects.OracleConnectionImpl.VerifyExecution(Int32& cursorId, Boolean bThrowArrayBindRelatedErrors, SqlStatementType sqlStatementType, Int32 arrayBindCount, OracleException& exceptionForArrayBindDML, Boolean& hasMoreRowsInDB, Boolean bFirstIterationDone)
   at OracleInternal.ServiceObjects.OracleCommandImpl.ExecuteNonQuery(String commandText, OracleParameterCollection paramColl, CommandType commandType, OracleConnectionImpl connectionImpl, Int32 longFetchSize, Int64 clientInitialLOBFS, OracleDependencyImpl orclDependencyImpl, Int64[]& scnFromExecution, OracleParameterCollection& bindByPositionParamColl, Boolean& bBindParamPresent, OracleException& exceptionForArrayBindDML, OracleConnection connection, Boolean isFromEF)
   at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteNonQuery()
   at NLog.Targets.DatabaseTarget.ExecuteDbCommandWithParameters(LogEventInfo logEvent, IDbConnection dbConnection, IDbTransaction dbTransaction)
   at NLog.Targets.DatabaseTarget.WriteLogEventSuppressTransactionScope(LogEventInfo logEvent, String connectionString)
c# oracle asp.net-core .net-6.0 nlog
1个回答
0
投票

ORA-00928
是常见的Oracle数据库错误代码。

在您的场景中,问题与SQL语句有关。语句有错误,然后我们会遇到

missing SELECT keyword
提示。

设置断点后,得到的输出语句的标准格式应该是:

insert into table_name (
       Column1
      ,Column2
      ,Column3)
values (
      'test1'
      'test2'
      ,1
);
© www.soinside.com 2019 - 2024. All rights reserved.