2016-01-29 25 views
6

Tôi hơi bối rối về cách sử dụng Elmah trong các dự án ASP.NET 5/MVC 6. Tôi đã nhận được gói từ nuget và nó đã thêm "Elmah.Mvc": "2.1.2" vào các phụ thuộc trong project.json.Làm thế nào để sử dụng Elmah trong ASP.NET 5/vNext/Core?

Tôi không chắc chắn nơi để đi từ đây - trở lại trong ngày, nuget sẽ thêm mục vào web.config mà bây giờ đã biến mất. Và tôi dường như không tìm thấy bất kỳ ví dụ nào về github của họ hay ở nơi khác.

Tôi có thiếu thứ gì đó đơn giản không?

+0

Không phải tất cả các gói đã được cập nhật để tương thích với ASP.NET Core. Với mức độ tích hợp cần thiết giữa Elmah và ASP.NET stack, tôi sẽ nói Elmah chưa được cập nhật. – mason

+0

Có thể trùng lặp của [ELMAH trên ASP.NET vNext?] (Http://stackoverflow.com/questions/28907017/elmah-on-asp-net-vnext) – blowdart

Trả lời

10

Thay vì sử dụng ELMAH, không khó để thực hiện ghi nhật ký lỗi theo cách thủ công. Quá trình này sẽ bắt bất kỳ ngoại lệ nào xảy ra trong dự án và ghi nó vào một bảng cơ sở dữ liệu. Để làm điều này, thêm dòng sau vào phương pháp Configure trong Startup.cs

if (env.IsDevelopment()) 
    { 
    app.UseDeveloperExceptionPage(); 
    app.UseBrowserLink(); 
    } 
    else 
    { 
    app.UseExceptionHandler(builder => 
     { 
     builder.Run(async context => 
     { 
      context.Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError; 
      context.Response.ContentType = "text/html"; 

      var error = context.Features.Get<Microsoft.AspNetCore.Diagnostics.IExceptionHandlerFeature>(); 
      if (error != null) 
      { 
      LogException(error.Error, context); 
      await context.Response.WriteAsync("<h2>An error has occured in the website.</h2>").ConfigureAwait(false); 
      } 
     }); 
     }); 
    } 

Bao gồm này trong Startup.cs cũng như:

private void LogException(Exception error, HttpContext context) 
{ 
    try 
    { 
    var connectionStr = Configuration["ConnectionString"]; 
    using (var connection = new System.Data.SqlClient.SqlConnection(connectionStr)) 
    { 
     var command = connection.CreateCommand(); 
     command.CommandText = @"INSERT INTO ErrorLog (Application, Host, Type, Source, Path, Method, Message, StackTrace, [User], WhenOccured) 
    VALUES (@Application, @Host, @Type, @Source, @Path, @Method, @Message, @StackTrace, @User, @WhenOccured)"; 
     connection.Open(); 

     if (error.InnerException != null) 
     error = error.InnerException; 

     command.Parameters.AddWithValue("@Application", this.GetType().Namespace); 
     command.Parameters.AddWithValue("@Host", Environment.MachineName); 
     command.Parameters.AddWithValue("@Type", error.GetType().FullName); 
     command.Parameters.AddWithValue("@Source", error.Source); 
     command.Parameters.AddWithValue("@Path", context.Request.Path.Value); 
     command.Parameters.AddWithValue("@Method", context.Request.Method); 
     command.Parameters.AddWithValue("@Message", error.Message); 
     command.Parameters.AddWithValue("@StackTrace", error.StackTrace); 
     var user = context.User.Identity?.Name; 
     if (user == null) 
     command.Parameters.AddWithValue("@User", DBNull.Value); 
     else 
     command.Parameters.AddWithValue("@User", user); 
     command.Parameters.AddWithValue("@WhenOccured", DateTime.Now); 

     command.ExecuteNonQuery(); 
    } 
    } 
    catch { } 
} 

Lưu ý rằng bạn sẽ phải tạo một bảng trong cơ sở dữ liệu của bạn với cấu trúc được sử dụng trong hàm này.

+0

Hmm, dường như không cháy khi tôi ném một ngoại lệ mới ... Tôi không hiểu làm thế nào điều này được giả sử để làm việc? –

+0

Chỉ cần đoán, nhưng có phải vì bạn đang thử điều này trong chế độ phát triển? Nếu đúng như vậy, nó sẽ hiển thị chi tiết lỗi trên trang web thay vì gọi LogException. Điều đó có thể được thay đổi bằng câu lệnh if trong khối mã đầu tiên. – Rono

2

ELMAH chưa được cập nhật để hỗ trợ ASP.NET Core. Atif Azis đã làm một số công việc xây dựng một mô-đun cấu hình miễn phí web.config được gọi là Bootstrapper. Bootstrapper không hỗ trợ ASP.NET Core (theo kiến ​​thức của tôi). Nhưng tôi khá chắc chắn rằng công việc hỗ trợ phiên bản mới sẽ bắt đầu ngay khi chúng tôi đến gần RTM hơn.

+0

Nếu bạn hỏi tôi, đó là daft để đi một tên một mô-đun 'Bootstrapper', được cho là cách mà thư viện JS và CSS quen thuộc được biết đến. – ProfK

Các vấn đề liên quan