.NET Core log4net、NLog日志
NLog Config
.NET Core 和 ASP.NET Core 中的日志记录
Nlog配置文件变量
${basedir}:应用程序当前目录
${shortdate}:短日期【2022-01-06】
${longdate}:长日期【2022-01-06 14:05:20.4023】
${logger}: 记录器的名字
${event-properties:FileName}:自定义属性
${level}:记录等级【Trace,Debug,Info,Warn,Error,Fatal】
${uppercase}:转大写
${message}:调用Nlog时输入的内容
${callsite}:类名称
${callsite-linenumber}:文件行号
${hostname}:主机名
${environment} 环境变量
${exception} exception信息
${machinename} 名称
${mdc} 映射诊断
${mdlc} 异步映射诊断上下文
${ndc} 线程结构
${ndlc} 异步线程
${newline} 文字换行
${nlogdir} nlog.dll目录。
${performancecounter} 述性能计数器。
${processid} 当前进程标识符
${processinfo} 运行信息
${processname} 当前进程的名称。
${processtime} 该时间过程中格式HH:MM:ss.mmm。
${qpc} 高精度定时器,基于返回的值从queryperformancecounter(任选地)转换为秒。
${registry} 从注册表中的值。
${sequenceid} ID
${shortdate} 短时间 格式YYYY-MM-DD。
${sl-appinfo} Silverlight应用。
${specialfolder} 文件夹路径
${stacktrace} - 堆栈跟踪渲染器。
${tempdir} 临时目录中。
${threadid} 当前线程的标识符。
${threadname} 当前线程。
${ticks} 当前日期和时间。
${time} 24小时格式HH:MM:ss.mmm。
KaTeX parse error: Expected '}', got 'EOF' at end of input: {var} {var}-提供新的变量(4.1)
${windows-identity} indows线程标识信息(用户名)
1、管理 NuGet 程序包...
2、搜索 NLog,安装
3、在 web项目 根目录新建 NLog.config 配置文件
4、NLog.config 配置文件,代码如下(复制到输出目录:始终复制)
【注意:rules 节点优先级】
<?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">
<targets>
<!--屏幕打印消息-->
<target name="console" xsi:type="ColoredConsole" layout="${longdate}> ${message}"/>
<!--VS输出窗口-->
<target name="debugger" xsi:type="Debugger" layout="${longdate} | ${level:padding=-5} | ${message}" />
<!--保存至文件-->
<target name="info" xsi:type="File" maxArchiveFiles="30" fileName="${basedir}/Logs/Info/info${shortdate}.txt"
layout="${date:format=HH\:mm\:ss} | ${message}" />
<!--保存至文件-->
<target name="error" xsi:type="File" maxArchiveFiles="30" fileName="${basedir}/Logs/Error/error${shortdate}.txt"
layout="${date:format=HH\:mm\:ss} | ${message} | ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}" />
<target xsi:type="Null" name="blackhole" />
<!-- write log message to database(数据库) -->
<target name="database" xsi:type="Database"
connectionString="Data Source=.;Initial Catalog=dbFinance;User ID=sa;Password=000000;Persist Security Info=True;">
<commandText>
INSERT INTO Log(Timestamp,Level,Message,Action,Amount,StackTrace) VALUES (@time_stamp, @level, @message, @action, @amount, @stacktrace);
</commandText>
<!-- database connection parameters -->
<parameter name="@time_stamp" layout="${date}" />
<parameter name="@level" layout="${level:uppercase=true}" />
<parameter name="@message" layout="${message}" />
<parameter name="@action" layout="${event-context:item=Action}" />
<parameter name="@amount" layout="${event-context:item=Amount}" />
<parameter name="@stacktrace" layout="${stacktrace}" />
</target>
</targets>
<rules>
<!--Skip non-critical Microsoft logs and so log only own logs-->
<logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
<!--<logger name="*" writeTo="console" />-->
<!--<logger name="*" minlevel="Debug" writeTo="debugger" />-->
<logger name="*" minlevel="Info" maxlevel="Info" writeTo="info" />
<logger name="*" minlevel="Trace" writeTo="info" />
<logger name="*" minlevel="Error" writeTo="error" />
<logger name="*" minlevel="Error" writeTo="database" />
</rules>
</nlog>
*、NLog.config 配置文件,代码如下(复制到输出目录:始终复制)
${event-properties:FileName}自定义log文件名称
【推荐、推荐、推荐、推荐、推荐、推荐、推荐、推荐、推荐】
<?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">
<variable name="logDirectory" value="${basedir}/Logs"/>
<targets>
<!--保存至文件-->
<target name="info" xsi:type="File" maxArchiveFiles="30" fileName="${logDirectory}/Info/info${event-properties:FileName}${shortdate}.txt"
layout="${date:format=HH\:mm\:ss} ${message}" />
<rules>
<logger name="*" minlevel="Info" maxlevel="Info" writeTo="info" />
<logger name="*" minlevel="Error" writeTo="error" />
</rules>
</nlog>
5、调用方法
public class UserController : Controller
{
private static readonly ILogger _logger = LogManager.GetLogger("Logger");
Logger _log = LogManager.GetCurrentClassLogger();
public ActionResult Index()
{
_logger.Trace("trace...");
_logger.Debug("debug...");
_logger.Info("static info...");
_logger.Error("static error...");
_logger.Fatal("Fatal Message");
_log.Trace("trace...");
_log.Debug("debug...");
_log.Info("static info...");
_log.Error("static error...");
_log.Fatal("Fatal Message");
return View();
}
}
6、数据库表结构脚本
CREATE TABLE [dbo].[Log](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[Timestamp] [datetime] NULL,
[Level] [nvarchar](500) NULL,
[Message] [nvarchar](500) NULL,
[Action] [nvarchar](500) NULL,
[Amount] [nvarchar](500) NULL,
[StackTrace] [nvarchar](500) NULL,
CONSTRAINT [PK_Log] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
=========【.NET Core WebApi方式】=========
管理 NuGet 程序包
添加 NLog.Extensions,NLog.Web.AspNetCore 引用
Startup.cs文件
using NLog.Web;
using NLog.Extensions.Logging;
namespace Web
{
public class Startup
{
NLog.Logger _log = NLog.LogManager.GetCurrentClassLogger();
public void ConfigureServices(IServiceCollection services)
{
_log.Info("123");
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
#region nlog
string path = AppContext.BaseDirectory;
//引入Nlog配置文件
loggerFactory.ConfigureNLog(path + @"\nlog.config");
//使用NLog作为日志记录工具
loggerFactory.AddNLog();
//使用NLog作为日志记录工具
//loggerFactory.AddNLog();
引入Nlog配置文件
//env.ConfigureNLog(path + @"\nlog.config");
#endregion
_log.Info("222");
app.UseHttpsRedirection();
app.UseMvc();
}
}
}
Controller调用(https://localhost:44319/api/default)
using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using NLog;
namespace Web.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class DefaultController : ControllerBase
{
private readonly Logger nLogger = NLog.LogManager.GetCurrentClassLogger();
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
nLogger.Info("3 Info Message" + DateTime.Now.ToString("yyyy-MM-dd"));
nLogger.Error("4 Error Message" + DateTime.Now.ToString("yyyy-MM-dd"));
return new string[] { "value1", "value2" };
}
}
}
*
=========.NET Core WinForms方式=========
1、添加nlog.config文件【始终复制】
2、管理 NuGet 程序包(N)...
NLog
NLog.Extensions.Logging
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.SqlServer
3、Program.cs
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NLog.Extensions.Logging;
using System;
using System.Windows.Forms;
namespace WinFormsApp1
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.SetHighDpiMode(HighDpiMode.SystemAware);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
NLog.LogManager.LoadConfiguration("nlog.config").GetCurrentClassLogger();
var configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).Build();
IServiceCollection services = new ServiceCollection();
services.AddDbContext<TestDbContext>(opt =>
{
opt.UseSqlServer(configuration.GetConnectionString("Default"));
});
services.AddTransient<ILoggerFactory, LoggerFactory>();
services.AddLogging(builder =>
{
builder.SetMinimumLevel(LogLevel.Trace);
builder.AddNLog(new NLogProviderOptions
{
CaptureMessageTemplates = true,
CaptureMessageProperties = true
});
});
IServiceProvider serviceProvider = services.BuildServiceProvider();
Application.Run(new Form1());
}
}
}
4、Form1.cs
using System;
using System.Windows.Forms;
namespace WinFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
logger.Trace("Sample trace message");
logger.Debug("Sample debug message");
logger.Info("Sample informational message");
logger.Warn("Sample warning message");
logger.Error("Sample error message");
logger.Fatal("Sample fatal error message");
}
}
}
*、NLogUtils调用
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WinForm
{
public class Test
{
NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
private void Check()
{
NLogUtils.GetInstance().Info(GetType().Name, "hello");
}
private void Check()
{
logger.WithProperty("FileName", GetType().Name).Info("hello");
}
}
}
*、NLogUtils.cs
using NLog;
namespace CoreLibrary
{
public class NLogUtils
{
public static Logger _logger;
private static volatile NLogUtils instance = null;
private static readonly object lockHelper = new object();
/// <summary>
/// 单体模式返回当前类的实例
/// </summary>
/// <returns></returns>
public static NLogUtils GetInstance()
{
if (instance == null)
{
lock (lockHelper)
{
if (instance == null)
{
instance = new NLogUtils();
_logger = LogManager.GetCurrentClassLogger();
}
}
}
return instance;
}
public void Info(string fileName, string message)
{
_logger.WithProperty("FileName", fileName).Info(message);
}
public void Error(string fileName, string message)
{
_logger.WithProperty("FileName", fileName).Error(message);
}
public void Debug(string fileName, string message)
{
_logger.WithProperty("FileName", fileName).Debug(message);
}
}
}
*
*
*
*
*