NLog:自定义安装程序

NLog: custom installer program

我的任务是编写一个 c# 表单应用程序来:

这是供我们的实施工程师用作部署工具。

(NOTE: THIS app is C#, but the target websites will always be VB as is our ecosystem)

正在复制的文件:

在我们的 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:DL-OURDOMAIN-ImpDev@OURDOMAIN.com;me@OURDOMAIN.com}" 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 它也没有输出任何东西......尝试了一个简单的日志文件,网络服务邮件......没有。我已经尝试了几个地方来触发错误,但是命名一个 var 错误,缺少一个 conn.open,等等,无济于事...

我也试过绕过对“ShouldLogError()”的检查以确保它触发但没有成功。

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

您的配置有误,应该只有一个 <targets>(在您的情况下有多个 <target><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:DL-OURDOMAIN-ImpDev@OURDOMAIN.com;me@OURDOMAIN.com}" 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

显然,我之前的人将一些 NLog 写入了我们的自定义 dll 之一,但没有 NLog.web,这对于某些布局(例如 {iis-site-name})是必需的。删除修复它的那些: