我正在使用一個簡單的aspnet MVC項目,利用elmah MVC進行錯誤記錄。本地(例如在本地主機上運行)elmah的工作很好,但我不知道我明白數據存儲在哪裏?我注意到已經創建了一個「AzureStorageEmulatorDb45」數據庫,這是否爲elmah?Elmah.Mvc錯誤日誌存儲在哪裏?我如何將它們存儲在一個天藍色的SQL數據庫中?
elmah如何知道連接到哪個數據庫?
如何告訴elmah使用我的Azure SQL數據庫通過實體框架連接到我的MVC項目?
當前當我嘗試訪問部署服務器上的elmah時,它只是失敗,毫無疑問,因爲它無法找到數據庫。
我看到很多關於舊的elmah.axd等的舊帖子,有些關於使用azure表存儲但我想使用azure sql數據庫。
所以有兩個問題。當我在本地主機上運行我的MVC項目時,日誌的存儲位置以及elmah如何知道在哪裏找到它們?
第二個問題,我如何讓我的發佈到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="[email protected] />
<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>
現在,當我運行web本地主機上的服務器(使用azure DB)我可以登錄並查看elmah,並顯示以下指示成功的文本。
This log is provided by the Microsoft SQL Server Error Log.
我再發布的網站,當我試圖訪問ELMAH登錄我收到以下錯誤:
A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
SQLExpress database file auto-creation error:
The connection string specifies a local Sql Server Express instance using a database location within the application's App_Data directory. The provider attempted to automatically create the application services database because the provider determined that the database does not exist. The following configuration requirements are necessary to successfully check for existence of the application services database and automatically create the application services database:
由於本地主機版本使用相同的DB我居然可以使用ELMAH,本地主機查看elmah-azure相關的錯誤,這很方便。 ELMAH報告,其中它的時間戳,當我試圖從蔚藍的網站查看ELMAH符合以下錯誤:
A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)
ERRORSHELPABOUT System.Data.SqlClient.SqlException A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)
有什麼我需要添加到web.RELEASE.config等,讓ELMAH正常工作時在發佈/天藍色環境中運行?
的錯誤似乎相互矛盾,一個說超時,對方稱自動創建錯誤(什麼是它試圖AUTOCREATE爲什麼?)
順便說一句,AzureStorageEmulatorDb45是Azure存儲模擬器爲自己創建的數據庫。它附帶Azure SDK,並允許您在沒有存儲帳戶的情況下在本地測試Blob和Table Storage等內容。它與ELMAH無關(除非將其配置爲將日誌存儲在仿真器的表存儲器中)。 – juunas
感謝您幫助知道 – rolls
第一個錯誤意味着您沒有更新連接字符串以指向Azure SQL,它仍然指向快速數據庫。第二個可能意味着您沒有在Azure SQL中爲您的IP地址添加防火牆例外。 – juunas