2017-01-10 7 views
0

Я использую простой проект MVC aspnet, который использует elmah MVC для регистрации ошибок. Локально (например, работает на localhost) elmah отлично работает, но я не уверен, что понимаю, где хранятся данные? Я заметил созданную базу данных AzureStorageEmulatorDb45, это для elmah?Elmah.Mvc где хранятся журналы ошибок? Как сохранить их в базе данных azure SQL?

Как elmah знает, к какой базе данных подключиться?

Как я могу сказать elmah, чтобы использовать мою базу данных SQL Azure, подключенную к моему проекту MVC через инфраструктуру Entity?

В настоящее время, когда я пытаюсь получить доступ к elmah на сервере развертывания, он просто терпит неудачу, без сомнения, поскольку он не может найти базу данных.

Я вижу много старых сообщений о старших пользователях elmah.axd и т. Д., Некоторые из которых касаются использования хранилища таблиц, но я хочу использовать базу данных sql sql.

Так что два вопроса. Когда я запускаю проект MVC на localhost, где хранятся журналы и как 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> 

Теперь, когда я бегу в Интернете сервер на localhost (с использованием лазурной БД). Я могу войти в систему и просмотреть 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 ошибки, которая удобна. 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 правильно при работе работает в среде release/azure?

Ошибки кажутся противоречивыми, один говорит тайм-аут, а другой говорит об ошибке автоприменения (что она пытается Autocreate и почему?)

+1

Кстати, AzureStorageEmulatorDb45 - это база данных, созданная для Azure Storage Emulator для себя. Он поставляется с SDK Azure и позволяет тестировать такие вещи, как Blob и Table Storage, локально без учетной записи хранилища. Это не связано с ELMAH (если вы не настроите его для хранения журналов в хранилище таблиц в эмуляторе). – juunas

+0

Спасибо, что полезно знать – rolls

+0

Первая ошибка означает, что вы не обновили строку подключения, чтобы указать на Azure SQL, она все еще указывает на экспресс-БД. Второй, вероятно, означает, что вы не добавили исключение брандмауэра для своего IP-адреса в Azure SQL. – juunas

ответ

1

Журналы хранятся где их настройки. Если вы посмотрите в 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.

+0

Спасибо, я пойду на это и отчитаю. – rolls

+0

Обновлен основной пост, насколько я получил. – rolls