从 NLog 写信给 Oracle



所以我有一个数据库目标将日志写入 Oracle 数据库表,但我似乎无法让它写入表。我尝试了各种数据库提供程序,通常会收到如下所示的错误

<target name="database" xsi:type="Database" connectionString="${var:ConnectionStrings}"     dbProvider="Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess"
commandType="Text" keepConnection="false"
commandText="INSERT INTO SAMS.LOG    (ID,  LOGLEVEL, MESSAGE, LOGGER, CALLSITE, EXCEPTIONDETAIL, USERNAME, IPADDRESS)
VALUES('',  
:LogLevel,
:Message,
:Logger,
:Callsite,
:ExceptionType,
:UserName,
:IpAddress);"  >
<parameter name="Logged" layout="${date}" />
<parameter name="LogLevel" layout="${level}" />
<parameter name="Message" layout="url: ${aspnet-request-url} | action: ${aspnet-mvc-action} | ${message}" />
<parameter name="Logger" layout="${logger}" />
<parameter name="Callsite" layout="${callsite:filename=true}" />
<parameter name="ExceptionType" layout="${exception:tostring}" />
<parameter name="UserName" layout="${aspnet-user-identity}" />
<parameter name="IpAddress" layout=" ${aspnet-request-ip}" />
</target>

这是我在这个过程中能够达到的最远的距离。它已尝试写入数据库,但连接字符串中存在某些问题。

2018-10-23 14:13:28.1934 Error DatabaseTarget(Name=database_wrapped): Error when writing to database. Exception: Oracle.ManagedDataAccess.Client.OracleException (0x80004005): ORA-12514: TNS:listener does not currently know of service requested in connect descriptor ---> OracleInternal.Network.NetworkException (0x000030E2): ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
at OracleInternal.Network.OracleCommunication.DoConnect(String tnsDescriptor)
at OracleInternal.ServiceObjects.OracleConnectionImpl.Connect(ConnectionString cs, Boolean bOpenEndUserSession, OracleConnection connRefForCriteria, String instanceName)
at OracleInternal.ConnectionPool.PoolManager`3.Get(ConnectionString csWithDiffOrNewPwd, Boolean bGetForApp, OracleConnection connRefForCriteria, String affinityInstanceName, Boolean bForceMatch)
at OracleInternal.ConnectionPool.OraclePoolManager.Get(ConnectionString csWithNewPassword, Boolean bGetForApp, OracleConnection connRefForCriteria, String affinityInstanceName, Boolean bForceMatch)
at OracleInternal.ConnectionPool.OracleConnectionDispenser`3.Get(ConnectionString cs, PM conPM, ConnectionString pmCS, SecureString securedPassword, SecureString securedProxyPassword, OracleConnection connRefForCriteria)
at Oracle.ManagedDataAccess.Client.OracleConnection.Open()
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(IList`1 logEvents)

My appsettings.json 包含连接字符串

"ConnectionStrings": {
"NLogDb": "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP) 
(HOST=fleetqadb.xxx.com)(PORT=1521))(CONNECT_DATA= 
(SERVICE_NAME=orcl.fleetqadb.xxx.com)));User 
Id=samsuser;Password=xxxxx;",
}

如果有人有任何想法,我将不胜感激!

我不知道NLog,但ORA-12514: TNS:listener does not currently know of service requested in connect descriptor意味着您要将数据插入到的数据库是未知的。

如果是纯甲骨文,我会说数据库的别名在 TNSNAMES 中不存在。奥拉

在您的情况下,您提供了"ConnectionString"(请注意:在消息的开头,您称之为connectionString,而在消息的末尾,您将其称为ConnectionStrings- 请注意尾随s,以及字母大小写。我不知道这些事情中的哪一个(或两个?

"数据源">是您尝试连接到的数据库。显然,你在那里写的东西是无效的。

我有天人。ORA 并且可以将我的数据库tnsping

C:>tnsping xe
TNS Ping Utility for 64-bit Windows: Version 11.2.0.2.0 - Production on 23-LIS-2018 21:07:09
Copyright (c) 1997, 2014, Oracle.  All rights reserved.
Used parameter files:
C:UserslfDocumentsE_0_librarysqlnet.ora

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = lflp.dt.center)(
PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)))
OK (10 msec)

我不是DBA,但是 - 检查您的hostservice_name值。

我的建议:作为一个service_name,只放orcl(而不是orcl.fleetqadb.xxx.com(,看看会发生什么。

最新更新