使用NLog的最佳实践
1. Logger应该在每个类中初始化为静态
创建一个新的Logger类是有有开销的,因为它需要获取一些锁和分配对象和内存。
因此推荐像下面一样使用Logger:
namespace MyNamespace
{
public class MyClass
{
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
}
}
2. 应该让Logger处理字符串格式化
避免提前执行字符串分配或字符串连接,而是让Logger来完成字符串格式化。这会允许NLog推迟格式化和减少格式化的开销。
因此推荐像下面一样使用Logging:
logger.Info("Hello {0}", "Earth");
3. Logger应该将异常当参数传入
避免将异常当格式化参数传入,而是将异常当第一个参数显示传入。这将帮助NLog 目标提供更完整和更好的日志内容.
推荐
try
{
}
catch (Exception ex)
{
logger.Error(ex, "Something bad happened");
}
避免
try
{
}
catch (Exception ex)
{
logger.Error("Something bad happened, error message:{0}",ex);
}
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", 这个不能在生产环境中使用,因为这个会在写日志的时候报错,可能会给你们的程序带来灾难。这个应该使用为单元测试和本地调试使用,详情参见 Troubleshooting Configuration
5. 记得刷新输出到文件
NLog默认会在程序关闭的时候自动刷新到文件。微软Windows系统给.Net程序一小点时间来在程序被完全终止前处理关闭(通常是2s)。如果一个NLog配置的NLog目标需要使用网络通信(Http, Mail, Tcp), 那么在Linux/Windows上手动执行一个刷新/关闭操作是一个更好的选择。
NLog.LogManager.Shutdown(); // 刷新并关闭内部的线程和计时器
在Mono/Linux上运行的.Net程序要求在进入关闭阶段之前关闭所有线程和计时器。如果没有完成这个,那么会导致未处理的异常和段错误,和其他不可预知的行为。
6. 异步写日志
如果要启用异步写日志,只需要配置添加 async="true"
<targets async="true">
参考资料:NLOG Tutorial