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

使用NLog的最佳实践的更多相关文章

  1. 《C+编程规范 101条规则、准则与最佳实践》笔记

    <C+编程规范 101条规则.准则与最佳实践> 0.不要拘泥于小节(了解哪些东西不应该标准化) * 与组织内现有编码规范一致即可 * 包括但不限于: - 缩进 - 行长度 - 命名规范 - ...

  2. [转]在 Azure 云服务上设计大规模服务的最佳实践

    本文转自:http://technet.microsoft.com/zh-cn/magazine/jj717232.aspx 英文版:http://msdn.microsoft.com/library ...

  3. ASP.NET Core Web API 最佳实践指南

    原文地址: ASP.NET-Core-Web-API-Best-Practices-Guide 介绍 当我们编写一个项目的时候,我们的主要目标是使它能如期运行,并尽可能地满足所有用户需求. 但是,你难 ...

  4. [转]ASP.NET Core Web API 最佳实践指南

    原文地址: ASP.NET-Core-Web-API-Best-Practices-Guide 转自 介绍# 当我们编写一个项目的时候,我们的主要目标是使它能如期运行,并尽可能地满足所有用户需求. 但 ...

  5. ASP.NET跨平台最佳实践

    前言 八年的坚持敌不过领导的固执,最终还是不得不阔别已经成为我第二语言的C#,转战Java阵营.有过短暂的失落和迷茫,但技术转型真的没有想象中那么难.回头审视,其实单从语言本身来看,C#确实比Java ...

  6. 《AngularJS深度剖析与最佳实践》简介

    由于年末将至,前阵子一直忙于工作的事务,不得已暂停了微信订阅号的更新,我将会在后续的时间里尽快的继续为大家推送更多的博文.毕竟一个人的力量微薄,精力有限,希望大家能理解,仍然能一如既往的关注和支持sh ...

  7. ASP.NET MVC防范CSRF最佳实践

    XSS与CSRF 哈哈,有点标题党,但我保证这篇文章跟别的不太一样. 我认为,网站安全的基础有三块: 防范中间人攻击 防范XSS 防范CSRF 注意,我讲的是基础,如果更高级点的话可以考虑防范机器人刷 ...

  8. 快速web开发中的前后端框架选型最佳实践

    这个最佳实践是我目前人在做的一个站点,主要功能: oauth登录 发布文章(我称为"片段"),片段可以自定义一些和内容有关的指标,如“文中人物:12”.支持自定义排版.插图.建立相 ...

  9. Spring Batch在大型企业中的最佳实践

    在大型企业中,由于业务复杂.数据量大.数据格式不同.数据交互格式繁杂,并非所有的操作都能通过交互界面进行处理.而有一些操作需要定期读取大批量的数据,然后进行一系列的后续处理.这样的过程就是" ...

随机推荐

  1. HNOI 世界树 虚树

    //virtual tree /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #defin ...

  2. python+Appium自动化:id元素定位

    元素定位 与web自动化一样,app自动化元素定位也是非常重要的一环,,appium也是提供了很多元素定位的方法,比如:id.name.class.层级定位等等. 元素定位方式 id name cla ...

  3. angularjs 实现下拉框编辑数据回显

    https://www.cnblogs.com/janice-jia/p/9764938.html 正常的js回显选择,需要添加 select ="selected",angula ...

  4. Nginx概念

    这篇文章只是单纯的介绍nginx以及一些相关概念,有的概念在实际应用中不会用到,不理解也没有关系,这不影响我们学习nginx. Nginx是什么 如果你知道http协议和httpd是什么,那你就会容易 ...

  5. IOS下图片不能显示问题的解决办法

    最近遇到这样一个问题,在HTML5手机页面中,直接给<img>标签设置宽高,即便图片路径正常,在IOS真机下也是无法显示的,而在安卓以及浏览器的模拟真机上都是正常显示的,这是为什么呢? h ...

  6. 题解 【HEOI2016】tree树

    题面 解析 其实这题可以考虑离线做法,用并查集解决. 因为仔细想,添加标记并不方便, 但如果用并查集记录下祖先, 再一一删除,就会方便很多. 先把每次操作记录下来, 同时记录下每个点被标记的次数(因为 ...

  7. call和ret指令

    call和ret都是用来修改ip或cs:ip,可以用来实现子程序的设计:   1.ret和retf ret    ->修改ip的内容,从而实现近转移: retf    ->同时修改cs和i ...

  8. 这一次,彻底弄懂「Java字节码文件」

    提前祝福各位读者

  9. 7.9模拟赛T1图的遍历(dfs)

    图的遍历(dfs) [题目描述] 对于一个有向图G来说,我们存在一个经典的遍历算法,就是DFS (深度优先搜索遍历).将G以1号点为起点进行DFS后,我们可以 得到G的一棵DFS遍历树T.就此,我们可 ...

  10. AcWing:99. 激光炸弹(前缀和)

    一种新型的激光炸弹,可以摧毁一个边长为 RR 的正方形内的所有的目标. 现在地图上有 NN 个目标,用整数Xi,YiXi,Yi表示目标在地图上的位置,每个目标都有一个价值WiWi. 激光炸弹的投放是通 ...