NLog
NLog是一个在.NET平台上使用的流行的日志记录库。它提供了可定制化的配置和灵活的日志记录规则,以便开发人员可以在应用程序中轻松地添加日志记录功能。
# NLog的优点
使用NLog日志库可以提供以下优点:
- 可配置:NLog允许开发人员根据需要配置日志记录规则,包括日志级别、日志格式、日志目标和日志事件过滤器。
- 灵活性:开发人员可以轻松地将NLog与多种应用程序和平台集成,包括ASP.NET、WPF和Windows服务等。
- 可扩展性:NLog支持多种扩展,包括目标(target)、过滤器(filter)、布局(layout)和日志事件属性(log event properties)。
# NLog的配置
# NLog的基本配置
以下是使用NLog进行基本配置的示例:
<nlog>
<targets>
<target name="console" type="Console" layout="${longdate} ${level} ${message}" />
<target name="file" type="File" fileName="logfile.txt" layout="${longdate} ${level} ${message}" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="console" />
<logger name="*" minlevel="Trace" writeTo="file" />
</rules>
</nlog>
在上面的配置中,我们定义了两个目标(target),一个是将日志记录到控制台中,另一个是将日志记录到文件中。我们还定义了两条规则(rule),用于指定哪些日志应该写入哪个目标中。
# NLog的目标
NLog目标定义了应用程序日志记录的位置。以下是使用NLog定义目标的示例:
<targets>
<target name="console" type="Console" layout="${longdate} ${level} ${message}" />
<target name="file" type="File" fileName="logfile.txt" layout="${longdate} ${level} ${message}" />
<target name="database" type="Database">
<connectionString>Database=MyDb;Server=MyServer;User ID=MyUser;Password=MyPassword;</connectionString>
<commandText>INSERT INTO Logs (Date, Level, Message) VALUES (@Date, @Level, @Message);</commandText>
<parameter name="@Date" layout="${longdate}" />
<parameter name="@Level" layout="${level}" />
<parameter name="@Message" layout="${message}" />
</target>
</targets>
在上面的配置中,我们定义了三个目标:
将日志记录到控制台中;
将日志记录到文件中;
将日志记录到数据库中。
# NLog的过滤器
NLog过滤器允许开发人员根据需要指定要记录的日志事件。
常用2种过滤方式:
方式1.利用name路由过滤
方式2.利用filters配置过滤
官网参考:https://github.com/nlog/nlog/wiki/Filtering-log-messages
# 方式1(利用name路由过滤)
name 名称(*代表多个字符,?代表一个字符)
<logger name="WebApplog.Controllers.MyController"
level="Info"
writeTo="logb1"
final="true">
</logger>
<logger name="*.CommonServices"
level="Info"
writeTo="log_te"
final="true">
</logger>
demo(不同控制器输出不同日志文件)
<!-- 不同控制器,输出不同文件 如果匹配成功,就不再继续往下匹配 final="true" -->
<logger name="WebApplog.Controllers.ValuesController"
level="Info"
writeTo="loga1" final="true">
</logger>
<logger name="WebApplog.Controllers.MyController"
level="Info"
writeTo="logb1" final="true">
</logger>
<target name="loga1"
xsi:type="File"
fileName="${basedir}\logs\${shortdate}a1.txt"
layout="${longdate} ${level} ${message}" />
<target name="logb1"
xsi:type="File"
fileName="${basedir}\logs\${shortdate}b1.txt"
layout="${longdate} ${level} ${message}" />
# 方式2.利用filters配置过滤
参考:
https://github.com/nlog/nlog/wiki/Filtering-log-messages
https://github.com/nlog/nlog/wiki/When-filter
https://github.com/nlog/nlog/wiki/WhenContains-filter
demo1:
<logger name="WebApplog.Controllers.*"
level="Trace"
writeTo="filemy1,filemyjson1">
<!--
defaultAction="Log" 就是默认写入
defaultAction="Ignore" 就是默认忽略,不写入
参考: https://github.com/nlog/nlog/wiki/When-filter -->
<filters defaultAction="Ignore">
<!-- action="Ignore" 满足条件就忽略掉,不写日志
action="Log" 满足条件就写日志
-->
<!-- 因为消息中包含 orderinfo,所以下面2种判断方式都是可以的
<when condition="contains(message, 'orderinfo')" action="Log" />
<when condition="starts-with(message, 'orderinfo')" action="Log" />
-->
<when condition="starts-with(message, 'orderinfo')" action="Log" />
</filters>
</logger>
demo2:同一个文件的日志,用不同字符区分写到不同log
利用whenContains
<!-- final="true" -->
<logger name="*.CommonServices"
level="Info"
writeTo="log_BoardBindController" >
<filters defaultAction="Ignore">
<!--
<when condition="contains(message, 'spiapi.Controllers.BoardBindController')" action="Log" ></when>
-->
<!--
whenContains 标识也可以过滤
layout:比较对象 一般用 ${message}
action="Ignore" 满足条件就忽略掉,不写日志
action="Log" 满足条件就写日志
substring 就是要匹配的字符串
ignoreCase 忽略大小写 默认:False
https://github.com/nlog/nlog/wiki/WhenContains-filter
-->
<whenContains layout="${message}"
substring="spiapi.Controllers.BoardBindController"
action="LogFinal"
ignoreCase="true"/>
</filters>
</logger>
<!-- final="true" -->
<logger name="*.CommonServices"
level="Info"
writeTo="log_BoardTakeController" >
<filters defaultAction="Ignore" >
<!--
<when condition="contains(message, 'spiapi.Controllers.BoardTakeController')" action="Log" ></when>
-->
<whenContains layout="${message}"
substring="spiapi.Controllers.BoardTakeController"
action="LogFinal"
ignoreCase="true"/>
</filters>
</logger>
官网demo
<!-- 官网demo,留着参考
<when condition="exception != null" action="Log" />
<when condition="length(message) > 100" action="Ignore" />
<when condition="'${OnHasProperties:1}' != ''" action="Ignore" />
<when condition="logger == 'MyApps.SomeClass'" action="Ignore" />
<when condition="(level >= LogLevel.Debug and contains(message, 'PleaseDontLogThis')) or level==LogLevel.Warn" action="Ignore" />
<when condition="not starts-with(message, 'PleaseLogThis')" action="Ignore" />
-->
以下是使用NLog定义过滤器的示例:
<targets>
<target name="console" type="Console" layout="${longdate} ${level} ${message}" />
<target name="file" type="File" fileName="logfile.txt" layout="${longdate} ${level} ${message}" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="console" />
<logger name="*" minlevel="Warn" writeTo="file">
<filters>
<when condition="'${message}' contains 'error'" action="Ignore" />
</filters>
</logger>
</rules>
在上面的配置中,我们定义了两个目标和两条规则。第二个规则包含一个过滤器,用于忽略包含“error”字样的日志事件。
# NLog的布局
NLog布局定义了日志事件的格式。以下是使用NLog定义布局的示例:
<targets>
<target name="console" type="Console" layout="${longdate} ${level} ${message}" />
<target name="file" type="File" fileName="logfile.txt" layout="${longdate} ${level} ${message}" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="console" />
<logger name="*" minlevel="Trace" writeTo="file">
<layout type="JsonLayout">
<attribute name="time" layout="${longdate}" />
<attribute name="level" layout="${level}" />
<attribute name="message" layout="${message}" />
</layout>
</logger>
</rules>
在上面的配置中,我们定义了两个目标和两条规则。第二个规则包含了一个自定义的布局类型JsonLayout,用于将日志事件以JSON格式记录到文件中。
# NLog的日志事件属性
NLog日志事件属性允许开发人员将自定义属性添加到日志事件中。以下是使用NLog定义日志事件属性的示例:
var logger = LogManager.GetCurrentClassLogger();
logger.Info("Starting application {AppName}...", "My Application");
在上面的示例中,我们使用日志记录器(logger)对象的Info方法将一条带有自定义属性的日志事件记录到日志中。
# NLog的使用示例
# 在ASP.NET Core中使用NLog
要在ASP.NET Core中使用NLog,可以执行以下步骤:
- 将NLog.Web.AspNetCore包添加到项目中。
- 在Startup.cs文件中添加以下代码:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddNLog();
app.AddNLogWeb();
...
}
- 在appsettings.json文件中添加以下代码:
"NLog": {
"targets": {
"logfile": {
"type": "File",
"fileName": "${basedir}/logs/${shortdate}.log",
"layout": {
"type": "JsonLayout",
"includeAllProperties": true,
"excludeProperties": "CallerMemberName,CallerFilePath,CallerLineNumber"
}
}
},
"rules": [
{
"logger": "*",
"minLevel": "Info",
"writeTo": "logfile"
}
]
}
在上面的示例中,我们定义了一个名为logfile的目标,将日志记录到一个文件中,并使用JsonLayout格式化日志事件。我们还定义了一条规则,将所有级别为Info及以上的日志事件写入logfile目标中。
# 在WPF中使用NLog
要在WPF中使用NLog,可以执行以下步骤:
- 将NLog.Config和NLog.dll添加到项目中。
- 在App.xaml.cs文件中添加以下代码:
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
var logger = LogManager.GetCurrentClassLogger();
logger.Info("Application started.");
}
protected override void OnExit(ExitEventArgs e)
{
base.OnExit(e);
var logger = LogManager.GetCurrentClassLogger();
logger.Info("Application exited.");
}
}
在上面的示例中,我们使用日志记录器(logger)对象的Info方法记录应用程序的启动和退出事件。
# Prism中使用依赖注入模式使用nlog
# 1.安装nuget:NLog.Extensions.Logging
# 2.注册,app.xmal.cs文件
Microsoft.Extensions.Logging.ILogger logger;
protected override void RegisterTypes ( IContainerRegistry containerRegistry )
{
var factory = new NLog.Extensions.Logging.NLogLoggerFactory();
logger = factory.CreateLogger( "" );
//下面这个是加载指定名字 nlog.config里面: <logger name="mylognameabc" level="Info" writeTo="mylogfileabc"/>
//Microsoft.Extensions.Logging.ILogger logger = factory.CreateLogger( "mylognameabc" );
containerRegistry.RegisterInstance( logger );
}
# 3.依赖注入
IRegionManager _regionManager;
ILogger logger;
public LogWindowViewModel ( IRegionManager regionManager , ILogger logger )
{
this._regionManager = regionManager;
this.logger = logger;
}
# 4.调用
private DelegateCommand _AButtonClickCommand;
public DelegateCommand AButtonClickCommand => _AButtonClickCommand ?? ( _AButtonClickCommand = new DelegateCommand( () =>
{
//导航
this._regionManager.RequestNavigate( "ContentRegion" , "AAAUC" );
//写日志
this.logger.LogInformation( "msg:主窗体写入" );
} ) );
# 在Windows服务中使用NLog
要在Windows服务中使用NLog,可以执行以下步骤:
- 将NLog.Config和NLog.dll添加到项目中。
- 在服务类中添加以下代码:
public partial class MyService : ServiceBase
{
private readonly ILogger _logger;
public MyService()
{
InitializeComponent();
_logger = LogManager.GetCurrentClassLogger();
}
protected override void OnStart(string[] args)
{
_logger.Info("Service started.");
}
protected override void OnStop()
{
_logger.Info("Service stopped.");
}
}
在上面的示例中,我们使用日志记录器(logger)对象的Info方法记录服务的启动和停止事件。
# 总结
NLog是一个功能强大的日志记录库,提供了可定制化的配置和灵活的日志记录规则。使用NLog,开发人员可以轻松地将日志记录功能集成到.NET应用程序中,并以多种方式记录日志事件,包括控制台、文件和数据库。使用示例中提到的几种场景,分别在ASP.NET Core、WPF和Windows服务中使用NLog,可以帮助开发人员更好地理解和使用NLog库。