Ghi nhật ký thực hành tốt nhất [đã đóng]


323

Tôi muốn biết câu chuyện về cách mọi người xử lý theo dõi và đăng nhập vào các ứng dụng thực. Dưới đây là một số câu hỏi có thể giúp giải thích câu trả lời của bạn.

Khung

Bạn sử dụng khuôn khổ nào?

  • log4net
  • System.Diagnostics.Trace
  • System.Diagnostics.TraceSource
  • Đăng nhập khối ứng dụng
  • Khác?

Nếu bạn sử dụng theo dõi, bạn có sử dụng Trace.Correlation.StartLogicalOperation không?

Bạn có viết mã này bằng tay, hoặc bạn sử dụng một số hình thức lập trình hướng theo khía cạnh để làm điều đó? Muốn chia sẻ một đoạn mã?

Bạn có cung cấp bất kỳ hình thức chi tiết nào trên các nguồn theo dõi không? Ví dụ, WPF TraceSource cho phép bạn định cấu hình chúng ở nhiều cấp độ khác nhau:

  • System.Windows - cài đặt cho tất cả WPF
  • System.Windows.Animation - ghi đè đặc biệt cho Animation.

Người nghe

Bạn sử dụng đầu ra nhật ký nào?

  • Tập tin văn bản
  • Các tệp XML
  • Nhật ký sự kiện
  • Khác?

Nếu sử dụng tệp, bạn có sử dụng nhật ký cán hoặc chỉ một tệp không? Làm thế nào để bạn làm cho các bản ghi có sẵn cho mọi người để tiêu thụ?

Đang xem

Những công cụ để bạn sử dụng để xem các bản ghi?

  • Sổ tay
  • Đuôi
  • Trình xem sự kiện
  • Quản lý vận hành trung tâm hệ thống / Microsoft Operations Manger
  • Trình xem theo dõi dịch vụ WCF
  • Khác?

Nếu bạn đang xây dựng một giải pháp ASP.NET, bạn cũng sử dụng ASP.NET Health Giám sát? Bạn có bao gồm đầu ra theo dõi trong các sự kiện theo dõi sức khỏe? Còn Trace.axd thì sao?

Những gì về quầy hiệu suất tùy chỉnh?


3
Sẽ rất hữu ích nếu mọi người đóng các câu hỏi như thế này với 300 câu hỏi có thể gợi ý định dạng wiki hoặc đăng trên lập trình viên.stackexchange hoặc Quora nếu loại câu hỏi này không được chào đón. Rõ ràng câu hỏi thực sự rất mang tính xây dựng, nó chỉ không phù hợp với tiêu chí mà StackOverflow muốn. lập trình viên.stackexchange.com /questions / 57064 / Khắc có 24 upvote. Có lẽ StackOverflow đang thiếu một cái gì đó?
Niall Connaughton

Nếu câu hỏi này vi phạm định dạng Q & A thì có BÀI VIẾT SAU với Định dạng Hỏi và Đáp chứ không phải với câu hỏi này. Đôi khi, quyết định xem một câu hỏi có nên đóng lại hay không là một chức năng của các câu trả lời được cung cấp, một số câu hỏi mở mời tranh luận, nhưng những câu hỏi khác mời người dùng cung cấp nội dung có giá trị, chẳng hạn như câu hỏi này!
Matthias Wolf

1
Câu hỏi này - đặc biệt là câu trả lời hàng đầu - có thể sẽ tạo ra một nền tảng tuyệt vời cho một bài đăng trên blog nếu ai đó muốn sử dụng nó như vậy ... Như một câu hỏi khách quan, nó không thực sự phù hợp - nó có cấu trúc rõ ràng như một cuộc thăm dò rơm - nhưng Có một số thông tin tốt dưới đây, do đó khóa.
Shog9

Câu trả lời:


232

Cập nhật: Để biết các tiện ích mở rộng cho System.Diagnostics, cung cấp một số trình nghe bị thiếu mà bạn có thể muốn, hãy xem Essential.Diagnostics trên CodePlex ( http://essentialdiagnostics.codeplex.com/ )


Khung

Q: Những khung công tác nào bạn sử dụng?

A: System.Diagnostics.TraceSource, được tích hợp sẵn trong .NET 2.0.

Nó cung cấp khả năng ghi nhật ký hiệu năng cao, linh hoạt, mạnh mẽ cho các ứng dụng, tuy nhiên nhiều nhà phát triển không nhận thức được khả năng của nó và không tận dụng hết chúng.

Có một số lĩnh vực mà chức năng bổ sung hữu ích hoặc đôi khi chức năng tồn tại nhưng không được ghi chép rõ ràng, tuy nhiên điều này không có nghĩa là toàn bộ khung ghi nhật ký (được thiết kế để có thể mở rộng) nên được loại bỏ và thay thế hoàn toàn như một số lựa chọn thay thế phổ biến (NLog, log4net, Common.Logging, và thậm chí là EntLib Logging).

Thay vì thay đổi cách bạn thêm các báo cáo ghi nhật ký vào ứng dụng của mình và phát minh lại bánh xe, chỉ cần mở rộng khung System.Diagnostics ở một vài nơi bạn cần.

Đối với tôi, các khung công tác khác, thậm chí EntLib, chỉ đơn giản là bị Hội chứng không phát minh ở đây và tôi nghĩ rằng họ đã lãng phí thời gian để phát minh lại những điều cơ bản đã hoạt động hoàn hảo trong System.Diagnostics (như cách bạn viết báo cáo nhật ký), thay vì điền vào một vài khoảng trống tồn tại. Nói tóm lại, đừng sử dụng chúng - chúng không cần thiết.

Các tính năng bạn có thể chưa biết:

  • Sử dụng quá tải TraceEvent có chuỗi định dạng và đối số có thể giúp hiệu suất khi các tham số được giữ dưới dạng tham chiếu riêng cho đến khi Filter.ShouldTrace () thành công. Điều này có nghĩa là không có cuộc gọi đắt đến ToString () trên các giá trị tham số cho đến khi hệ thống đã xác nhận thông báo sẽ thực sự được ghi lại.
  • Trace.CorrelationManager cho phép bạn tương quan các báo cáo nhật ký về cùng một hoạt động logic (xem bên dưới).
  • VisualBasic.Logging.FileLogTraceListener rất tốt để ghi vào tệp nhật ký và hỗ trợ xoay tệp. Mặc dù trong không gian tên VisualBasic, nó có thể dễ dàng được sử dụng trong dự án C # (hoặc ngôn ngữ khác) chỉ bằng cách bao gồm DLL.
  • Khi sử dụng EventLogTraceListener nếu bạn gọi TraceEvent với nhiều đối số và với chuỗi định dạng trống hoặc null, thì các đối số được chuyển trực tiếp đến EventLog.WriteEntry () nếu bạn đang sử dụng tài nguyên thông báo cục bộ.
  • Công cụ Trình theo dõi dịch vụ (từ WCF) rất hữu ích để xem biểu đồ của các tệp nhật ký tương quan hoạt động (ngay cả khi bạn không sử dụng WCF). Điều này thực sự có thể giúp gỡ lỗi các vấn đề phức tạp trong đó có nhiều chủ đề / hoạt động có liên quan.
  • Tránh chi phí bằng cách xóa tất cả người nghe (hoặc loại bỏ Mặc định); nếu không, Mặc định sẽ chuyển mọi thứ cho hệ thống theo dõi (và phải chịu tất cả các chi phí ToString () đó).

Các khu vực bạn có thể muốn xem xét mở rộng (nếu cần):

  • Cơ sở dữ liệu theo dõi người nghe
  • Bảng điều khiển theo dõi màu
  • Trình nghe theo dõi MSMQ / Email / WMI (nếu cần)
  • Triển khai FileSystemWatcher để gọi Trace.Refresh để thay đổi cấu hình động

Các khuyến nghị khác:

Sử dụng id của sự kiện có cấu trúc và giữ một danh sách tham chiếu (ví dụ: ghi lại chúng trong enum).

Có id sự kiện duy nhất cho mỗi sự kiện (quan trọng) trong hệ thống của bạn là rất hữu ích để tương quan và tìm kiếm các vấn đề cụ thể. Thật dễ dàng để theo dõi lại mã cụ thể ghi nhật ký / sử dụng id sự kiện và có thể giúp dễ dàng cung cấp hướng dẫn cho các lỗi phổ biến, ví dụ lỗi 5178 có nghĩa là chuỗi kết nối cơ sở dữ liệu của bạn bị sai, v.v.

Id sự kiện nên tuân theo một số loại cấu trúc (tương tự như Lý thuyết về mã trả lời được sử dụng trong email và HTTP), cho phép bạn xử lý chúng theo danh mục mà không cần biết mã cụ thể.

vd Vân vân.

Chữ số thứ hai có thể chi tiết khu vực, ví dụ 21xx cho thông tin cơ sở dữ liệu (41xx cho cảnh báo cơ sở dữ liệu, 51xx cho lỗi cơ sở dữ liệu), 22xx cho chế độ tính toán (42xx cho cảnh báo tính toán, v.v.), 23xx cho mô-đun khác, v.v.

Id sự kiện được chỉ định, có cấu trúc cũng cho phép bạn sử dụng chúng trong các bộ lọc.

Q: Nếu bạn sử dụng theo dõi, bạn có sử dụng Trace.Correlation.StartLogicalOperation không?

Trả lời: Trace.CorrelationManager rất hữu ích cho việc tương quan các báo cáo nhật ký trong bất kỳ loại môi trường đa luồng nào (gần như mọi thứ hiện nay).

Bạn cần ít nhất để thiết lập ActivityId một lần cho mỗi hoạt động logic để tương quan.

Bắt đầu / Dừng và LogicalOperationStack sau đó có thể được sử dụng cho bối cảnh dựa trên ngăn xếp đơn giản. Đối với các bối cảnh phức tạp hơn (ví dụ: các hoạt động không đồng bộ), sử dụng TraceTransfer cho ActivityId mới (trước khi thay đổi nó), cho phép tương quan.

Công cụ Trình theo dõi dịch vụ có thể hữu ích để xem biểu đồ hoạt động (ngay cả khi bạn không sử dụng WCF).

Q: Bạn có viết mã này bằng tay, hoặc bạn sử dụng một số hình thức lập trình hướng theo khía cạnh để làm điều đó? Muốn chia sẻ một đoạn mã?

Trả lời: Bạn có thể muốn tạo một lớp phạm vi, ví dụ LogicalOperationScope, rằng (a) thiết lập bối cảnh khi được tạo và (b) đặt lại bối cảnh khi xử lý.

Điều này cho phép bạn viết mã như sau để tự động bao bọc các hoạt động:

  using( LogicalOperationScope operation = new LogicalOperationScope("Operation") )
  {
    // .. do work here
  }

Khi tạo, phạm vi trước tiên có thể đặt ActivityId nếu cần, hãy gọi StartLogicalOperation và sau đó đăng nhập thông báo TraceEventType.Start. Trên Vứt bỏ, nó có thể ghi thông báo Dừng và sau đó gọi StopLogicalOperation.

Q: Bạn có cung cấp bất kỳ hình thức chi tiết nào trên các nguồn theo dõi không? Ví dụ, WPF TraceSource cho phép bạn định cấu hình chúng ở nhiều cấp độ khác nhau.

Trả lời: Có, nhiều Nguồn theo dõi rất hữu ích / quan trọng khi các hệ thống trở nên lớn hơn.

Trong khi bạn có thể muốn liên tục ghi nhật ký tất cả Cảnh báo & ở trên hoặc tất cả các thông tin & thông báo ở trên, đối với bất kỳ hệ thống có kích thước hợp lý nào, khối lượng Truy tìm hoạt động (Bắt đầu, Dừng, v.v.) và ghi nhật ký Verbose đơn giản trở nên quá nhiều.

Thay vì chỉ có một công tắc bật hoặc tắt tất cả, thật hữu ích khi có thể bật thông tin này cho một phần trong hệ thống của bạn tại một thời điểm.

Bằng cách này, bạn có thể xác định các vấn đề quan trọng từ việc ghi nhật ký thông thường (tất cả các cảnh báo, lỗi, v.v.) và sau đó "phóng to" các phần bạn muốn và đặt chúng thành các mức Truy tìm hoạt động hoặc thậm chí là Gỡ lỗi.

Số lượng nguồn theo dõi bạn cần tùy thuộc vào ứng dụng của bạn, ví dụ: bạn có thể muốn một nguồn theo dõi trên mỗi cụm hoặc trên mỗi phần chính của ứng dụng.

Nếu bạn cần điều khiển tốt hơn nữa, hãy thêm các công tắc boolean riêng lẻ để bật / tắt theo dõi âm lượng cao cụ thể, ví dụ: kết xuất tin nhắn thô. (Hoặc một nguồn theo dõi riêng biệt có thể được sử dụng, tương tự như WCF / WPF).

Bạn cũng có thể muốn xem xét các nguồn theo dõi riêng biệt để ghi nhật ký theo dõi hoạt động so với ghi nhật ký chung (khác), vì nó có thể giúp dễ dàng hơn một chút để định cấu hình các bộ lọc theo cách bạn muốn.

Lưu ý rằng tin nhắn vẫn có thể được tương quan thông qua ActivityId ngay cả khi các nguồn khác nhau được sử dụng, vì vậy hãy sử dụng bao nhiêu tùy ý.


Người nghe

Q: Bạn sử dụng kết quả đầu ra nào?

Điều này có thể phụ thuộc vào loại ứng dụng bạn đang viết và những thứ đang được ghi lại. Thông thường những thứ khác nhau đi ở những nơi khác nhau (tức là nhiều đầu ra).

Tôi thường phân loại đầu ra thành ba nhóm:

(1) Sự kiện - Nhật ký sự kiện Windows (và tệp theo dõi)

ví dụ: Nếu viết một máy chủ / dịch vụ, thì cách tốt nhất trên Windows là sử dụng Nhật ký sự kiện Windows (bạn không có UI để báo cáo).

Trong trường hợp này, tất cả các sự kiện Thông tin gây tử vong, Lỗi, Cảnh báo và (cấp độ dịch vụ) sẽ chuyển đến Nhật ký Sự kiện Windows. Cấp độ thông tin phải được dành riêng cho các loại sự kiện cấp cao này, các sự kiện mà bạn muốn truy cập trong nhật ký sự kiện, ví dụ: "Dịch vụ đã bắt đầu", "Đã dừng dịch vụ", "Đã kết nối với Xyz" và thậm chí có thể "Khởi tạo lịch biểu" , "Người dùng đã đăng nhập", v.v.

Trong một số trường hợp, bạn có thể muốn ghi vào nhật ký sự kiện một phần tích hợp trong ứng dụng của mình và không thông qua hệ thống theo dõi (tức là viết trực tiếp các mục Nhật ký sự kiện). Điều này có nghĩa là nó không thể vô tình bị tắt. (Lưu ý bạn vẫn muốn lưu ý sự kiện tương tự trong hệ thống theo dõi của mình để bạn có thể tương quan).

Ngược lại, một ứng dụng GUI của Windows thường báo cáo những điều này cho người dùng (mặc dù họ cũng có thể đăng nhập vào Nhật ký sự kiện của Windows).

Các sự kiện cũng có thể có các bộ đếm hiệu suất liên quan (ví dụ: số lỗi / giây) và điều quan trọng là phải phối hợp bất kỳ văn bản trực tiếp nào với Nhật ký sự kiện, bộ đếm hiệu suất, ghi vào hệ thống theo dõi và báo cáo cho người dùng để chúng xảy ra tại cùng lúc.

tức là nếu người dùng nhìn thấy một thông báo lỗi tại một thời điểm cụ thể, bạn sẽ có thể tìm thấy cùng một thông báo lỗi trong Nhật ký sự kiện Windows, và sau đó cùng một sự kiện với cùng dấu thời gian trong nhật ký theo dõi (cùng với các chi tiết theo dõi khác).

(2) Hoạt động - Tệp nhật ký ứng dụng hoặc bảng cơ sở dữ liệu (và tệp theo dõi)

Đây là hoạt động thường xuyên mà một hệ thống thực hiện, ví dụ trang web được phục vụ, giao dịch trên thị trường chứng khoán, đặt hàng, thực hiện tính toán, v.v.

Hoạt động theo dõi (bắt đầu, dừng lại, v.v.) rất hữu ích ở đây (ở mức độ phù hợp).

Ngoài ra, rất phổ biến để sử dụng Nhật ký ứng dụng cụ thể (đôi khi được gọi là Nhật ký kiểm toán). Thông thường đây là bảng cơ sở dữ liệu hoặc tệp nhật ký ứng dụng và chứa dữ liệu có cấu trúc (tức là một tập hợp các trường).

Mọi thứ có thể bị mờ đi một chút ở đây tùy thuộc vào ứng dụng của bạn. Một ví dụ điển hình có thể là một máy chủ web ghi từng yêu cầu vào nhật ký web; các ví dụ tương tự có thể là một hệ thống nhắn tin hoặc hệ thống tính toán trong đó mỗi thao tác được ghi lại cùng với các chi tiết dành riêng cho ứng dụng.

Một ví dụ không hay là giao dịch trên thị trường chứng khoán hoặc hệ thống đặt hàng bán hàng. Trong các hệ thống này, có lẽ bạn đã đăng nhập hoạt động vì chúng có giá trị kinh doanh quan trọng, tuy nhiên, nguyên tắc tương quan giữa chúng với các hành động khác vẫn rất quan trọng.

Cũng như nhật ký ứng dụng tùy chỉnh, các hoạt động cũng thường có các bộ đếm peformance liên quan, ví dụ như số lượng giao dịch mỗi giây.

Nói chung, bạn nên phối hợp ghi nhật ký các hoạt động trên các hệ thống khác nhau, tức là ghi vào nhật ký ứng dụng của bạn cùng lúc khi bạn tăng bộ đếm hiệu suất và đăng nhập vào hệ thống theo dõi của bạn. Nếu bạn làm tất cả cùng một lúc (hoặc nối tiếp nhau trong mã), thì các vấn đề gỡ lỗi sẽ dễ dàng hơn (nếu tất cả chúng xảy ra ở các thời điểm / vị trí khác nhau trong mã).

(3) Dấu vết gỡ lỗi - Tệp văn bản, hoặc có thể là XML hoặc cơ sở dữ liệu.

Đây là thông tin ở cấp Verbose và thấp hơn (ví dụ: các công tắc boolean tùy chỉnh để bật / tắt kết xuất dữ liệu thô). Điều này cung cấp can đảm hoặc chi tiết về những gì một hệ thống đang làm ở cấp độ hoạt động phụ.

Đây là cấp độ bạn muốn có thể bật / tắt cho các phần riêng lẻ trong ứng dụng của mình (do đó có nhiều nguồn). Bạn không muốn những thứ này làm lộn xộn Nhật ký sự kiện Windows. Đôi khi một cơ sở dữ liệu được sử dụng, nhưng nhiều khả năng là các tệp nhật ký cuộn được thanh lọc sau một thời gian nhất định.

Một sự khác biệt lớn giữa thông tin này và tệp Nhật ký ứng dụng là nó không có cấu trúc. Trong khi Nhật ký ứng dụng có thể có các trường cho Đến, Từ, Số lượng, v.v., dấu vết gỡ lỗi Verbose có thể là bất cứ thứ gì lập trình viên đưa vào, ví dụ: "kiểm tra giá trị X = {value}, Y = false" hoặc nhận xét / đánh dấu ngẫu nhiên như " Làm xong, thử lại ".

Một thực tế quan trọng là đảm bảo những thứ bạn đặt trong tệp nhật ký ứng dụng hoặc Nhật ký sự kiện Windows cũng được ghi vào hệ thống theo dõi với cùng chi tiết (ví dụ: dấu thời gian). Điều này cho phép bạn sau đó tương quan các bản ghi khác nhau khi điều tra.

Nếu bạn đang dự định sử dụng một trình xem nhật ký cụ thể vì bạn có mối tương quan phức tạp, ví dụ Trình xem theo dõi dịch vụ, thì bạn cần sử dụng một định dạng thích hợp, ví dụ như XML. Mặt khác, một tệp văn bản đơn giản thường đủ tốt - ở các cấp thấp hơn, thông tin phần lớn không có cấu trúc, vì vậy bạn có thể tìm thấy các mảng, các ngăn xếp ngăn xếp, v.v. không sao đâu.

Q: Nếu sử dụng tệp, bạn có sử dụng nhật ký cán hoặc chỉ một tệp không? Làm thế nào để bạn làm cho các bản ghi có sẵn cho mọi người để tiêu thụ?

Trả lời: Đối với các tệp, nói chung bạn muốn cuộn các tệp nhật ký từ quan điểm có thể quản lý (với System.Diagnostics chỉ cần sử dụng VisualBasic.Logging.FileLogTraceListener).

Sẵn có một lần nữa phụ thuộc vào hệ thống. Nếu bạn chỉ nói về các tệp thì đối với máy chủ / dịch vụ, các tệp cuộn chỉ có thể được truy cập khi cần thiết. (Nhật ký sự kiện Windows hoặc Nhật ký ứng dụng cơ sở dữ liệu sẽ có cơ chế truy cập riêng).

Nếu bạn không có quyền truy cập dễ dàng vào hệ thống tệp, thì việc gỡ lỗi truy tìm cơ sở dữ liệu có thể dễ dàng hơn. [tức là thực hiện cơ sở dữ liệu TraceListener].

Một giải pháp thú vị mà tôi thấy cho một ứng dụng GUI Windows là nó đã ghi thông tin truy tìm rất chi tiết vào "máy ghi chuyến bay" trong khi chạy và sau đó khi bạn tắt nó nếu không có vấn đề gì thì nó chỉ cần xóa tệp.

Tuy nhiên, nếu nó bị sập hoặc gặp sự cố thì tệp không bị xóa. Hoặc nếu nó bắt lỗi, hoặc lần sau khi nó chạy, nó sẽ thông báo tệp, và sau đó nó có thể thực hiện hành động, ví dụ: nén nó (ví dụ 7zip) và gửi email hoặc có sẵn.

Nhiều hệ thống ngày nay kết hợp báo cáo tự động về các lỗi cho máy chủ trung tâm (sau khi kiểm tra với người dùng, ví dụ: vì lý do riêng tư).


Đang xem

Q: Công cụ nào để bạn sử dụng để xem nhật ký?

Trả lời: Nếu bạn có nhiều nhật ký vì những lý do khác nhau thì bạn sẽ sử dụng nhiều người xem.

Notepad / vi / Notepad ++ hoặc bất kỳ trình soạn thảo văn bản nào khác là cơ bản cho nhật ký văn bản thuần túy.

Nếu bạn có các hoạt động phức tạp, ví dụ như các hoạt động với chuyển khoản, thì rõ ràng, bạn sẽ sử dụng một công cụ chuyên dụng như Trình xem theo dõi dịch vụ. (Nhưng nếu bạn không cần nó, thì trình soạn thảo văn bản sẽ dễ dàng hơn).

Vì tôi thường ghi thông tin cấp cao vào Nhật ký sự kiện Windows, sau đó nó cung cấp một cách nhanh chóng để có được một cái nhìn tổng quan, theo cách có cấu trúc (tìm các biểu tượng lỗi / cảnh báo đẹp). Bạn chỉ cần bắt đầu tìm kiếm thông qua các tệp văn bản nếu không có đủ trong nhật ký, mặc dù ít nhất nhật ký cung cấp cho bạn một điểm khởi đầu. (Tại thời điểm này, đảm bảo nhật ký của bạn có các mục nhập phối hợp trở nên hữu ích).

Nói chung, Nhật ký sự kiện Windows cũng cung cấp các sự kiện quan trọng này cho các công cụ giám sát như MOM hoặc OpenView.

Khác --

Nếu bạn đăng nhập vào Cơ sở dữ liệu, có thể dễ dàng lọc và sắp xếp thông tin (ví dụ: phóng to một id hoạt động cụ thể.

MS Excel (hoặc một chương trình bảng tính khác). Điều này có thể hữu ích cho việc phân tích thông tin có cấu trúc hoặc bán cấu trúc nếu bạn có thể nhập nó với các dấu phân cách phù hợp để các giá trị khác nhau đi vào các cột khác nhau.

Khi chạy một dịch vụ trong gỡ lỗi / kiểm tra, tôi thường lưu trữ nó trong một ứng dụng bảng điều khiển để đơn giản, tôi thấy một trình ghi nhật ký bảng điều khiển màu hữu ích (ví dụ: màu đỏ cho lỗi, màu vàng cho cảnh báo, v.v.). Bạn cần phải thực hiện một trình nghe theo dõi tùy chỉnh.

Lưu ý rằng khung công tác không bao gồm bộ ghi bảng điều khiển màu hoặc bộ ghi cơ sở dữ liệu, vì vậy, ngay bây giờ, bạn sẽ cần phải viết chúng nếu bạn cần chúng (nó không quá khó).

Tôi thực sự khó chịu khi một số khung công tác (log4net, EntLib, v.v.) đã lãng phí thời gian để phát minh lại bánh xe và thực hiện lại việc ghi nhật ký, lọc và ghi nhật ký cơ bản vào các tệp văn bản, Nhật ký sự kiện Windows và các tệp XML cách khác nhau (báo cáo nhật ký là khác nhau trong mỗi); mỗi người sau đó đã triển khai phiên bản riêng của họ, ví dụ, một bộ ghi cơ sở dữ liệu, khi hầu hết những thứ đó đã tồn tại và tất cả những gì cần thiết là một vài người nghe theo dõi cho System.Diagnostics. Nói về một sự lãng phí lớn của nỗ lực trùng lặp.

Q: Nếu bạn đang xây dựng một giải pháp ASP.NET, bạn cũng sử dụng ASP.NET Health Giám sát? Bạn có bao gồm đầu ra theo dõi trong các sự kiện theo dõi sức khỏe? Còn Trace.axd thì sao?

Những thứ này có thể được bật / tắt khi cần thiết. Tôi thấy Trace.axd khá hữu ích để gỡ lỗi cách máy chủ phản hồi với một số thứ nhất định, nhưng nó thường không hữu ích trong môi trường được sử dụng nhiều hoặc để theo dõi lâu dài.

Q: Điều gì về quầy hiệu suất tùy chỉnh?

Đối với một ứng dụng chuyên nghiệp, đặc biệt là máy chủ / dịch vụ, tôi hy vọng sẽ thấy nó được trang bị đầy đủ với cả bộ đếm Giám sát hiệu suất và đăng nhập vào Nhật ký sự kiện Windows. Đây là những công cụ tiêu chuẩn trong Windows và nên được sử dụng.

Bạn cần đảm bảo bạn bao gồm các trình cài đặt cho bộ đếm hiệu suất và nhật ký sự kiện mà bạn sử dụng; chúng nên được tạo khi cài đặt (khi cài đặt với tư cách quản trị viên). Khi ứng dụng của bạn chạy bình thường, nó không cần có đặc quyền quản trị (và vì vậy sẽ không thể tạo nhật ký bị thiếu).

Đây là một lý do tốt để thực hành phát triển như một người không phải là quản trị viên (có tài khoản quản trị viên riêng khi bạn cần cài đặt dịch vụ, v.v.). Nếu ghi vào Nhật ký sự kiện, .NET sẽ tự động tạo một nhật ký bị thiếu trong lần đầu tiên bạn viết vào đó; nếu bạn phát triển như một người không phải là quản trị viên, bạn sẽ nắm bắt được điều này sớm và tránh một sự ngạc nhiên khó chịu khi khách hàng cài đặt hệ thống của bạn và sau đó không thể sử dụng nó vì họ không chạy với tư cách quản trị viên.


FYI: Tôi gặp phải một vấn đề trong đó microsoft theo dõi một tệp bị hỏng. Nếu bạn có nhiều quá trình (hoặc luồng) ghi vào cùng một tệp và chúng va chạm, bạn sẽ gặp lỗi khóa truy cập độc quyền của hệ thống tệp trên tệp nhật ký.
Jay

1
Cơ sở hạ tầng System.Diagnostics là an toàn luồng; hành vi mặc định là để khung khóa, tuy nhiên bạn có thể ghi đè TraceListener.IsThreadSafe nếu bạn cung cấp khóa riêng của mình. Xem msdn.microsoft.com/en-us/l Library / . Đối với nhiều quy trình, thông thường bạn sẽ ghi vào các tệp riêng biệt, nhưng lưu ý rằng Trình xem theo dõi dịch vụ có thể tải nhiều tệp theo dõi (ví dụ từ nhiều máy) và tương quan chúng qua ActivityId.
Sly Gryphon

1
Bạn có thể đề xuất cách sử dụng TraceEvent () để ghi lại các ngoại lệ không?
Dmitriy Sosunov

1
Không phải là một trong những nhược điểm chính của System.Diagnostics.Tracenó được trang trí [Conditional("TRACE")]khiến nó không sử dụng được trong môi trường sản xuất, nơi bạn hiếm khi có mã được biên dịch với TRACEcờ?
Asbjørn Ulsberg

2
@asbjornu Cấu hình phát hành phát hành mặc định trong Visual Studio có TRACE được xác định (đó là DEBUG bị tắt cho các bản dựng Phát hành); nếu xây dựng từ dòng lệnh bạn làm, tuy nhiên, cần phải bật nó.
Sly Gryphon

40

Tôi phải tham gia điệp khúc giới thiệu log4net, trong trường hợp của tôi xuất phát từ tính linh hoạt của nền tảng (máy tính để bàn .Net / Compact Framework, quan điểm 32/64-bit).

Tuy nhiên, gói nó trong API nhãn riêng là một mô hình chống chính . log4net.ILoggerđã là đối tác .Net của API trình bao bọc Đăng nhập Commons , do đó, việc ghép nối đã được giảm thiểu cho bạn và vì đó cũng là thư viện Apache, điều đó thường không phải là mối lo ngại vì bạn không từ bỏ bất kỳ điều khiển nào: hãy rẽ nhánh nếu bạn phải.

Hầu hết các thư viện trình bao bọc nhà mà tôi đã thấy cũng phạm phải một hoặc nhiều lỗi:

  1. Sử dụng một logger đơn toàn cầu (hoặc tương đương là một điểm vào tĩnh) làm mất độ phân giải tốt của mẫu logger-per-class được đề xuất cho không có mức tăng chọn lọc nào khác.
  2. Không thể hiển thị Exceptionđối số tùy chọn , dẫn đến nhiều vấn đề:
    • Nó làm cho một chính sách ghi nhật ký ngoại lệ thậm chí khó khăn hơn để duy trì, vì vậy không có gì được thực hiện một cách nhất quán với các ngoại lệ.
    • Ngay cả với một chính sách nhất quán, định dạng ngoại lệ thành một chuỗi sẽ mất dữ liệu sớm. Tôi đã viết một trình ILayouttrang trí tùy chỉnh thực hiện chi tiết chi tiết về một ngoại lệ để xác định chuỗi sự kiện.
  3. Không để lộ các thuộc tínhIsLevelEnabled , loại bỏ khả năng bỏ qua mã định dạng khi các khu vực hoặc mức ghi nhật ký bị tắt.

1
Tôi được giao nhiệm vụ tái cấu trúc trình bao bọc trong nhà (khủng khiếp) xung quanh log4j thành một thứ gì đó ít kinh khủng hơn (nó vẫn khá tệ, nhưng đó là kết quả của việc khắc phục các yêu cầu tôi đưa ra cho log4j). Tôi đã cố gắng để loại bỏ các điểm nhập tĩnh toàn cầu, nhưng đã bị bắn hạ. Tôi thực sự không nhận được điểm. Trong thiết lập của chúng tôi, log4j được mở rộng và xoắn rất nhiều đến nỗi nó thực sự chỉ được sử dụng như một bộ điều phối sự kiện; chúng tôi chỉ sử dụng nó vì ai đó đã hỏi "làm thế nào chúng ta có thể sử dụng log4j cho việc này?" Hoặc sử dụng log4whwh thẳng lên, hoặc chỉ viết khung của riêng bạn. Đường giữa thật đau đớn.
Adam Jaskiewicz

25
Tôi không đồng ý với khuyến nghị của bạn không bọc log4net. Kết hợp nó với API mô hình nhà cung cấp mỏng cho phép người dùng thư viện lớp của bạn cắm khung ghi nhật ký yêu thích của họ. YMMV tất nhiên, nhưng mô tả nó như là một "mô hình chống chính" là một chút giáo điều. Ngoài ra, thực tế là tồn tại các thư viện trình bao bọc với "một lỗi của lỗi" không phải là một lập luận tốt chống lại trình bao bọc được viết tốt.
Joe

1
Gọi một cái gì đó là một mô hình chống không có nghĩa là nó luôn luôn là một ý tưởng tồi 100% - chỉ là nó tạo ra xu hướng vẽ mình vào một góc nếu bạn không cẩn thận. Ngoài ra, ILog / LogManager tự nó là một thư viện mini trình bao bọc được viết tốt trong hình ảnh ghi nhật ký chung được gói trong cụm log4net, nhưng không có lý do gì nó không thể được trích xuất và biến thành một bản ghi nhật ký thích hợp cho CLR.
Jeffrey Hantin

18

Tôi không thường phát triển trong asp.net, tuy nhiên khi nói đến logger tôi nghĩ rằng rất nhiều thực tiễn tốt nhất là phổ biến. Dưới đây là một số suy nghĩ ngẫu nhiên của tôi về việc đăng nhập mà tôi đã học được trong nhiều năm qua:

Khung

  • Sử dụng khung trừu tượng logger - như slf4j (hoặc tự cuộn), để bạn tách rời việc thực hiện logger khỏi API của bạn. Tôi đã thấy một số khung logger đến và đi và tốt hơn hết là bạn có thể áp dụng một khung mới mà không gặp nhiều rắc rối.
  • Cố gắng tìm một khung hỗ trợ nhiều định dạng đầu ra.
  • Cố gắng tìm một khung hỗ trợ các plugin / bộ lọc tùy chỉnh.
  • Sử dụng một khung có thể được cấu hình bởi các tệp bên ngoài, để khách hàng / người tiêu dùng của bạn có thể dễ dàng điều chỉnh đầu ra nhật ký để có thể dễ dàng đọc được các ứng dụng quản lý nhật ký thương mại.
  • Hãy chắc chắn không vượt quá mức ghi nhật ký tùy chỉnh, nếu không bạn không thể chuyển sang các khung đăng nhập khác nhau.

Đầu ra logger

  • Cố gắng tránh các bản ghi kiểu XML / RSS để ghi nhật ký có thể gặp phải những thất bại thảm hại. Điều này rất quan trọng vì nếu công tắc nguồn bị tắt mà không có bộ ghi của bạn ghi </xxx>thẻ đóng , nhật ký của bạn bị hỏng.
  • Đăng nhập chủ đề. Nếu không, có thể rất khó để theo dõi dòng chương trình của bạn.
  • Nếu bạn phải quốc tế hóa nhật ký của mình, bạn có thể muốn nhà phát triển chỉ đăng nhập bằng tiếng Anh (hoặc ngôn ngữ bạn chọn).
  • Đôi khi, có tùy chọn chèn các câu lệnh ghi nhật ký vào các truy vấn SQL có thể là cứu cánh trong các tình huống gỡ lỗi. Nhu la:
    - Lớp gọi: com.foocorp.foopackage.FooClass: 9021
    CHỌN * TỪ foo;
  • Bạn muốn đăng nhập cấp lớp. Bạn thường không muốn có các phiên bản tĩnh của logger - nó không đáng để tối ưu hóa vi mô.
  • Đánh dấu và phân loại các ngoại lệ được ghi lại đôi khi hữu ích vì không phải tất cả các ngoại lệ đều được tạo bằng nhau. Vì vậy, biết một tập hợp con của các ngoại lệ quan trọng, người đứng đầu thời gian là hữu ích, nếu bạn có một trình theo dõi nhật ký cần gửi thông báo theo các trạng thái quan trọng.
  • Bộ lọc trùng lặp sẽ tiết kiệm thị lực và đĩa cứng của bạn. Bạn có thực sự muốn xem báo cáo đăng nhập tương tự được lặp lại 10 ^ 10000000 lần không? Sẽ không tốt hơn nếu chỉ nhận được một tin nhắn như: This is my logging statement - Repeated 100 times

Cũng xem câu hỏi này của tôi .


5
bộ lọc sao chép là một ý tưởng tuyệt vời
Paul Stovell

Tôi đã từng đồng ý về vấn đề thẻ bị hỏng, nhưng hầu hết các nhà văn XML giỏi đều không sử dụng XML đầy đủ (nghĩa là không có phần tử gốc) để họ có thể đăng nhập mà không cần tải XML DOM. trong trường hợp không phổ biến, một sự cố xảy ra từ một mục được viết một phần, bạn có thể tự khắc phục nó
Paul Stovell

Tôi đã trở lại và đăng nhập vào XML trong nhiều năm. Bây giờ, nó có vẻ quá mức đối với tôi. Nếu tôi cần một nguồn cấp dữ liệu RSS về trạng thái của một ứng dụng, tôi nghĩ rằng nó được triển khai tốt hơn với tiện ích theo dõi nhật ký.
Ê-li

Tôi đồng ý trên RSS. Tôi đang suy nghĩ nhiều hơn về các công cụ trực quan cho phép bạn hiểu rõ hơn về mục này. với các tệp văn bản bạn thường muốn giữ một mục nhập vào một dòng; nhưng đôi khi bạn muốn bao gồm dấu vết ngăn xếp hoặc các đối tượng nối tiếp. đó là nơi mà một bản ghi XML (như được sử dụng bởi WCF) có ích
Paul Stovell

+1 để đề cập đến công cụ truy vấn SQL. Điều này thực sự rất hữu ích cho mối tương quan của dấu vết cơ sở dữ liệu và dấu vết ứng dụng. Tôi đang thực hiện thủ công trong DAL của mình, nhưng tôi tự hỏi loại công cụ nào hỗ trợ cho kỹ thuật này?
Constantin

17

Tôi không đủ điều kiện để nhận xét về việc đăng nhập .Net, vì bánh mì và bơ của tôi là Java, nhưng chúng tôi đã có một sự di chuyển trong việc đăng nhập của chúng tôi trong 8 năm qua, bạn có thể tìm thấy một sự tương tự hữu ích cho câu hỏi của bạn.

Chúng tôi đã bắt đầu với một trình ghi nhật ký Singleton được sử dụng bởi mọi luồng trong JVM và đặt mức ghi nhật ký cho toàn bộ quá trình. Điều này dẫn đến các bản ghi lớn nếu chúng ta phải gỡ lỗi ngay cả một phần rất cụ thể của hệ thống, vì vậy bài học số một là phân đoạn nhật ký của bạn.

Hiện tại của chúng tôi về logger cho phép nhiều trường hợp với một trường hợp được xác định là mặc định. Chúng ta có thể khởi tạo bất kỳ số lượng logger con nào có các mức ghi nhật ký khác nhau, nhưng khía cạnh hữu ích nhất của kiến ​​trúc này là khả năng tạo logger cho các gói và lớp riêng lẻ bằng cách thay đổi các thuộc tính ghi nhật ký. Bài học số hai là tạo ra một hệ thống linh hoạt cho phép ghi đè hành vi của nó mà không thay đổi mã.

Chúng tôi đang sử dụng thư viện ghi nhật ký chung của Apache bao quanh Log4J.

Hi vọng điêu nay co ich!

* Biên tập *

Sau khi đọc bài đăng của Jeffrey Hantin dưới đây, tôi nhận ra rằng tôi nên lưu ý những gì trình bao bọc ghi nhật ký nội bộ của chúng tôi đã thực sự trở thành. Bây giờ về cơ bản nó là một nhà máy và được sử dụng nghiêm ngặt để có được một bộ ghi chép hoạt động bằng cách sử dụng tệp thuộc tính chính xác (vì lý do di sản đã không được chuyển đến vị trí mặc định). Vì bạn có thể chỉ định tệp cấu hình ghi nhật ký trên dòng lệnh ngay bây giờ, tôi nghi ngờ nó sẽ trở nên gọn gàng hơn và nếu bạn đang bắt đầu một ứng dụng mới, tôi chắc chắn đồng ý với tuyên bố của anh ấy rằng bạn thậm chí không nên bận tâm đến việc ghi nhật ký.


cảm ơn vì câu trả lời Bạn có tạo các logger con theo cách thủ công trong mã (nghĩa là chúng được mã hóa cứng) hoặc thông qua một số thứ tự động / ẩn?
Paul Stovell

Không ... nếu chúng ta thêm cấu hình ghi nhật ký vào tệp log.properations cho gói hoặc lớp, chúng sẽ được ghi theo cấu hình đó nhưng bất kỳ gói hoặc lớp nào không được cấu hình cụ thể sẽ được ghi ở mức mặc định.
Steve Moyer

9

Chúng tôi sử dụng Log4Net tại nơi làm nhà cung cấp nhật ký, với trình bao bọc singleton cho phiên bản nhật ký (mặc dù singleton đang được xem xét, đặt câu hỏi liệu chúng có phải là một ý tưởng tốt hay không).

Chúng tôi chọn nó vì những lý do sau:

  • Cấu hình / cấu hình lại đơn giản trên các môi trường khác nhau
  • Một số lượng lớn các ứng dụng được xây dựng trước
  • Một trong những CMS chúng tôi sử dụng đã được tích hợp sẵn
  • Một số lượng lớn các mức và cấu hình nhật ký xung quanh chúng

Tôi nên đề cập, điều này được nói từ quan điểm phát triển ASP.NET

Tôi có thể thấy một số ưu điểm khi sử dụng Dấu vết trong khung .NET nhưng tôi không hoàn toàn được bán trên đó, chủ yếu vì các thành phần tôi làm việc không thực sự thực hiện bất kỳ cuộc gọi nào của Trace. Điều duy nhất mà tôi thường xuyên sử dụng đó là System.Net.Mailtừ những gì tôi có thể nói.

Vì vậy, chúng tôi có một thư viện bao bọc log4net và trong mã của chúng tôi, chúng tôi chỉ cần những thứ như thế này:

Logger.Instance.Warn("Something to warn about");
Logger.Instance.Fatal("Something went bad!", new Exception());

try {
  var i = int.Parse("Hello World");
} catch(FormatException, ex) {
  Logger.Instance.Error(ex);
}

Trong các phương thức chúng tôi kiểm tra xem mức độ ghi nhật ký có được bật hay không, vì vậy bạn không có các cuộc gọi dự phòng tới API log4net (vì vậy nếu Debug không được bật, các câu lệnh gỡ lỗi sẽ bị bỏ qua), nhưng khi tôi nhận được một chút thời gian Tôi sẽ cập nhật nó để phơi bày những thứ đó để bạn có thể tự kiểm tra. Điều này sẽ ngăn việc đánh giá được thực hiện khi họ không nên, ví dụ:

Logger.Instance.Debug(string.Format("Something to debug at {0}", DateTime.Now);

Điều này sẽ trở thành:

if(Logger.DebugEnabled) Logger.Instance.Debug(string.Format("Something to debug at {0}", DateTime.Now);

(Tiết kiệm một chút thời gian thực hiện)

Theo mặc định, chúng tôi đăng nhập tại hai địa điểm:

  1. Hệ thống tệp của trang web (trong phần mở rộng tệp không được phục vụ)
  2. Gửi email cho Lỗi & gây tử vong

Các tệp được thực hiện dưới dạng cuộn mỗi ngày hoặc 10mb (IIRC). Chúng tôi không sử dụng EventLog vì nó có thể yêu cầu bảo mật cao hơn chúng tôi thường muốn cung cấp cho một trang web.

Tôi thấy Notepad hoạt động tốt để đọc nhật ký.


Khung ghi nhật ký là một trong số ít trường hợp trong đó singleton không bị lạm dụng.
mmcdole

Nó có thể là nếu bạn muốn cung cấp một bối cảnh xung quanh logger của bạn. Nhưng nó giúp giải quyết vấn đề đồng thời
Aaron Powell

7
Tôi chắc chắn sẽ tách ra singleton. Bạn chắc chắn có thể có một cá thể duy nhất được truyền xung quanh (tốt nhất là trong bộ chứa IOC / DI). Tôi cũng sẽ cố gắng chuyển đăng nhập vào một máy bay đánh chặn ....
yfeldblum

2
Không phải là một fan hâm mộ của trường hợp duy nhất. Tôi thích cung cấp cho mỗi lớp một logger có tên duy nhất để việc đăng nhập lên hoặc xuống trên cơ sở mỗi mô-đun là dễ dàng.
Jeffrey Hantin

8

Bạn sử dụng khuôn khổ nào?

Chúng tôi sử dụng kết hợp khối ứng dụng ghi nhật ký và trình trợ giúp ghi nhật ký tùy chỉnh hoạt động xung quanh các bit khung .Net. LAB được cấu hình để xuất các tệp nhật ký khá rộng bao gồm các tệp theo dõi chung riêng biệt cho mục nhập / thoát phương thức dịch vụ và các tệp lỗi cụ thể cho các sự cố không mong muốn. Cấu hình bao gồm ngày / giờ, luồng, pId, vv để hỗ trợ gỡ lỗi cũng như chi tiết ngoại lệ và ngăn xếp đầy đủ (trong trường hợp có ngoại lệ không mong muốn).

Trình trợ giúp ghi nhật ký tùy chỉnh sử dụng Trace.Correlation và đặc biệt tiện dụng trong bối cảnh đăng nhập trong WF. Ví dụ, chúng ta có một máy trạng thái gọi một loạt các quy trình công việc tuần tự. Tại mỗi hoạt động gọi này, chúng tôi ghi nhật ký bắt đầu (sử dụng StartLogicalOperation) và sau đó, cuối cùng chúng tôi dừng hoạt động logic bằng một trình xử lý sự kiện trả về gereric.

Điều này đã được chứng minh hữu ích một vài lần khi cố gắng gỡ lỗi thất bại trong các chuỗi kinh doanh phức tạp vì nó cho phép chúng tôi xác định những thứ như quyết định chi nhánh của If / Else, v.v. nhanh hơn dựa trên trình tự thực hiện hoạt động.

Bạn sử dụng đầu ra nhật ký nào?

Chúng tôi sử dụng tệp văn bản và tệp XML. Các tệp văn bản được định cấu hình thông qua khối ứng dụng nhưng chúng tôi cũng có đầu ra XML từ dịch vụ WF của chúng tôi. Điều này cho phép chúng tôi nắm bắt các sự kiện thời gian chạy (kiên trì, v.v.) cũng như các ngoại lệ loại doanh nghiệp chung. Các tệp văn bản là các bản ghi cuộn được cuộn theo ngày và kích thước (tôi tin rằng tổng kích thước 1MB là điểm cuộn qua).

Những công cụ để bạn sử dụng để xem các bản ghi?

Chúng tôi đang sử dụng Notepad và WCF Service Trace Viewer tùy thuộc vào nhóm đầu ra mà chúng tôi đang xem. Trình xem theo dõi dịch vụ WCF thực sự tiện dụng nếu bạn đã thiết lập đầu ra chính xác và có thể làm cho việc đọc đầu ra đơn giản hơn nhiều. Điều đó nói rằng, nếu tôi biết đại khái là lỗi ở đâu - chỉ cần đọc một tệp văn bản có chú thích tốt là tốt.

Các nhật ký được gửi đến một thư mục duy nhất sau đó được chia thành các thư mục con dựa trên dịch vụ nguồn. Thư mục gốc được hiển thị thông qua một trang web có quyền truy cập được kiểm soát bởi nhóm người dùng hỗ trợ. Điều này cho phép chúng tôi xem xét nhật ký sản xuất mà không cần phải đưa ra yêu cầu và trải qua các quy trình băng đỏ dài cho dữ liệu sản xuất.


6

Là tác giả của công cụ, tất nhiên chúng tôi sử dụng SmartInspect để ghi nhật ký và truy tìm các ứng dụng .NET. Chúng tôi thường sử dụng giao thức đường ống có tên để ghi nhật ký trực tiếp và tệp nhật ký nhị phân (được mã hóa) cho nhật ký người dùng cuối. Chúng tôi sử dụng Bảng điều khiển SmartInspect làm công cụ theo dõi và giám sát.

Thực tế có khá nhiều khung và công cụ ghi nhật ký cho .NET. Có một cái nhìn tổng quan và so sánh các công cụ khác nhau trên DotNetLogging.com .


5

Có rất nhiều khuyến nghị tuyệt vời trong câu trả lời.

Một thực hành tốt nhất nói chung là xem xét ai sẽ đọc nhật ký. Trong trường hợp của tôi, nó sẽ là một quản trị viên tại trang web của khách hàng. Vì vậy, tôi đăng nhập các thông điệp cung cấp cho họ một cái gì đó họ có thể hành động. Ví dụ: "Không thể khởi tạo ứng dụng. Điều này thường được gây ra bởi ......"


1

Chúng tôi sử dụng log4net trên các ứng dụng web của chúng tôi.

Khả năng tùy chỉnh ghi nhật ký vào thời gian chạy bằng cách thay đổi tệp cấu hình XML rất tiện lợi khi một ứng dụng bị trục trặc vào thời gian chạy và bạn cần xem thêm thông tin.

Nó cũng cho phép bạn nhắm mục tiêu các lớp hoặc thuộc tính cụ thể để đăng nhập. Điều này rất tiện lợi khi bạn có ý tưởng về lỗi xảy ra. Một ví dụ kinh điển là NHibernate nơi bạn muốn chỉ thấy SQL đi đến cơ sở dữ liệu.

Biên tập:

Chúng tôi viết tất cả các sự kiện vào cơ sở dữ liệu và hệ thống Trace. Nhật ký sự kiện chúng tôi sử dụng cho các lỗi hoặc ngoại lệ. Chúng tôi ghi nhật ký hầu hết các sự kiện vào cơ sở dữ liệu để có thể tạo báo cáo tùy chỉnh và cho phép người dùng xem nhật ký nếu họ muốn ngay từ ứng dụng.


Bạn có thể cung cấp thêm chi tiết về cách bạn sử dụng nó? Bạn có đăng nhập vào một tập tin hoặc nhật ký sự kiện? Đây có phải là một tệp nhật ký cán? Bạn làm gì để bảo mật nó hoặc sao lưu nó? Tôi quan tâm đến việc sử dụng thực tế.
Paul Stovell

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.