使用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
使用NLog的最佳实践的更多相关文章
- 《C+编程规范 101条规则、准则与最佳实践》笔记
<C+编程规范 101条规则.准则与最佳实践> 0.不要拘泥于小节(了解哪些东西不应该标准化) * 与组织内现有编码规范一致即可 * 包括但不限于: - 缩进 - 行长度 - 命名规范 - ...
- [转]在 Azure 云服务上设计大规模服务的最佳实践
本文转自:http://technet.microsoft.com/zh-cn/magazine/jj717232.aspx 英文版:http://msdn.microsoft.com/library ...
- ASP.NET Core Web API 最佳实践指南
原文地址: ASP.NET-Core-Web-API-Best-Practices-Guide 介绍 当我们编写一个项目的时候,我们的主要目标是使它能如期运行,并尽可能地满足所有用户需求. 但是,你难 ...
- [转]ASP.NET Core Web API 最佳实践指南
原文地址: ASP.NET-Core-Web-API-Best-Practices-Guide 转自 介绍# 当我们编写一个项目的时候,我们的主要目标是使它能如期运行,并尽可能地满足所有用户需求. 但 ...
- ASP.NET跨平台最佳实践
前言 八年的坚持敌不过领导的固执,最终还是不得不阔别已经成为我第二语言的C#,转战Java阵营.有过短暂的失落和迷茫,但技术转型真的没有想象中那么难.回头审视,其实单从语言本身来看,C#确实比Java ...
- 《AngularJS深度剖析与最佳实践》简介
由于年末将至,前阵子一直忙于工作的事务,不得已暂停了微信订阅号的更新,我将会在后续的时间里尽快的继续为大家推送更多的博文.毕竟一个人的力量微薄,精力有限,希望大家能理解,仍然能一如既往的关注和支持sh ...
- ASP.NET MVC防范CSRF最佳实践
XSS与CSRF 哈哈,有点标题党,但我保证这篇文章跟别的不太一样. 我认为,网站安全的基础有三块: 防范中间人攻击 防范XSS 防范CSRF 注意,我讲的是基础,如果更高级点的话可以考虑防范机器人刷 ...
- 快速web开发中的前后端框架选型最佳实践
这个最佳实践是我目前人在做的一个站点,主要功能: oauth登录 发布文章(我称为"片段"),片段可以自定义一些和内容有关的指标,如“文中人物:12”.支持自定义排版.插图.建立相 ...
- Spring Batch在大型企业中的最佳实践
在大型企业中,由于业务复杂.数据量大.数据格式不同.数据交互格式繁杂,并非所有的操作都能通过交互界面进行处理.而有一些操作需要定期读取大批量的数据,然后进行一系列的后续处理.这样的过程就是" ...
随机推荐
- 【转】关于 Ruby 解释器:一些你需要知道的
关于 Ruby 解释器:一些你需要知道的 原文:Ruby Interpreters: What You Need to Know 使用正确的 Ruby 解释器来运行程序可以发挥重要作用,不幸的是很难找 ...
- python+Appium自动化:Appium-desktop界面简介
Appium Desktop是一款适用于Mac,Windows和Linux的开源应用程序,提供了更加优化的图形界面. Appium Desktop是由Simple.Advanced.Presets三个 ...
- 【wqs二分 || 决策单调性】cf321E. Ciel and Gondolas
把状态看成层,每层决策单调性处理 题目描述 题目大意 众所周知,贞鱼是一种高智商水生动物.不过他们到了陆地上智商会减半.这不?他们遇到了大麻烦!n只贞鱼到陆地上乘车,现在有k辆汽车可以租用.由于贞鱼们 ...
- Python之日期操作及转换详解
# 导入datetime模块,用以操作时间 import datetime # 导入time模块 import time # 获取当前时间 格式: 年-月-日 时:分:秒 . 毫秒 nowTime = ...
- HDU-3746-Cyclic nacklace(KMP, 循环节)
链接: https://vjudge.net/problem/HDU-3746 题意: 第一题来啦. 现在给你一个字符串,请问在该字符串末尾最少添加多少个字符,可以让这个字符串获得重复循环序列. 思路 ...
- Acwing-198-反素数(约数, 数学)
链接: https://www.acwing.com/problem/content/200/ 题意: 对于任何正整数x,其约数的个数记作g(x),例如g(1)=1.g(6)=4. 如果某个正整数x满 ...
- Java进阶知识07 Hibernate一对一双向外键关联(Annotation+XML实现)
1.Annotation 注解版 1.1.创建Husband类和Wife类 package com.shore.model; import javax.persistence.Entity; impo ...
- POJ2176 Folding
POJ2176 Folding 描述 给定一个长度不超过100的字符串,求其"压缩"后长度最短的字符串.如有多个,输出任意即可. 其中对于一个字符串\(str\)的"压缩 ...
- python 多线程实现循环打印 abc
python 多线程实现循环打印 abc 好久没写过python了, 想自己实践一下把 非阻塞版 import threading import time def print_a(): global ...
- CTF MD5之守株待兔,你需要找到和系统锁匹配的钥匙
这是提示 从系统锁下手,通过get方式key字段提交答案,直到您的钥匙与系统锁相等则成功. 点开链接可以发现有两串字符,而且系统的秘钥是一直在变化的 题目中已经给了MD5加密,那么用MD5解密发现您的 ...