zoukankan      html  css  js  c++  java
  • 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)

    安装

    image

    配置

    <?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());
             }
          }

    image

    结合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}'
     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

  • 相关阅读:
    让unidac支持加密的sqlite
    hook api 保护进程
    Delphi实现网页采集
    UNIDAC
    Delphi的视频捕获组件
    删除程序自身
    一种简单的自校验的注册码生成方案以及暗桩方法
    SQL server表字段信息说明
    淘宝API开发(一)简单介绍淘宝API功能接口作用
    淘宝API开发(二)淘宝API接口功能测试
  • 原文地址:https://www.cnblogs.com/Irving/p/3449048.html
Copyright © 2011-2022 走看看