打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
ASP.NET MVC 与NLog的使用

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(介绍较详细,需FQ)
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

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
日志框架Nlog之将日志输出到控制台
NLog日志框架使用探究12
ASP.NET Core MVC 从入门到精通之日志管理
日志框架NLog之将日志发送到邮件
CentOS7安装MinIO教程,C#使用MinIO看这一篇就够了(WPF)
ASP.NET Core Web API 学习笔记(3): Logger
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服