gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:08:51 24 4
gpt4 key购买 nike

我正在使用一个简单的 aspnet MVC 项目,该项目利用 elmah MVC 进行错误日志记录。在本地(例如在本地主机上运行)elmah 工作得很好,但是我不确定我理解数据存储在哪里?我注意到已创建一个“AzureStorageEmulatorDb45”数据库,这是用于 elmah 的吗?

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

如何告诉 elmah 使用通过 Entity Framework 连接到我的 MVC 项目的 Azure SQL 数据库?

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

我看到很多关于旧的 elmah.axd 等的旧帖子,一些关于使用 azure 表存储,但我想使用 azure sql 数据库。

所以有两个问题。当我在本地主机上运行 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="<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="017660647660647660416d6e6d6e6d2f626e6c" rel="noreferrer noopener nofollow">[email protected]</a> />
<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:

由于 localhost 版本使用相同的数据库,我实际上可以使用 elmah-localhost 来查看 elmah-azure 相关的错误,这很方便。当我尝试从 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 在发布/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 页面还在页面底部告诉您当前正在使用哪一个,例如:

This log is provided by the Microsoft Azure Storage Error Log.

关于c# - Elmah.Mvc 错误日志存储在哪里?如何将它们存储在 azure SQL 数据库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41562650/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com