NLog是一个.NET 下一个完善的日志工具,个人已经在项目中使用很久,与ELMAH相比,可能EAMAH更侧重 APS.NET MVC 包括调试路由,性能等方面,而NLog则更简洁。

github: https://github.com/NLog/NLog
web: http://nlog-project.org
logview:http://www.gibraltarsoftware.com/loupe/extensions/nlog
http://stackoverflow.com/questions/710863/log4net-vs-nlog
http://stackoverflow.com/questions/4091606/most-useful-nlog-configurations

Supported targets include:
    Files - single file or multiple, with automatic file naming and archival
    Event Log - local or remote
    Database - store your logs in databases supported by .NET
    Network - using TCP, UDP, SOAP, MSMQ protocols
    Command-line console - including color coding of messages
    E-mail - you can receive emails whenever application errors occur
    ASP.NET trace
    ... and many more

Other key features:
    very easy to configure, both through configuration file and programmatically
    easy-to-use logger pattern known from log4xxx
    advanced routing using buffering, asynchronous logging, load balancing, failover, and more
    cross-platform support: .NET Framework, .NET Compact Framework and Mono (on Windows and Unix)

安装

配置

<?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"> <!--
See http://nlog-project.org/wiki/Configuration_file
for information on customizing logging rules and outputs.
--> <!-- 使用说明
1.一般控制台调式日志(打印到控制台)
logger.Trace("GetHotelBrand 操作数据库异常 sqlText : " + sqlText);
2. 一般文本日志,如记录接口,响应值等 请求参数等(记录文本,支持异步),
logger.Info("GetHotelBrand 操作数据库异常 sqlText : " + sqlText);
3.错误日志 一般影响到业务流程的正常使用 (记录到DB)
logger.ErrorException("GetHotelBrand 操作数据库异常 sqlText : " + sqlText, ex);
4.致命性错误 如金额数据,订单数据操作失败 (发送邮件通知)
logger.FatalException("GetHotelBrand 操作数据库异常 sqlText : " + sqlText, ex);
--> <targets>
<!-- add your targets here -->
<!--调式打印控制台日志-->
<target name="console" xsi:type="ColoredConsole" layout="[${date:format=yyyy-MM-dd HH\:mm\:ss}][${level}] ${message} ${exception}"/> <!-- 记录一般INFO文本日志(启用异步) -->
<target name="file" xsi:type="AsyncWrapper" queueLimit="5000" overflowAction="Discard">
<target xsi:type="File" fileName="${basedir}/logs/${shortdate}/${level}.log" layout="${longdate} ${uppercase:${level}} ${message}" maxArchiveFiles="100" />
</target> <!-- 发生错误异常记录数据库日志 -->
<target name="database" xsi:type="Database" useTransactions="true" connectionString="Data Source=xxxxxxxx;Initial Catalog=Log;Persist Security Info=True;User ID=sa;Password=123456" commandText="insert into NLogException_HomeinnsInterface([CreateOn],[Origin],[LogLevel], [Message], [Exception],[StackTrace]) values (getdate(), @origin, @logLevel, @message,@exception, @stackTrace);">
<!--日志来源-->
<parameter name="@origin" layout="${callsite}"/>
<!--日志等级-->
<parameter name="@logLevel" layout="${level}"/>
<!--日志消息-->
<parameter name="@message" layout="${message}"/>
<!--异常信息-->
<parameter name="@exception" layout="${exception}" />
<!--堆栈信息-->
<parameter name="@stackTrace" layout="${stacktrace}"/>
</target> <!-- 发生致命错误发送邮件日志 -->
<target name="email" xsi:type="Mail"
header="-----header------"
footer="-----footer-----"
layout="${longdate} ${level} ${callsite} ${message} ${exception:format=Message, Type, ShortType, ToString, Method, StackTrace}"
html="false"
encoding="UTF-8"
addNewLines="true"
subject="${message}"
to=""
from=""
body="${longdate} ${level} ${callsite} ${message} ${exception:format=Message, Type, ShortType, ToString, Method, StackTrace}"
smtpUserName=""
enableSsl="false"
smtpPassword=""
smtpAuthentication="Basic"
smtpServer="smtp.163.com"
smtpPort="25">
</target>
</targets>
<rules>
<!-- add your logging rules here -->
<logger name="*" minlevel="Trace" writeTo="console" />
<logger name="*" minlevel="Info" writeTo="file" />
<logger name="*" minlevel="Error" writeTo="database"/>
<logger name="*" minlevel="Fatal" writeTo="email" />
</rules>
</nlog>

配置什么的也没有什么好说的,跟相对Log4j配置简洁些,支持 控制台,文件(异步),数据库,Email,够用了,其他的方式还没有研究。

日志查看

这里推荐一款日志查看工具:Loupe ,支持.NET 平台下集成,在Asp.NET MVC 下只需要配置Nuget引用相应的包。

Install-Package Gibraltar.Agent.Web.Mvc

注册拦截器

using Gibraltar.Agent;
using Gibraltar.Agent.Web.Mvc.Filters; public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
// Initialize Gibraltar Loupe
Log.StartSession();
GlobalConfiguration.Configuration.Filters.Add(new WebApiRequestMonitorAttribute());
GlobalFilters.Filters.Add(new MvcRequestMonitorAttribute());
GlobalFilters.Filters.Add(new UnhandledExceptionAttribute());
}
}

结合SignalR

今天看到一篇与signalr结合的文章,可以把记录的日志主动推送到浏览器 : http://www.codeproject.com/Articles/758633/Streaming-logs-with-SignalR  ,原理NLog支持MethodCallTarget特性,发生异常时,可以触发Signalr的相关方法,从而推送错误消息到浏览器。

<configSections>
<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog" />
</configSections>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" throwExceptions="false">
<targets>
<target name="debug" xsi:type="Debugger" layout=" #${longdate} - ${level} - ${callsite} - ${message}" />
<target name="signalr" xsi:type="MethodCall" className="SignalRTargetHub, App_Code" methodName="Send">
<parameter layout="${longdate}" />
<parameter layout="${level}" />
<parameter layout="${callsite}: ${message}" />
</target>
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="debug" />
<logger name="*" minlevel="Trace" writeTo="signalr" />
</rules>
</nlog>

使用OWIN宿主,Open Web Interface for .NET (OWIN)在Web服务器和Web应用程序之间建立一个抽象层。OWIN将网页应用程序从网页服务器分离出来,然后将应用程序托管于OWIN的程序而离开IIS之外。

public class SignalRTargetHub : Hub
{
public void Hello()
{
this.Clients.Caller.logEvent(
DateTime.UtcNow.ToLongTimeString(),
"info",
"SignalR connected");
} static IHubContext signalRHub;
public static void Send(string longdate, string logLevel, String message)
{
if (signalRHub == null)
{
signalRHub = GlobalHost.ConnectionManager.GetHubContext<SignalRTargetHub>();
} if (signalRHub != null)
{
signalRHub.Clients.All.logEvent(longdate, logLevel, message);
}
}
} [assembly: OwinStartup(typeof(SignalRStartup))]
public class SignalRStartup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
}
}

注册Global事件

  Logger logger = NLog.LogManager.GetCurrentClassLogger();
void Application_Error(object sender, EventArgs e)
{
Exception lastException = Server.GetLastError();
logger.Fatal("Request: '{0}'\n Exception:{1}", HttpContext.Current.Request.Url, lastException);
}

Refer:
How to NLog (2.1) with VisualStudio 2013

http://www.codeproject.com/Tips/749612/How-to-NLog-with-VisualStudio

Logging: How to Growl with NLog 3

http://www.codeproject.com/Articles/786304/Logging-How-to-Growl-with-NLog-or

Five methods to Logging in MVC 3.0(介绍较详细,需翻墙)

http://www.codeproject.com/Tips/237171/Five-methods-to-Logging-in-MVC

微软最新的Web服务器Katana发布了版本3(OWIN)

http://www.infoq.com/cn/news/2014/08/Katana-3

ASP.NET MVC 与NLog的使用的更多相关文章

  1. .net framework 4.6 asp.net mvc 使用NLog

    NUGET添加NLog和NLog.Config的引用 配置NLog.config <?xml version="1.0" encoding="utf-8" ...

  2. NLog在Asp.Net MVC的实战应用

    Asp.Net MVC FilterAttribute特性.读取xml反序列化.NLog实战系列文章 首先新建一个MVC project. 一.NLog的配置. 作者:Jarosław Kowalsk ...

  3. EF+LINQ事物处理 C# 使用NLog记录日志入门操作 ASP.NET MVC多语言 仿微软网站效果(转) 详解C#特性和反射(一) c# API接受图片文件以Base64格式上传图片 .NET读取json数据并绑定到对象

    EF+LINQ事物处理   在使用EF的情况下,怎么进行事务的处理,来减少数据操作时的失误,比如重复插入数据等等这些问题,这都是经常会遇到的一些问题 但是如果是我有多个站点,然后存在同类型的角色去操作 ...

  4. 17+个ASP.NET MVC扩展点【附源码】

    1.自定义一个HttpModule,并将其中的方法添加到HttpApplication相应的事件中!即:创建一个实现了IHttpmodule接口的类,并将配置WebConfig.  在自定义的Http ...

  5. 17+个ASP.NET MVC扩展点,含源码{转}

    1.自定义一个HttpModule,并将其中的方法添加到HttpApplication相应的事件中!即:创建一个实现了IHttpmodule接口的类,并将配置WebConfig.在自定义的HttpMo ...

  6. asp.net mvc ,asp.net mvc api 中使用全局过滤器进行异常捕获记录

    MVC下的全局异常过滤器注册方式如下:标红为asp.net mvc ,asp.net mvc api  注册全局异常过滤器的不同之处 using SuperManCore; using System. ...

  7. ASP.NET MVC扩展点

    16个ASP.NET MVC扩展点[附源码] 1.自定义一个HttpModule,并将其中的方法添加到HttpApplication相应的事件中!即:创建一个实现了IHttpmodule接口的类,并将 ...

  8. ASP.NET MVC 常用扩展点:过滤器、模型绑定等

    一.过滤器(Filter) ASP.NET MVC中的每一个请求,都会分配给对应Controller(以下简称“控制器”)下的特定Action(以下简称“方法”)处理,正常情况下直接在方法里写代码就可 ...

  9. 整理学习ASP.NET MVC的资源

    网站 http://www.asp.net/mvc http://stackoverflow.com/questions/tagged/asp.net-mvc+asp.net-mvc-4?sort=n ...

随机推荐

  1. 【1】ASP.NET异步(1)

    图标说明了异步的基础认识. 1.如果没有Ajax,提交之后整个页会刷新(左图).右图所示的虚线范围区域加入了ajax技术,提交之后只更新了虚线区域的内容,这样看比较直白. <form>①& ...

  2. Ng第十三课:聚类(Clustering)

    13.1  无监督学习:简介 13.2 K-均值算法 13.3  优化目标 13.4  随机初始化 13.5  选择聚类数 13.1  无监督学习:简介 在这个视频中,将开始介绍聚类算法.这将是一个激 ...

  3. java理论学时第七节。课后作业。

    对AboutException.java的理解.在try中如果发出某类系统识别的错误,会以throw的形式抛出,在catch中可以将其截获,不显示在前端,可以选择执行别的代码. ArrayIndexO ...

  4. TCP、UDP网络通信

    IP地址和端口号 端口号是用两个字节(16位的二进制数)表示的,它的取值范围是0~65535,其中,0~1023之间的端口号用于一些知名的网络服务和应用, 用户的普通应用程序需要使用1024以上的端口 ...

  5. hdu 5091 给定矩形覆盖尽量多点 扫描线+线段树

    http://acm.hdu.edu.cn/showproblem.php?pid=5091 给你10000以内的敌舰的坐标(即分别为x,y),要求用W*H的矩形去围住一个区域,使得这个区域内的敌舰最 ...

  6. 微信内置浏览器私有接口WeixinJSBridge介绍

    原文地址:http://www.3lian.com/edu/2015/05-25/216227.html 这篇文章主要介绍了微信内置浏览器私有接口WeixinJSBridge介绍,本文讲解了发送给好友 ...

  7. ReLU 和sigmoid 函数对比

    详细对比请查看:http://www.zhihu.com/question/29021768/answer/43517930 . 激活函数的作用: 是为了增加神经网络模型的非线性.否则你想想,没有激活 ...

  8. .net core 部署 docker (CentOS7)

    最近研究 docker 在Linux 下部署 .net core 项目,在过程中踩了很多坑,网上的资料对我帮助确实大,但有些问题未指明出来. 特地整理一份在发布文档 本文使用的是 root 账号操作, ...

  9. 【转】MySQL表名大小写敏感导致的问题

    原文地址:https://blog.csdn.net/postnull/article/details/72455768 最近在项目中遇到一个比较奇怪的小问题.在开发过程中自己测试没有问题,但是提测后 ...

  10. [leetcode.com]算法题目 - Jump Game

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...