Asp.Net Core 로그 기록 방법

13577 단어 Asp.NetCoreNLog
수요
1.데이터베이스 에 로그 자동 기록,파일 에 쓰기
2.apptsettings.json 데이터베이스 연결 이 변경 되면 NLog 의 연결 주 소 를 바 꿀 필요 가 없습니다.사이트 나 프로젝트 를 시작 할 때 자동 으로 변동 을 감지 하고 변경 합 니 다.apptsettings.json 을 기준 으로 동기 화 를 유지 합 니 다.
3.로 그 를 쓸 때,로그 타 입 사용자 정의 필드 기록 로그 타 입 을 추가 합 니 다.예 를 들 어 사이트 로그,미들웨어 로그 등 입 니 다.
4.로 그 를 작성 하 는 방법 을 통일 합 니 다.로 그 를 기록 할 때마다 get 대상(또는 주입 에 의존)을 사용 하지 않 아 도 됩 니 다.
설치 패키지
nuget 에 NLogNLog.Web.AspNetCore 을 설치 하 는데 이 두 개 는 NLog 관련 가방 입 니 다.
데이터 베 이 스 를 기록 하 는 데이터베이스 어댑터 도 설치 해 야 합 니 다.MySQL 데이터 베 이 스 를 기록 하기 때문에 MySql.Data 을 설치 합 니 다.
SQL server 데이터베이스 에 기록 하려 면 Microsoft.Data.SqlClient 을 설치 해 야 합 니 다.

NLog.config 프로필 내용
사이트 루트 디 렉 터 리 에 NLog.config 프로필 을 새로 만 들 었 습 니 다.이 파일 의'속성'을 오른쪽 클릭 하여 출력 디 렉 터 리 로 복사 하 십시오."항상 복사"

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="false" 
 internalLogLevel="Off" 
 internalLogFile="NlogRecords.log">
 <!--Nlog       Off  。    ,     Trace      ,  Debug  -->
 <extensions>
 <add assembly="NLog.Web.AspNetCore" />
 </extensions>
 <targets>
 <!--            
 dbProvider   mysql  sqlserver,         ,       sql      
 MYSQL:
 dbProvider="MySql.Data.MySqlClient.MySqlConnection, MySql.Data"
 connectionString="server=localhost;database=BaseMIS;user=root;password=123456"
 MSSQL:
 dbProvider="Microsoft.Data.SqlClient"
 connectionString="Server=127.0.0.1;Database=BaseMIS;User ID=sa;Password=123456"
 -->
 <target name="log_database" xsi:type="Database" dbProvider="MySql.Data.MySqlClient.MySqlConnection, MySql.Data"
  connectionString="server=192.168.137.10;database=TestNLog;user=root;password=mysql@local">
 <commandText>
 INSERT INTO TblLogrecords 
 (LogDate,LogLevel,LogType,Logger,Message,MachineName,MachineIp,NetRequestMethod
 ,NetRequestUrl,NetUserIsauthenticated,NetUserAuthtype,NetUserIdentity,Exception)
 VALUES
 (@LogDate,@LogLevel,@LogType,@Logger,@Message,@MachineName,@MachineIp,@NetRequestMethod
 ,@NetRequestUrl,@NetUserIsauthenticated,@NetUserAuthtype,@NetUserIdentity,@Exception);
 </commandText>
 <parameter name="@LogDate" layout="${date}" />
 <parameter name="@LogLevel" layout="${level}" />
 <parameter name="@LogType" layout="${event-properties:item=LogType}" />
 <parameter name="@Logger" layout="${logger}" />
 <parameter name="@Message" layout="${message}" />
 <parameter name="@MachineName" layout="${machinename}" />
 <parameter name="@MachineIp" layout="${aspnet-request-ip}" />
 <parameter name="@NetRequestMethod" layout="${aspnet-request-method}" />
 <parameter name="@NetRequestUrl" layout="${aspnet-request-url}" />
 <parameter name="@NetUserIsauthenticated" layout="${aspnet-user-isauthenticated}" />
 <parameter name="@NetUserAuthtype" layout="${aspnet-user-authtype}" />
 <parameter name="@NetUserIdentity" layout="${aspnet-user-identity}" />
 <parameter name="@Exception" layout="${exception:tostring}" />
 </target>
 <target name="log_file" xsi:type="File" fileName="${basedir}/logs/${shortdate}.log" 
  layout="${longdate} | ${level:uppercase=false} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}" />
 </targets>
 <rules>
 <!--       Microsoft       -->
 <logger name="Microsoft.*" final="true" />
 <!-- BlackHole without writeTo -->
 <!--          ,    name  ,cs         , logger   name    -->
 <logger name="logdb" writeTo="log_database" />
 <logger name="logfile" writeTo="log_file" />
 </rules>
</nlog>
설정 파일 판독 nlog 루트:autoReload 속성,true 시,NRog.config 파일 에 변동 이 있 으 면 새 설정 이 자동 으로 적 용 됩 니 다(단,지연 이 있 을 수 있 습 니 다.몇 초가 지나 야 적 용 됩 니 다)internalLogLevel 속성 을 설정 한 후,출력 한 것 은 NLog 내부 에 있 는 자신의 로그 기록 입 니 다.NLog 이상/설정 파일 이 잘 맞지 않 으 면,Off 를 Trace 나 Debug 로 변경 하여 NlogRecords.log 의 내용 internalLogFile 속성 을 볼 수 있 습 니 다.경 로 를 설정 할 수 있 습 니 다.예 를 들 어 기본 c:\temp
log-internal.log
에 extensions 노드 가 추가 되 었 습 니 다.NLog.Web.AspNetCore 패키지 targets 노드 에서 각종 기록 방식 의 설정 첫 번 째 target 노드 를 참조 하 였 기 때문에 name 은 log 임 을 알 수 있 습 니 다.database,여기 name 과 아래 logger 에서 writeTo 속성 은 xsi:type="Database"에 대응 합 니 다.데이터 베 이 스 를 기록 한 dbProvider 속성 은 데이터베이스 어댑터 입 니 다.MySQL 은 MySql.Data.MySqlClient.MySqlConnection, MySql.Data 이 고 SQL server 는 Microsoft.Data.SqlClient 입 니 다.다른 데이터베이스 어댑터 는 공식 문서 에서 connection String 을 볼 수 있 습 니 다.즉,연결 문자열 입 니 다.commandText 서브 노드 는 데이터 베 이 스 를 삽입 할 때 insert 문 입 니 다.TblLogrecords 표 에 기 록 된 것 을 볼 수 있 습 니 다.표 구 조 는 다음 과 같 습 니 다.parameter 서브 노드 는 insert 문장의 각 매개 변수 입 니 다.name="@LogType" 매개 변수 가 있 습 니 다.layot="${event-properties:item=LogType}"은@LogType 매개 변수의 값 을 event-operties 의 LogType 에서 가 져 옵 니 다.이 뒷글 은 용법 의 나머지 매개 변 수 는 모두 NLog 자체 의 내용 입 니 다.aspnet- 으로 시작 하 는 것 은 NLog.Web.AspNetCore 패키지 에서 제공 하 는 방법 layout render 공식 문서 두 번 째 target 노드 입 니 다.name 은 log 입 니 다.file,여기 name 과 아래 logger 의 writeTo 속성 은 xsi:type="File"에 대응 합 니 다.즉,파일 fileName 속성 에 기록 하 는 것 은 파일 이름 입 니 다.현재 디 렉 터 리 에 기 록 된 logs 폴 더 이 며,날짜 에 따라 layot 속성 은 로 그 를 기록 하 는 형식 rules 노드 입 니 다.각 로그 기록 기 logger 설정 의 첫 번 째 logger 설정 은 모든 Microsoft 구성 요소 의 로그 기록 을 건 너 뛰 었 습 니 다.final 은 현재 규칙 을 마지막 규칙 으로 표시 합 니 다.그 후의 규칙 은 즉시 일치 해도 실행 되 지 않 는 다.두 번 째 logger name="logdb",이 로그 기록 기 이름 은 logdb 이 며,적합 한 log 입 니 다.database 규칙,즉 데이터 베 이 스 를 기록 하 는 것 입 니 다.여러 규칙 을 맞 추 려 면 쉼표 로 구분 하고 나머지 규칙 은 https://www.jb51.net/article/173004.htm 을 참고 할 수 있 습 니 다.  데이터베이스 구성 데이터 시트 구조
이 데이터 베 이 스 는 TestNLog 입 니 다.

CREATE DATABASE IF NOT EXISTS `TestNLog`;
USE `TestNLog`;

-- Dumping structure for table TestNLog.TblLogrecords
CREATE TABLE IF NOT EXISTS `TblLogrecords` (
 `Id` int(11) NOT NULL AUTO_INCREMENT,
 `LogDate` datetime(6) NOT NULL,
 `LogLevel` varchar(50) NOT NULL,
 `LogType` varchar(50) DEFAULT NULL,
 `Logger` varchar(256) NOT NULL,
 `Message` longtext,
 `MachineName` varchar(50) DEFAULT NULL,
 `MachineIp` varchar(50) DEFAULT NULL,
 `NetRequestMethod` varchar(10) DEFAULT NULL,
 `NetRequestUrl` varchar(500) DEFAULT NULL,
 `NetUserIsauthenticated` varchar(10) DEFAULT NULL,
 `NetUserAuthtype` varchar(50) DEFAULT NULL,
 `NetUserIdentity` varchar(50) DEFAULT NULL,
 `Exception` longtext,
 PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=96 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
사이트 설정 연결
apptsettings.json 에 ConectionStrings 노드 추가:

"ConectionStrings": {
 "MySqlConnection": "server=192.168.137.10;database=TestNLog;user=root;password=mysql@local"
 }
통합 로그 기록 방법
웹 사이트 아래 CommonUtils 폴 더 를 새로 만 들 고 NLogUtil.cs 파일 을 추가 합 니 다(LogType 정의 포함).

using NLog;
using NLog.Config;
using System;
using System.ComponentModel;
using System.Linq;
using System.Xml.Linq;

namespace NLogUsage.CommonUtils
{
 public enum LogType
 {
 [Description("  ")]
 Web,
 [Description("   ")]
 DataBase,
 [Description("Api  ")]
 ApiRequest,
 [Description("   ")]
 Middleware
 }
 public static class NLogUtil
 {
 public static Logger dbLogger = LogManager.GetLogger("logdb");
 public static Logger fileLogger = LogManager.GetLogger("logfile");
 /// <summary>
 ///        
 /// </summary>
 /// <param name="logLevel">    </param>
 /// <param name="logType">    </param>
 /// <param name="message">  </param>
 /// <param name="exception">  </param>
 public static void WriteDBLog(LogLevel logLevel, LogType logType, string message, Exception exception = null)
 {
  LogEventInfo theEvent = new LogEventInfo(logLevel, dbLogger.Name, message);
  theEvent.Properties["LogType"] = logType.ToString();
  theEvent.Exception = exception;
  dbLogger.Log(theEvent);
 }
 /// <summary>
 ///       
 /// </summary>
 /// <param name="logLevel">    </param>
 /// <param name="logType">    </param>
 /// <param name="message">  </param>
 /// <param name="exception">  </param>
 public static void WriteFileLog(LogLevel logLevel, LogType logType, string message, Exception exception = null)
 {
  LogEventInfo theEvent = new LogEventInfo(logLevel, fileLogger.Name, message);
  theEvent.Properties["LogType"] = logType.ToString();
  theEvent.Exception = exception;
  fileLogger.Log(theEvent);
 }

 /// <summary>
 ///   NLog    sql       
 /// </summary>
 /// <param name="nlogPath"></param>
 /// <param name="sqlConnectionStr"></param>
 public static void EnsureNlogConfig(string nlogPath, string sqlConnectionStr)
 {
  XDocument xd = XDocument.Load(nlogPath);
  if (xd.Root.Elements().FirstOrDefault(a => a.Name.LocalName == "targets")
  is XElement targetsNode && targetsNode != null &&
  targetsNode.Elements().FirstOrDefault(a => a.Name.LocalName == "target" && a.Attribute("name").Value == "log_database")
  is XElement targetNode && targetNode != null)
  {
  if (!targetNode.Attribute("connectionString").Value.Equals(sqlConnectionStr))//      
  {
   //        dbProvider   
   targetNode.Attribute("connectionString").Value = sqlConnectionStr;
   xd.Save(nlogPath);
   //           (   NLog   autoReload,   )
   LogManager.Configuration = new XmlLoggingConfiguration(nlogPath);
  }
  }
 }
 }
}
NLog 의존 주입 설정
웹 사이트 Program.cs 파일 에 Create HostBuilder 방법 에 다음 과 같은 내용 을 추가 합 니 다.

//using NLog.Web;
.ConfigureLogging(logging => { 
  logging.ClearProviders(); 
  logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); 
  }).UseNLog(); // NLog:     Nlog
완성 후 다음 그림 과 같이:

시작 항목 동기 화 연결 문자열
웹 사이트 시작 Program.cs 의 논리 수정:

//using NLogUsage.CommonUtils;
//using Microsoft.Extensions.DependencyInjection;
public static void Main(string[] args)
{
 //CreateHostBuilder(args).Build().Run();
 var host = CreateHostBuilder(args).Build();
 try
 {
 using (IServiceScope scope = host.Services.CreateScope())
 {
  IConfiguration configuration = scope.ServiceProvider.GetRequiredService<IConfiguration>();
  //   appsettings.json       
  string sqlString = configuration.GetSection("ConectionStrings:MySqlConnection").Value;
  //  NLog.config       appsettings.json   
  NLogUtil.EnsureNlogConfig("NLog.config", sqlString);
 }
 //throw new Exception("    ");//for test

 //             
 //code
 NLogUtil.WriteDBLog(NLog.LogLevel.Trace, LogType.Web, "      ");
 host.Run();
 }
 catch (Exception ex)
 {
 //  nlog        (        /    )
 string errorMessage = "           ";
 NLogUtil.WriteFileLog(NLog.LogLevel.Error, LogType.Web, errorMessage, new Exception(errorMessage, ex));
 NLogUtil.WriteDBLog(NLog.LogLevel.Error, LogType.Web, errorMessage, new Exception(errorMessage, ex));
 throw;
 }
}
수정 완료 후 다음 그림 과 같이:

시작 검증
프로젝트 를 시작 하면 데이터베이스 와 파일 에 로 그 를 정상적으로 기록 할 수 있 습 니 다.

이상 은 이번에 소개 한 모든 관련 지식 입 니 다.여러분 의 학습 과 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기