2016-07-26 2 views
0

Я поручено написание переменного тока # форм приложение к:NLog: специалист по установке программы

  • показать DDL доступных веб-сайтов для установки NLog в (на основе наших внутренних критериев)
  • установить необходимые файлы support NLog app screenshot У меня есть рабочие сайты (которые я НЕ написал) с использованием NLog, которые я использовал в качестве базы для начала. Существует некоторая связь/взаимодействие под капотом между Global.asax и App_Code/LogManager.vb, чтобы направлять ошибки в NLog. Я не писал эту часть, поэтому я думаю, что это может быть проблемой, потому что я не знаю, как они взаимодействуют ...

Это предназначено для использования нашими специалистами по внедрению в качестве инструмента развертывания.

(Примечание: Это приложение C#, но целевые сайты всегда будут VB как наша экосистема)

Файлы копируются:

  • бен/NLog.dll
  • бен/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 он ничего не выводит ... пробовал простой файл журнала, webservice mail ... ничего. Я попробовал несколько мест, чтобы совершить ошибку, но назвал var неправильным, пропустил conn.open и т. Д., Безрезультатно ...

Я также попытался обойти проверку для 'ShouldLogError()', чтобы гарантировать, что она срабатывает, но нет идти.

Какой еще файл или настройка необходимы, чтобы заставить NLog работать таким образом?

ответ

0

Видимо, человек, прежде чем я написал некоторые из NLog в одном из наших пользовательских библиотек DLL, но не NLog.web, которая необходима для некоторых раскладок, как { сайт-имя} ИРИО. Удаление их исправлено:

+1

Для '{iis-site-name } 'вам действительно нужен [NLog.Web] (https://www.nuget.org/packages/NLog.Web/), который был перенесен в отдельный пакет с NLog 4. См. [NLog 4 release post] (http : //nlog-project.org/2015/06/09/nlog-4-has-been-released.html) и [обзор рендеринга макета] (https://github.com/nlog/nlog/wiki/Layout- Renderers). 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

Смежные вопросы