【问题标题】:Eventlogging for IIS-Dotnet-Applicaiton without touching web.config-filesIIS-Dotnet-Applicaiton 的事件记录,无需接触 web.config-files
【发布时间】:2020-09-21 13:04:36
【问题描述】:

我正在运行由第三方提供的 dotnet 应用程序。事实上,有不止一个服务器组件包含几个web.config 文件和子web.config 文件。 我不想接触任何安装文件,以确保在以后的升级或其他阶段不会忘记任何配置更改。

我想启用通用日志记录,以便能够在 ysod 错误(例如损坏的配置文件)的情况下做出反应。我期望来自 java 世界,IIS 可能像 tomcat 一样将其未处理的异常写入一个简单的日志文件,但情况似乎并非如此。

最后我通过添加找到了solution

    <healthMonitoring>
      <eventMappings>
        <add name="All Errors" type="System.Web.Management.WebBaseErrorEvent,System.Web,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" startEventCode="0" endEventCode="2147483647" />
      </eventMappings>
      <rules>
        <add name="All Errors Default" eventName="All Errors" provider="EventLogProvider" profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:01:00" custom="" />
        <add name="Failure Audits Default" eventName="Failure Audits" provider="EventLogProvider" profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:01:00" custom="" />
      </rules>
    </healthMonitoring>

web.config-files 之一并强制应用程序在启动时失败并出现异常,现在我可以在事件监视器中看到错误,与 ysod 上的错误消息相比,这是一个很酷的进展配置

<!-- Web.Config Configuration File -->
(...)
<configuration>
    <system.web>
        <customErrors mode="RemoteOnly"/>
    </system.web>
</configuration>
(...)

但是,我想知道,我是否真的必须触摸web.config 文件才能启用非常基本的功能,例如注销未捕获异常的堆栈跟踪。 这感觉不对。 有没有办法以更通用的方式记录此类错误?

编辑在 Albert D. Kallal 的回答之后: 更准确地说:我不想接触应用程序的任何文件,我希望在比应用程序位置更高级别的通用配置。

【问题讨论】:

  • 您是否在事件查看器中查看了 IIS 的错误日志?
  • 我只能在事件查看器中找到 IIS-CentralCertificateProvider、IIS-Configuration 和 IIS-Logging。其中没有任何条目。你知道还有什么地方可以让我看看吗?
  • 在事件查看器 -> Windows 日志 -> 应用程序中,您可以找到一些来自 iis 的日志。
  • 不,从那里的应用程序中找不到任何有任何异常的日志。
  • 您可以尝试在应用程序开始时设置此事件处理程序。在 Program.cs、Startup.cs 或您的 Global.asax 文件中。 AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) =&gt; { Debug.WriteLine(eventArgs.Exception.ToString()); }; 或打开位于 'C:\Windows\System32\inetsrv' 的 IIS 元数据库 检查 IIS 元数据库中的 AspErrorsToNTLog 并设置为 TRUE 并保存。docs.microsoft.com/en-us/previous-versions/iis/6.0-sdk/…

标签: asp.net .net iis


【解决方案1】:

好吧,您可以获取/抓取/捕获任何系统范围的未处理错误。

项目中应该有一个名为 Global.asax 的页面。

它实际上是一个没有网页的代码模块。

在那个模块中,你有:

所以你有应用程序启动(代码在启动时运行)。 您有会话结束 - 代码在用户会话结束时运行

你有系统范围的错误陷阱。因此,您可以向该存根添加代码,而无需触摸或更改 web.config 文件/设置即可。

并且要获得与 asp.net 向网页吐出的“大部分”相同的内容?

我没有 c#,但这会输出很多你需要的东西。我让它给我发一封电子邮件,但你可以写一个日志,或者其他什么。

例如: 如果 (TypeOf Server.GetLastError() 是 HttpUnhandledException) 那么 ex = HttpContext.Current.Server.GetLastError().InnerException 别的 ex = HttpContext.Current.Server.GetLastError 结束如果

        Dim s As String = "Session Vars  (" & Session.Contents.Count.ToString & ")<br/><hr>"
        For i = 0 To Session.Contents.Count - 1
            Dim sKey As String
            sKey = Session.Keys(i)
            s += sKey & "---->" & Session(sKey).ToString & "<br/>"
        Next
        s += "<br/><hr>"
        WebNotice.AddField("Session", s)   ' my custom email web send class

        Dim s2 As String = ""
        Dim ex2 As Exception
        ex2 = ex.GetBaseException
        Do While IsNothing(ex2) = False
            s2 += "<br/>---" & ex2.StackTrace
            ex2 = ex2.InnerException
        Loop
        WebNotice.AddField("StackTrace", s2)
        s = ""
        If IsNothing(Server.GetLastError) = False Then
            s = Server.GetLastError().Message & "<br/>"
            s += Server.GetLastError().StackTrace & "<br/>"
            s += Server.GetLastError().GetBaseException.Message & "<br/>"
            s += Server.GetLastError().GetBaseException.StackTrace & "<br/>"

        End If
        WebNotice.AddField("MoreInfo", s)

        'Debug.Print(ex.InnerException.Message)
        ' try to get logged on user  (often error could be due to timeout)
        Try
            uid = Membership.GetUser.ProviderUserKey
        Catch
        End Try
        WebNotice.DataPK = uid

        Server.ClearError()

        WebNotice.SendNotice("CodeError")

所以上面给我发了一封电子邮件。我还列出了当前 session() 值、登录用户(或者如果他们没有登录等)。

因此,您可以全局捕获错误。实际上,在开发/调试期间?我在第一行添加了一个退出子 - 在调试和开发过程中不需要/不需要电子邮件。但是上面的输出与堆栈跟踪等类似的消息非常多。这很好,因为当网站出现代码错误时我会收到一封电子邮件。

你不必使用或遵循上面的代码思想,但这里的基本概念是你确实有一个全局错误陷阱

Sub Application_Error(sender As Object, e As EventArgs)

所以上面的代码在那个错误上被调用。从中您可以循环错误对象,并写入日志文件甚至发送电子邮件。如前所述,我还写出了 session() 值,因为这有助于追踪错误。我还获取了当前 URL,它再次告诉我用户在哪里。

你记录或写出的冰淇淋有多种口味。但基本概念是全局错误代码子运行,您可以将其添加到您的应用程序中,而无需更改网络配置和设置以使其正常工作。

【讨论】:

  • 感谢您的详细回答,我会尝试进一步的解决方法,因为我仍然相信必须有一个更通用的解决方案。情况不变:组件检测到未捕获的错误并显示为ysod,但此时在服务器端没有注销,仍然感觉不好。我更新了问题以考虑您的提议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多