Asp.Net Core 로그 기록 방법
1.데이터베이스 에 로그 자동 기록,파일 에 쓰기
2.apptsettings.json 데이터베이스 연결 이 변경 되면 NLog 의 연결 주 소 를 바 꿀 필요 가 없습니다.사이트 나 프로젝트 를 시작 할 때 자동 으로 변동 을 감지 하고 변경 합 니 다.apptsettings.json 을 기준 으로 동기 화 를 유지 합 니 다.
3.로 그 를 쓸 때,로그 타 입 사용자 정의 필드 기록 로그 타 입 을 추가 합 니 다.예 를 들 어 사이트 로그,미들웨어 로그 등 입 니 다.
4.로 그 를 작성 하 는 방법 을 통일 합 니 다.로 그 를 기록 할 때마다 get 대상(또는 주입 에 의존)을 사용 하지 않 아 도 됩 니 다.
설치 패키지
nuget 에
NLog
과 NLog.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;
}
}
수정 완료 후 다음 그림 과 같이:시작 검증
프로젝트 를 시작 하면 데이터베이스 와 파일 에 로 그 를 정상적으로 기록 할 수 있 습 니 다.
이상 은 이번에 소개 한 모든 관련 지식 입 니 다.여러분 의 학습 과 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
easyui 내 보 내기 excel 다운로드 상 자 를 꺼 낼 수 없 는 해결 방법이전에 ajax 로 만 든 코드 는 다음 과 같 습 니 다 (ActionUrl 은 일반 처리 프로그램 ashx 의 경로 입 니 다). 다운로드 상 자 를 팝 업 할 수 없습니다. 직접 브 라 우 저 주소 표시 줄 에...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.