时间:2025-04-14 15:35
人气:
作者:admin
在Asp.Net Core项目中,日志记录是至关重要的一环,它能帮助我们在开发和生产环境中快速定位问题。NLog是一个功能强大且灵活的日志记录框架,在Asp.Net Core项目中广泛应用。通常,我们可以通过配置文件来设置NLog,但有时,使用代码进行配置能带来更多的灵活性和动态性。本文将详细介绍如何在Asp.Net Core项目中使用C#代码配置NLog。
首先,在项目中引入NLog和NLog.Web.AspNetCore包。可以通过NuGet包管理器控制台执行以下命令:
Install - Package NLog
Install - Package NLog.Web.AspNetCore
这两个包分别提供了NLog的核心功能和对Asp.Net Core的支持。
在项目中创建一个静态类,例如LogHelp,用于初始化和管理NLog配置。以下是一个示例代码:
public static class LogHelp
{
static LogHelp()
{
// 初始化NLog配置 使用代码配置
InitializeNLog();
}
public static LoggingConfiguration InitializeNLog()
{
// 创建日志配置对象
var config = new LoggingConfiguration();
// 配置文件目标
var fileTarget = new FileTarget("ownFile-web")
{
FileName = "${basedir}/Logs/allLog-${shortdate}.log",
Layout = "${newline}=======================================================================${newline}时间: [${date:format=yyyy-MM-dd HH:mm:ss}]" +
"${newline}类名: [${logger:shortName=true}]" +
"${newline}级别: [${uppercase:${level}}]" +
"${newline}消息: [${message}]" +
"${newline}异常: [${exception}]"
};
// 配置错误文件目标
var errorFileTarget = new FileTarget("errorFile")
{
FileName = "${basedir}/Logs/ErrorLog/errorLog-${shortdate}.log",
Layout = fileTarget.Layout
};
// 配置数据库目标
var dbTarget = new DatabaseTarget("database")
{
ConnectionString = ConfigHelp.ConnectionString,
CommandText = "insert into LogEntity (MachineName, Logged, Level, Message, Logger, Callsite, Exception) values (@MachineName, @Logged, @Level, @Message, @Logger, @Callsite, @Exception);",
};
switch (ConfigHelp.DbType)
{
case DbType.MySql:
dbTarget.DBProvider = typeof(MySql.Data.MySqlClient.MySqlConnection).AssemblyQualifiedName;
break;
case DbType.SqlServer:
dbTarget.DBProvider = typeof(Microsoft.Data.SqlClient.SqlConnection).AssemblyQualifiedName;
break;
case DbType.Sqlite:
dbTarget.DBProvider = typeof(Microsoft.Data.Sqlite.SqliteConnection).AssemblyQualifiedName;
break;
case DbType.Kdbndp:
dbTarget.DBProvider = typeof(Kdbndp.KdbndpConnection).AssemblyQualifiedName;
break;
default:
throw new Exception($"日志组件不支持{ConfigHelp.DbTypeStr}数据库");
}
dbTarget.Parameters.Add(new DatabaseParameterInfo("@MachineName", "${machinename}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@Logged", "${date}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@Level", "${level}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@Message", "${message}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@Logger", "${logger}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@Callsite", "${callsite}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@Exception", "${exception:tostring}"));
// 将目标添加到配置中
config.AddTarget(fileTarget);
config.AddTarget(errorFileTarget);
config.AddTarget(dbTarget);
// 配置日志规则
config.LoggingRules.Add(new LoggingRule("Microsoft.*", NLog.LogLevel.Trace, fileTarget) { Final = true });
config.LoggingRules.Add(new LoggingRule("*", NLog.LogLevel.Trace, fileTarget));
config.LoggingRules.Add(new LoggingRule("*", NLog.LogLevel.Error, errorFileTarget));
config.LoggingRules.Add(new LoggingRule("*", NLog.LogLevel.Trace, dbTarget));
// 应用配置
LogManager.Configuration = config;
return config;
}
private static Logger logger = LogManager.GetCurrentClassLogger();
public static void Info(string message)
{
Log(LogLevel.Info, message);
}
public static void Error(string message)
{
Log(LogLevel.Error, message);
}
public static void Error(Exception ex)
{
Log(LogLevel.Error, ex.Message, ex);
}
public static void LogError(string message, Exception? ex)
{
Log(LogLevel.Error, message, ex);
}
public static void Debug(string message)
{
Log(LogLevel.Debug, message);
}
public static void Warn(string message)
{
Log(LogLevel.Warn, message);
}
public static void Trace(string message)
{
Log(LogLevel.Trace, message);
}
private static void Log(LogLevel level, string message, Exception? ex = null)
{
try
{
if (ex != null)
logger.Log(level, ex, message);
else
logger.Log(level, message);
}
catch (Exception e)
{
Console.WriteLine("记录日志失败:" + e.Message);
}
}
}
LogHelp类的静态构造函数中,调用InitializeNLog方法来初始化NLog配置。InitializeNLog方法:
LoggingConfiguration对象,它是NLog配置的核心。FileTarget对象fileTarget,用于将日志记录到文件中。FileName属性指定了日志文件的路径和命名规则,这里使用了NLog的变量${basedir}表示项目的基目录,${shortdate}表示短日期格式。Layout属性定义了日志记录的格式,包括时间、类名、日志级别、消息和异常信息等。FileTarget对象errorFileTarget,专门用于记录错误日志。它的FileName指向错误日志文件的路径,Layout与普通日志文件相同。DatabaseTarget对象dbTarget,用于将日志记录到数据库中。ConnectionString属性设置数据库连接字符串,CommandText属性定义了插入日志数据到数据库表的SQL语句。switch语句根据ConfigHelp.DbType的值设置DBProvider属性,以支持不同类型的数据库,如MySQL、SqlServer、Sqlite和Kdbndp。Parameters属性添加SQL语句中的参数,这些参数对应日志记录中的各个字段。config.AddTarget方法将文件目标和数据库目标添加到配置中。LoggingRules属性添加多个日志规则。例如,config.LoggingRules.Add(new LoggingRule("Microsoft.*", NLog.LogLevel.Trace, fileTarget) { Final = true });这条规则表示对于所有以“Microsoft.”开头的日志记录器,记录所有级别的日志到fileTarget,并且设置Final = true表示这是一个最终规则,不再继续匹配其他规则。LogManager.Configuration中,使配置生效。Info、Error、Debug等,用于方便地记录不同级别的日志。这些方法最终都调用Log方法,在Log方法中,根据是否有异常信息,调用logger.Log方法进行实际的日志记录,并在记录失败时捕获异常并输出到控制台。在Asp.Net Core项目的Program.cs文件中,添加以下代码来使用我们配置好的NLog:
builder.Logging.AddNLog(LogHelp.InitializeNLog());
这里通过builder.Logging.AddNLog方法将我们在LogHelp类中初始化的NLog配置应用到项目的日志系统中。
通过以上步骤,我们成功地在Asp.Net Core项目中使用C#代码配置了NLog。这种方式不仅让我们能够灵活地定制日志记录行为,还提高了项目的可维护性和部署的便利性。在实际项目中,可以根据具体需求进一步优化日志配置,例如添加更多的日志目标(如邮件、控制台等),调整日志级别和格式,以满足不同场景下的日志记录需求。希望本文能帮助你在Asp.Net Core项目中更好地利用NLog进行日志管理。
Microsoft Agent Framework Skills 执行 Scripts(实
EF Core 原生 SQL 实战:FromSql、SqlQuery 与对