2016-07-26 140 views
0

我写作交流#窗体应用程序任务是:NLOG:自定义安装程序

  • 显示可用的网站的DDL到NLOG安装到(根据我们的内部标准)
  • 所需的文件安装到支持NLog app screenshot 我有工作网站(我没有写)与NLog的功能,我用作基地开始。 Global.asax和App_Code/LogManager.vb之间有一些连接/交互,用于将错误引导到NLog中。我没有写这个部分,所以我认为这可能是问题出在哪里,因为我不知道它们是如何相互作用的...

这意味着我们的实施工程师将其用作部署工具。

(注:这个程序是C#,但目标网站将永远是VB作为是 我们的生态系统)

文件被复制:

  • 斌/ NLog.dll
  • bin/NLog.Extended.dll
  • Global.asax
  • NLog.config
  • App_Code文件/ LogManager.vb

在我们的Global.asax中,我们捕捉象这样的错误:

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs) 
    ' Code that runs when an unhandled error occurs 
    Dim lastException As Exception = Server.GetLastError() 
    HandleError(lastException)  
End Sub 
Public Shared Sub HandleError(ex As Exception) 
    'Honor the config setting for whether we should do the logging. 

    Dim hostId As String = "" 

    If HttpContext.Current IsNot Nothing AndAlso HttpContext.Current.Request IsNot Nothing Then 
     hostId = " (" + HttpContext.Current.Request.Url.Host + ")" 
    End If 

    If ex Is Nothing Then 
     'OrElse request.Url.Host.ToLower = "localhost" Then 
     Return 
    End If 

    If ShouldLogError(ex) Then 
     Dim LogManager As New LogManager() 

     LogManager.Logger.LogError("Global Exception",ex) 

    End If 
End Sub 

Protected Shared Function ShouldLogError(ex As Exception) As Boolean 
    If TypeOf ex Is System.Web.HttpRequestValidationException Then 
     Return False 
    End If 

    If TypeOf ex Is HttpException Then 
     Dim exHttp As HttpException = DirectCast(ex, HttpException) 
     Select Case exHttp.GetHttpCode() 
      Case 404 
       'File Not Found 
       Return False 
     End Select 
    End If 

    If TypeOf ex Is System.IO.FileNotFoundException Then 
     Return False 
    End If 

    If TypeOf ex.InnerException Is System.IO.FileNotFoundException Then 
     Return False 
    End If 

    If TypeOf ex Is System.Reflection.TargetInvocationException OrElse TypeOf ex Is System.FormatException OrElse (TypeOf ex Is HttpException AndAlso ex.Message.Contains("Invalid viewstate.")) OrElse TypeOf ex Is System.Security.Cryptography.CryptographicException Then 
     If HttpContext.Current.Request.Url.AbsolutePath.EndsWith("ScriptResource.axd", StringComparison.OrdinalIgnoreCase) OrElse HttpContext.Current.Request.Url.AbsolutePath.EndsWith("WebResource.axd", StringComparison.OrdinalIgnoreCase) Then 
      Return False 
     End If 
    End If 

    Return True 
End Function 

在LogManager.vb:

Public Class LogManager 

Private _Logger As ILogger 

Public Sub New() 

End Sub 

Public ReadOnly Property Logger As ILogger 
    Get 
     If _Logger Is Nothing Then 
      _Logger = New LoggerFactory().CreateLoggerNlog("Website") 
     End If 

     Return _Logger 

    End Get 
End Property 
End Class 

和NLOG。 config:

<?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"> 
<extensions> 
    <add assembly="OURDOMAINlibrary"/> 
    <!--<add assembly="NLog.Extended"/>--> 
</extensions> 
<targets async="false"> 
    <target xsi:type="Console" name="debugConsole" layout="${VnEventId:brackets=true} ${uppercase:${level}} ${LoggerFriendly} ${message} "/> 
</targets> 
<targets async="true"> 
    <target xsi:type="File" name="debugFile" createDirs="true" fileName="c:/Vendornet/Log/${iis-site-name}}/${iis-site-name}_${shortdate}.log" layout="${longdate} ${VnEventId:brackets=true} ${uppercase:${level}} ${LoggerFriendly} ${message}"/> 
    <!-- Alter the smtpServer and to attributes only. For information regarding the ${FatalEmail} tag, see 
       the documentation provided with this project 
     --> 
    <target name="mail" xsi:type="Mail" html="true" replaceNewlineWithBrTagInHtml="true" smtpServer="OURDOMAIN" smtpAuthentication="None" to="${FatalEmail:[email protected];[email protected]}" from="${machinename}@OURDOMAIN.com" subject="${iis-site-name} - ${processname} has FAILED on ${machinename}." body="${message}"/> 
    <!-- The Webservice Target Below should not be modified except for the url attribute. To disable this target 
      set the minlevel in the Rules section to Off. Otherwise set it to Trace or higher 
     --> 
    <target type="WebService" name="vnLogApi" url="http://OURDOMAIN/api/log" protocol="HttpPost" encoding="UTF-8"> 
    <parameter name="time_stamp" type="System.String" layout="${date}"/> 
    <parameter name="level" type="System.String" layout="${level}"/> 
    <parameter name="logger" type="System.String" layout="${logger}"/> 
    <parameter name="userName" type="System.String" layout="${identity}"/> 
    <parameter name="url" type="System.String" layout="${aspnet-request:serverVariable=Url}"/> 
    <parameter name="machineName" type="System.String" layout="${machinename}"/> 
    <parameter name="sessionId" type="System.String" layout="${aspnet-sessionid}"/> 
    <parameter name="threadId" type="System.String" layout="${threadid}"/> 
    <parameter name="referrer" type="System.String" layout="${aspnet-request:serverVariable=HTTP_REFERER}"/> 
    <parameter name="userAgent" type="System.String" layout="${aspnet-request:serverVariable=HTTP_USER_AGENT}"/> 
    <parameter name="code" type="System.String" layout="${CUSTOMEventId}"/> 
    <parameter name="message" type="System.String" layout="${message}"/> 
    <parameter name="version" type="System.String" layout=""/> 
    <parameter name="exception" type="System.String" layout="${exception}"/> 
    <parameter name="stackTrace" type="System.String" layout="${stacktrace}"/> 
    <parameter name="clientName" type="System.String" layout="${iis-site-name}"/> 
    <parameter name="fileName" type="System.String" layout="${iis-site-name} ${date}"/> 
    </target> 
</targets> 
<rules> 
    <logger name="*" minlevel="Trace" writeTo="debugConsole"/> 
    <logger name="*" minlevel="Trace" writeTo="debugFile"/> 
    <!-- SET TO Trace or Higher Once LogAPI is available for this server --> 
    <logger name="*" minlevel="Trace" writeTo="vnLogApi"/> 
    <!-- THIS LINE SHOULD NOT BE MODIFIED --> 
    <logger name="*" minlevel="Fatal" writeTo="mail"/> 
</rules> 

所以,即使最精简的NLog.config它不输出任何东西...尝试了一个简单的日志文件,web服务邮件...什么也没有。我尝试了几个地方旅行错误,但命名var错误,缺少conn.open等,无济于事...

我也尝试绕过检查'ShouldLogError()',以确保它火,但没有走。

需要其他文件或调整才能让NLog以这种方式工作?

回答

0

显然,人前我写了一些NLOG到我们的自定义dll之一,但不是NLog.web,这是需要一些喜欢布局的{ IIS站点的名称}。删除那些固定它:

+1

对于{{iis-站点名称}'你确实需要[NLog.Web](https://www.nuget.org/packages/NLog.Web/),它已经从NLog 4迁移到一个单独的包。请参阅[NLog 4发布文章](http ://nlog-project.org/2015/06/09/nlog-4-has-been-released.html)和[布局渲染器概述](https://github.com/nlog/nlog/wiki/Layout-渲染器)。 NB:NLog.Web是一个官方的NLog包 – Julian

+0

谢谢。这最初是在3x版本中创建的。因此有些混乱。 –

1

您的配置有错误应该只有一个<targets>(在您的情况下有多个<target> s)<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"> 
    <extensions> 
    <add assembly="OURDOMAINlibrary"/> 
    <!--<add assembly="NLog.Extended"/>--> 
    </extensions> 
    <targets async="true"> 
    <target xsi:type="Console" name="debugConsole" layout="${VnEventId:brackets=true} ${uppercase:${level}} ${LoggerFriendly} ${message} "/> 
    <target xsi:type="File" name="debugFile" createDirs="true" fileName="c:/Vendornet/Log/${iis-site-name}}/${iis-site-name}_${shortdate}.log" layout="${longdate} ${VnEventId:brackets=true} ${uppercase:${level}} ${LoggerFriendly} ${message}"/> 
    <!-- Alter the smtpServer and to attributes only. For information regarding the ${FatalEmail} tag, see 
       the documentation provided with this project 
     --> 
    <target name="mail" xsi:type="Mail" html="true" replaceNewlineWithBrTagInHtml="true" smtpServer="OURDOMAIN" smtpAuthentication="None" to="${FatalEmail:[email protected];[email protected]}" from="${machinename}@OURDOMAIN.com" subject="${iis-site-name} - ${processname} has FAILED on ${machinename}." body="${message}"/> 
    <!-- The Webservice Target Below should not be modified except for the url attribute. To disable this target 
      set the minlevel in the Rules section to Off. Otherwise set it to Trace or higher 
     --> 
    <target type="WebService" name="vnLogApi" url="http://OURDOMAIN/api/log" protocol="HttpPost" encoding="UTF-8"> 
     <parameter name="time_stamp" type="System.String" layout="${date}"/> 
     <parameter name="level" type="System.String" layout="${level}"/> 
     <parameter name="logger" type="System.String" layout="${logger}"/> 
     <parameter name="userName" type="System.String" layout="${identity}"/> 
     <parameter name="url" type="System.String" layout="${aspnet-request:serverVariable=Url}"/> 
     <parameter name="machineName" type="System.String" layout="${machinename}"/> 
     <parameter name="sessionId" type="System.String" layout="${aspnet-sessionid}"/> 
     <parameter name="threadId" type="System.String" layout="${threadid}"/> 
     <parameter name="referrer" type="System.String" layout="${aspnet-request:serverVariable=HTTP_REFERER}"/> 
     <parameter name="userAgent" type="System.String" layout="${aspnet-request:serverVariable=HTTP_USER_AGENT}"/> 
     <parameter name="code" type="System.String" layout="${CUSTOMEventId}"/> 
     <parameter name="message" type="System.String" layout="${message}"/> 
     <parameter name="version" type="System.String" layout=""/> 
     <parameter name="exception" type="System.String" layout="${exception}"/> 
     <parameter name="stackTrace" type="System.String" layout="${stacktrace}"/> 
     <parameter name="clientName" type="System.String" layout="${iis-site-name}"/> 
     <parameter name="fileName" type="System.String" layout="${iis-site-name} ${date}"/> 
    </target> 
    </targets> 
    <rules> 
    <logger name="*" minlevel="Trace" writeTo="debugConsole"/> 
    <logger name="*" minlevel="Trace" writeTo="debugFile"/> 
    <!-- SET TO Trace or Higher Once LogAPI is available for this server --> 
    <logger name="*" minlevel="Trace" writeTo="vnLogApi"/> 
    <!-- THIS LINE SHOULD NOT BE MODIFIED --> 
    <logger name="*" minlevel="Fatal" writeTo="mail"/> 
    </rules> 
</nlog> 

请记住,你只能使用异步属性的所有目标。如果你只需要一个目标异步,您应该使用异步包装:

<targets> 
    <target name="target2" xsi:type="AsyncWrapper"> 
    <target name ="target1" xsi:type="File" 
       fileName="c:/temp/test.log" layout="${message}" 
       keepFileOpen="true" /> 
    </target> 
    <rules> 
    <logger name="*" minlevel="Info" writeTo="target2"/> 
    </rules> 
</targets> 

AsyncWrapper target docs

如果仍然遇到问题,请启用并检查internal log

+0

内部日志根本不会工作,fyi ..不知道为什么......结果出现了一些布局的问题。我们正在封装NLog而不是NLog.web,这是一些布局所依赖的。另外,只要一个是异步和一个同步,你显然可以有两个节点。它的工作原理现在是 –

+0

ps,是复制粘贴错误:( –

+1

检查源代码 - 是的,两个''将工作:) – Julian