.Net Core NLog+oracel

发布时间 2023-08-03 22:02:24作者: qfccc

简介

NLog是一个灵活且免费的日志记录平台,适用于各种.NET平台,包括.NET标准。 NLog 使写入多个目标变得容易。(数据库、文件、控制台)并动态更改日志记录配置。

引用


<ItemGroup>
    <PackageReference Include="NLog" Version="5.2.0" />
    <!-oracle需要装NLog.Database-->
    <PackageReference Include="NLog.Database" Version="5.2.0" />  
    <PackageReference Include="NLog.Web.AspNetCore" Version="5.3.0" />
    <PackageReference Include="Oracle.ManagedDataAccess.Core" Version="3.21.100" />
</ItemGroup>

Program.cs

//var logger = NLog.LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger();
//logger.Debug("init main");
//nlog
builder.Logging.ClearProviders(); //删除其他日志
builder.Logging.AddNLog("Config/nlog.config");
builder.Host.UseNLog();
if (app.Environment.IsDevelopment())
{

    app.UseHsts();
}

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"
  throwExceptions="true"
  internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">

  <targets>
    <!--存到文件-->
    <target xsi:type="File" name="allfile" fileName="logs/all/nlog-all-${shortdate}.log"
             layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />

    <target xsi:type="File" name="ownFile" fileName="logs/my/nlog-my-${shortdate}.log"
             layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
    <target xsi:type="Null" name="blackhole" />

    <!--Console Target for hosting lifetime messages to improve Docker / Visual Studio startup detection -->
    <target xsi:type="Console" name="lifetimeConsole" layout="${MicrosoftConsoleLayout}" />
    <target xsi:type="File" name="ownFile-web" fileName="c:\temp\nlog-AspNetCore-own-${shortdate}.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}" />

    <!--存入Oracle数据库-->
    <target name="database" xsi:type="Database"
             dbProvider="Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess"
              connectionString="Data Source=192.168.1.11/orcl;user id=admin;password=123456">
      <!--这里的插入语句,注意最后不要加分号,否则会报错。另外,Oracle中需要用":",用"@"会报错-->
      <commandText>
        insert into LOGS (
        LOG_ID, LOG_APPLICATION, LOG_DATE, LOG_LEVEL, LOG_MESSAGE,
        LOGGER, LOG_CallSite, LOG_Exception
        ) values (
        SEQ_LOGID.nextval, :L_Application, :L_Date, :L_Level, :L_Message,
        :Logger, :Callsite, :L_Exception
        )
      </commandText>
      <parameter name=":L_Application" layout="Test" />
      <parameter name=":L_Date" layout="${date}" />
      <parameter name=":L_Level" layout="${level}" />
      <parameter name=":L_Message" layout="${message}" />
      <parameter name=":Logger" layout="${logger}" />
      <parameter name=":CallSite" layout="${callsite:filename=true}" />
      <parameter name=":L_Exception" layout="${exception:tostring}" />
    </target>
  </targets>

  <rules>
    <!-- add your logging rules here -->
    <logger name="Microsoft.Hosting.Lifetime" minlevel="Info" writeTo="lifetimeConsole, ownFile-web" final="true" />
    <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
    <!--这里全部使用最高等级Trace,即可以记录所有类型日志。可以根据需要降低等级,如使用Info,则仅记录Info及以上的日志,Trace、Debug日志不记录-->
    <logger name="*" minlevel="Trace" writeTo="database" />
  </rules>
</nlog>

数据库

CREATE TABLE LOGS
   (    
   "LOG_ID" NUMBER not null primary key,
    "LOG_APPLICATION" VARCHAR2(100 BYTE), 
    "LOG_DATE" NVARCHAR2(30), 
    "LOG_LEVEL" VARCHAR2(20 BYTE), 
    "LOG_MESSAGE" VARCHAR2(1000 BYTE), 
    "LOGGER" VARCHAR2(100 BYTE), 
    "LOG_CALLSITE" VARCHAR2(200 BYTE), 
    "LOG_EXCEPTION" VARCHAR2(1000 BYTE)
   ) ;

CREATE SEQUENCE SEQ_LOGID 
INCREMENT BY 1 
MAXVALUE 9999999999999999999999999999 
MINVALUE 1 NOCACHE;

测试

using Microsoft.AspNetCore.Mvc;

namespace Cnpc.Com.Ioc.WebApp.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class LoggerController : ControllerBase
    {
        ILogger<LoggerController> _Logger;
        public LoggerController(ILogger<LoggerController> logger)
        {
            _Logger = logger;
            _Logger.LogInformation("666");
        }

        [HttpGet]
        public string GetTest()
        {
            _Logger.LogInformation("777");
            _Logger.LogDebug("我是debug");  
            try
            {
                throw new Exception("出错了");
            }
            catch (Exception ex)
            {
                _Logger.LogError(ex.Message);
                throw;
            }

            return "xxx";
        }
    }
}