繁体   English   中英

Elmah.Mvc错误日志存储在哪里? 如何将它们存储在Azure SQL数据库中?

[英]Elmah.Mvc where are the error logs stored? How can I store them in an azure SQL database?

我正在使用一个简单的aspnet MVC项目,该项目利用elmah MVC进行错误记录。 在本地(例如在localhost上运行),elmah效果很好,但是我不确定我是否知道数据存储在哪里? 我注意到已经创建了一个“ AzureStorageEmulatorDb45”数据库,这是针对elmah吗?

Elmah如何知道要连接到哪个数据库?

我该如何告诉Elmah使用通过实体框架连接到MVC项目的Azure SQL数据库?

当前,当我尝试访问部署服务器上的elmah时,它只是失败了,毫无疑问,因为它找不到数据库。

我看到许多有关较旧的elmah.axd等的旧帖子,一些有关使用azure表存储的信息,但是我想使用azure sql数据库。

有两个问题。 当我在localhost上运行MVC项目时,日志存储在哪里,而elmah如何知道在哪里找到它们?

第二个问题,我如何发布到azure网站以使用azure SQL数据库作为elmah mvc的数据存储?

编辑:我按照以下说明操作,并使用以下脚本创建了数据库表

SET ansi_nulls ON 
SET quoted_identifier ON 

IF NOT EXISTS (SELECT * 
               FROM   sys.objects 
               WHERE  object_id = Object_id(N'[dbo].    [ELMAH_Error]') 
                      AND type IN ( N'U' )) 
  BEGIN 
      CREATE TABLE [dbo].[elmah_error] 
        ( 
           [errorid]     [UNIQUEIDENTIFIER] NOT NULL, 
           [application] [NVARCHAR](60) NOT NULL, 
           [host]        [NVARCHAR](50) NOT NULL, 
           [type]        [NVARCHAR](100) NOT NULL, 
           [source]      [NVARCHAR](60) NOT NULL, 
           [message]     [NVARCHAR](500) NOT NULL, 
           [user]        [NVARCHAR](50) NOT NULL, 
           [statuscode]  [INT] NOT NULL, 
           [timeutc]     [DATETIME] NOT NULL, 
           [sequence]    [INT] IDENTITY(1, 1) NOT NULL, 
           [allxml]      [NVARCHAR](max) NOT NULL, 
           CONSTRAINT [PK_ELMAH_Error] PRIMARY KEY CLUSTERED ( [errorid] ASC ) 
           WITH 
           ( 
           statistics_norecompute = OFF, ignore_dup_key = OFF) 
        ) 
  END 

IF NOT EXISTS (SELECT * 
               FROM   sys.indexes 
               WHERE  object_id = Object_id(N'[dbo].[ELMAH_Error]') 
                      AND NAME = N'IX_ELMAH_Error_App_Time_Seq') 
  CREATE NONCLUSTERED INDEX [IX_ELMAH_Error_App_Time_Seq] 
    ON [dbo].[ELMAH_Error] ( [application] ASC, [timeutc] DESC, [sequence] DESC 
  ) 
    WITH (statistics_norecompute = OFF, ignore_dup_key = OFF, drop_existing = 
  OFF, 
  online = OFF) 

go 

IF NOT EXISTS (SELECT * 
               FROM   dbo.sysobjects 
               WHERE  id = Object_id(N'[DF_ELMAH_Error_ErrorId]') 
                      AND type = 'D') 
  BEGIN 
      ALTER TABLE [dbo].[elmah_error] 
        ADD CONSTRAINT [DF_ELMAH_Error_ErrorId] DEFAULT (Newid()) FOR [ErrorId] 
  END 

go 

SET ansi_nulls ON 
SET quoted_identifier ON 

IF NOT EXISTS (SELECT * 
               FROM   sys.objects 
               WHERE  object_id = Object_id(N'[dbo].[ELMAH_GetErrorsXml]') 
                      AND type IN ( N'P', N'PC' )) 
  BEGIN 
      EXEC dbo.Sp_executesql 
        @statement = N' CREATE PROCEDURE [dbo].[ELMAH_GetErrorsXml] ( @Application NVARCHAR(60), @PageIndex INT = 0, @PageSize INT = 15, @TotalCount INT OUTPUT ) AS  SET NOCOUNT ON DECLARE @FirstTimeUTC DATETIME DECLARE @FirstSequence INT DECLARE @StartRow INT DECLARE @StartRowIndex INT SELECT      @TotalCount = COUNT(1)  FROM      [ELMAH_Error] WHERE      [Application] = @Application -- Get the ID of the first error for the requested page SET @StartRowIndex = @PageIndex * @PageSize + 1 IF @StartRowIndex <= @TotalCount BEGIN     SET ROWCOUNT @StartRowIndex     SELECT           @FirstTimeUTC = [TimeUtc],         @FirstSequence = [Sequence]     FROM          [ELMAH_Error]     WHERE            [Application] = @Application     ORDER BY          [TimeUtc] DESC,          [Sequence] DESC END ELSE BEGIN     SET @PageSize = 0 END -- Now set the row count to the requested page size and get -- all records below it for the pertaining application. SET ROWCOUNT @PageSize SELECT      errorId     = [ErrorId],      application = [Application],     host        = [Host],      type        = [Type],     source      = [Source],     message     = [Message],     [user]      = [User],     statusCode  = [StatusCode],      time        = CONVERT(VARCHAR(50), [TimeUtc], 126) + ''Z'' FROM      [ELMAH_Error] error WHERE     [Application] = @Application AND     [TimeUtc] <= @FirstTimeUTC AND      [Sequence] <= @FirstSequence ORDER BY     [TimeUtc] DESC,      [Sequence] DESC FOR     XML AUTO ' 
  END 

go 

SET ansi_nulls ON 
SET quoted_identifier ON 

IF NOT EXISTS (SELECT * 
               FROM   sys.objects 
               WHERE  object_id = Object_id(N'[dbo].[ELMAH_GetErrorXml]') 
                      AND type IN ( N'P', N'PC' )) 
  BEGIN 
      EXEC dbo.Sp_executesql 
        @statement = N' CREATE PROCEDURE [dbo].[ELMAH_GetErrorXml] ( @Application NVARCHAR(60), @ErrorId UNIQUEIDENTIFIER ) AS SET NOCOUNT ON SELECT      [AllXml] FROM      [ELMAH_Error] WHERE     [ErrorId] = @ErrorId AND     [Application] = @Application ' 
  END 

go 

SET ansi_nulls ON 
SET quoted_identifier ON 

IF NOT EXISTS (SELECT * 
               FROM   sys.objects 
               WHERE  object_id = Object_id(N'[dbo].    [ELMAH_LogError]') 
                      AND type IN ( N'P', N'PC' )) 
  BEGIN 
      EXEC dbo.Sp_executesql 
        @statement = N' CREATE PROCEDURE [dbo].[ELMAH_LogError] ( @ErrorId UNIQUEIDENTIFIER, @Application NVARCHAR(60), @Host NVARCHAR(30), @Type NVARCHAR(100), @Source NVARCHAR(60), @Message NVARCHAR(500), @User NVARCHAR(50), @AllXml NVARCHAR(MAX), @StatusCode INT, @TimeUtc DATETIME ) AS SET NOCOUNT ON INSERT INTO     [ELMAH_Error]     (         [ErrorId],         [Application],         [Host],         [Type],         [Source],         [Message],         [User],         [AllXml],         [StatusCode],         [TimeUtc]     ) VALUES     (         @ErrorId,         @Application,         @Host,         @Type,         @Source,         @Message,         @User,         @AllXml,         @StatusCode,         @TimeUtc     ) ' 
  END 

go 

然后,我将以下内容添加到web.config中:

<configuration>
  <configSections>
    </sectionGroup>
      <sectionGroup name="elmah">
      <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" />
      <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" />
      <section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" />
      <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" />
    </sectionGroup>
  </configSections>

  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=tcp:MYWEBSITELOL.database.windows.net,1433;Initial Catalog=LOL;Persist Security Info=True;User ID=trololol;Password=trolololol;Connect Timeout=30;Encrypt=True;TrustServerCertificate=False" providerName="System.Data.SqlClient"/>
  </connectionStrings>

  <elmah>
    <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="DefaultConnection" applicationName="Lol" />
  </elmah>

  <appSettings>
    <add key="elmah.mvc.disableHandler" value="false" />
    <add key="elmah.mvc.disableHandleErrorFilter" value="false" />
    <add key="elmah.mvc.requiresAuthentication" value="true" />
    <add key="elmah.mvc.IgnoreDefaultRoute" value="false" />
    <add key="elmah.mvc.allowedRoles" value="admin" />
    <add key="elmah.mvc.allowedUsers" value="waewaewa@lolol.com />
    <add key="elmah.mvc.route" value="ServerLog" />
    <add key="elmah.mvc.UserAuthCaseSensitive" value="true" />
  </appSettings>

  <system.web>
  <httpModules>
      <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
      <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
      <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" />
    </httpModules><httpHandlers>
      <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
    </httpHandlers>
  </system.web>

现在,当我在localhost(使用azure DB)上运行Web服务器时,我可以登录并查看elmah,其中以下文本指示成功。

该日志由Microsoft SQL Server错误日志提供。

然后,我发布了网站,当我尝试访问elmah日志时,出现以下错误:

建立与SQL Server的连接时发生与网络相关或特定于实例的错误。 服务器未找到或无法访问。 验证实例名称正确,并且已将SQL Server配置为允许远程连接。 (提供者:SQL网络接口,错误:26-指定服务器/实例时出错)

说明:执行当前Web请求期间发生未处理的异常。 请查看堆栈跟踪,以获取有关错误及其在代码中起源的更多信息。

SQLExpress数据库文件自动创建错误:

连接字符串使用应用程序的App_Data目录中的数据库位置指定本地Sql Server Express实例。 提供者尝试自动创建应用程序服务数据库,因为提供者确定该数据库不存在。 要成功检查应用程序服务数据库的存在并自动创建应用程序服务数据库,必须满足以下配置要求:

由于localhost版本使用的是同一数据库,因此我实际上可以使用elmah-localhost查看方便的elmah-azure相关错误。 当我尝试从azure网站查看Elmah时,Elmah报告了以下时间戳匹配的错误:

建立与SQL Server的连接时发生与网络相关或特定于实例的错误。 服务器未找到或无法访问。 验证实例名称正确,并且已将SQL Server配置为允许远程连接。 (提供者:SQL网络接口,错误:26-指定服务器/实例时出错)

ERRORSHELPABOUT System.Data.SqlClient.SqlException建立与SQL Server的连接时发生与网络相关或特定于实例的错误。 服务器未找到或无法访问。 验证实例名称正确,并且已将SQL Server配置为允许远程连接。 (提供者:SQL网络接口,错误:26-指定服务器/实例时出错)

我需要在web.RELEASE.config等文件中添加一些内容,以使Elmah在发布/ azure环境中运行时正常工作吗?

错误似乎是冲突的,一个说超时,另一个说自动创建错误(它试图自动创建什么,为什么?)

日志存储在您配置它们的位置。 如果查看web.config,应该会找到类似以下内容的东西:

<elmah>
  <errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~/App_Data" />
</elmah>

在这种情况下,日志作为XML文件存储在文件系统上。 在App_Data文件夹中。

如果要使用SQL数据库进行存储,则可以按照此处的说明进行操作: http : //www.andyfrench.info/2014/07/configuring-elmah-to-use-sql-server.html

基本上,您将必须添加连接字符串,使用预制脚本手动创建ELMAH表,然后按如下所示修改配置:

<connectionStrings>
  <add name="elmah" connectionString="server=localhost;database=;uid=Elmah;password=password;" />
</connectionStrings>
<!-- other configuration removed for clarity -->
<elmah>
  <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="elmah" applicationName="YourApplicationName"/>
</elmah>

ELMAH页面还在页面底部告诉您当前正在使用哪一个,例如:

该日志由Microsoft Azure存储错误日志提供。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM