[英]Nlog can't send logs to Oracle Database
We are trying to send logs to an Oracle Database but can't run the Nlogs because we receive an error message:我们正在尝试将日志发送到 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])
We have the Oracle.ManagedDataAccess.dll in the path folder where we run the process and our nlog config file is:我们在运行进程的路径文件夹中有 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>
NLog: 4.7.7 NLog:4.7.7
Do we need to assembly the dll?我们需要组装 dll 吗? Which could be the reason of this error?
这可能是这个错误的原因?
NLog with.Net Core And Oracle Database. NLog with .Net Core 和 Oracle 数据库。
I tried the below code and it's worked fine.我尝试了下面的代码,它运行良好。
below Nugets you must include in project在 Nugets 下面你必须包含在项目中
Add connectionstring information in appsetings.json在appsetings.json中添加connectionstring信息
nlog.config file must as below (edit connection string and log file path information as per you) 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>
Program.cs程序.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();
}
No configuration needed in Startup.cs class Startup.cs 中无需配置 class
Inject and use Logger in your controller like below在您的 controller 中注入并使用 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;
}
}
Thank you谢谢
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.