安装NLog
asp.net core需要使用另外一个教程
在VS里安装NLog.Config
包,这个包会自动安装NLog
包和NLog.Schema
包。
NLog.Config
包会在vs项目中自动生成一个NLog.config
文件。
配置nlog的输出
NLog只会在配置一个(或更多)NLog目标(Target)的情况下产生输出。
NLog可以通过添加一个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">
<targets>
<target name="logfile" xsi:type="File" fileName="file.txt" />
<target name="logconsole" xsi:type="Console" />
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="logconsole" />
<logger name="*" minlevel="Debug" writeTo="logfile" />
</rules>
</nlog>
下面是编程方式进行配置:
var config = new NLog.Config.LoggingConfiguration();
var logfile = new NLog.Targets.FileTarget("logfile") { FileName = "file.txt" };
var logconsole = new NLog.Targets.ConsoleTarget("logconsole");
config.AddRule(LogLevel.Info, LogLevel.Fatal, logconsole);
config.AddRule(LogLevel.Debug, LogLevel.Fatal, logfile);
NLog.LogManager.Configuration = config;
写log消息
Example of how to acquire a logger and writing a message to the logger:
var logger = NLog.LogManager.GetCurrentClassLogger();
logger.Info("Hello World");
log等级
每条日志消息都有相关的日志级别,它可以识别消息的重要性/详细信息。NLog可以根据日志记录器的名称和日志级别来路由日志消息。
NLog支持以下日志级别:
-
trace
- 非常详细的日志,它可能包括大量的信息,例如协议有效负载。这个日志级别通常只在开发期间启用 -
debug
- 调试信息,比跟踪更少,通常在生产环境中不会启用 -
Info
- 信息消息,通常在生产环境中启用 -
warn
- 警告消息,通常用于可以恢复的非关键问题或临时故障 -
Error
- 错误消息——大多数情况下这些都是Exceptions
-
Fatal
- 非常严重的错误!
public class MyClass
{
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
public void MyMethod1()
{
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");
// alternatively you can call the Log() method
// and pass log level as the parameter.
logger.Log(LogLevel.Info, "Sample informational message");
// Example of logging an exception
try
{
}
catch (Exception ex)
{
logger.Error(ex, "ow noos!"); // render the exception with ${exception}
throw;
}
}
}
日志输出信息的格式
可以配置如何将一个消息写入NLog目标
如下是大多数NLog目标所使用的默认简单格式:
<target name="logfile" xsi:type="File" fileName="file.txt" layout="${longdate}|${level:uppercase=true}|${logger}|${message}" />
下面示例可以显示更多信息:
<target name="logfile" xsi:type="File" fileName="file.txt" layout="${longdate}|${level:uppercase=true}|${logger}|${threadid}|${message}|${exception:format=tostring}" />
参考全部格式:Layout Renderers
最佳实践
1. Logger应该是每个类中的静态变量
创建一个新的Logger有开销,因为它必须获得锁和分配对象。因此推荐如下方式创建Logger
namespace MyNamespace
{
public class MyClass
{
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
}
}
2. Logger应该处理字符串格式
避免预先执行字符串分配或字符串串联,而是让记录器执行格式化。这将允许NLog延迟格式化并减少开销。
logger.Info("Hello {0}", "Earth");
3. Logger应该放在异常里处理
避免将异常作为格式化参数,而是将其显式地作为第一个参数提供。这将有助于NLog目标提供更好的日志记录。
try
{
}
catch (Exception ex)
{
logger.Error(ex, "Something bad happened");
}
4. 从NLog.config验证XML配置
默认情况下,NLog吞下所有异常,所以日志记录的问题不会导致应用程序中断。但是对于很多应用程序来说,日志记录是非常重要的,所以如果初始的NLog配置失败了,那么它就是致命的。
添加throwConfigExceptions="true"
,当配置出现问题时可以让NLog知道
<?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"
throwConfigExceptions="true">
</nlog>
还有一个throwExceptions="true"
的设置,它不应该在生产中使用,因为它会对应用程序造成严重破坏。它用于单元测试和本地故障排除。
参见配置故障排除
5.
NLog在默认情况下会尝试在应用程序关闭时自动刷新。Microsoft Windows.NET应用程序在终止前执行关机(通常是2秒)的时间是有限的。如果有一个NLog以NLog为目标的NLog,需要网络流量(Http、Mail、Tcp),那么在运行linux/windows上独立运行时,这是一个非常好的主意。
NLog.LogManager.Shutdown(); // Flush and close down internal threads and timers