Một số mẫu và chống mẫu đăng nhập ứng dụng là gì? [đóng cửa]


66

Gần đây tôi đã phải điều tra một vấn đề hiện trường cho ứng dụng doanh nghiệp lớn của chúng tôi. Tôi đã rất kinh hoàng bởi các bản ghi mà tôi phải tìm cách khắc phục sự cố và vào cuối ngày, các bản ghi không giúp ích gì cả trong việc xác định / cách ly lỗi.

Lưu ý: Tôi hiểu không phải tất cả các lỗi đều có thể phát hiện được thông qua nhật ký. Điều này không thay đổi thực tế là các bản ghi là khủng khiếp.

Có một số vấn đề rõ ràng với việc đăng nhập của chúng tôi mà chúng tôi đã có thể cố gắng khắc phục. Tôi không muốn liệt kê những thứ đó ở đây và tôi không thể chỉ cho bạn thấy các tệp nhật ký của chúng tôi để bạn có thể đưa ra lời khuyên về những việc cần làm.

Thay vào đó, để đánh giá mức độ tồi tệ của chúng tôi trên mặt trận đăng nhập, tôi muốn biết:

  1. Một số hướng dẫn , nếu có, khi nói đến đăng nhập cho một ứng dụng, đặc biệt là ứng dụng lớn.
  2. Có bất kỳ mẫu nào chúng ta nên tuân theo hoặc chống mẫu chúng ta nên biết không?
  3. Đây có phải là một điều quan trọng để khắc phục hoặc thậm chí có thể được sửa chữa hoặc tất cả các tệp nhật ký chỉ đơn giản là rất lớn và bạn cần các tập lệnh bổ sung để phân tích chúng?

Lưu ý bên: chúng tôi sử dụng log4j.

Câu trả lời:


55

Một vài điểm mà thực tiễn của tôi tỏ ra hữu ích:

  • Giữ tất cả mã đăng nhập trong mã sản xuất của bạn. Có khả năng cho phép đăng nhập nhiều hơn / ít chi tiết hơn trong sản xuất, tốt nhất là cho mỗi hệ thống con và không cần khởi động lại chương trình của bạn.

  • Làm cho các bản ghi dễ dàng phân tích bằng grepvà bằng mắt. Dính vào một số lĩnh vực phổ biến ở đầu mỗi dòng. Xác định thời gian, mức độ nghiêm trọng và hệ thống con trong mỗi dòng. Rõ ràng xây dựng thông điệp. Làm cho mọi thông điệp tường trình dễ dàng ánh xạ tới dòng mã nguồn của nó.

  • Nếu xảy ra lỗi, hãy cố gắng thu thập và ghi lại càng nhiều thông tin càng tốt. Nó có thể mất nhiều thời gian nhưng không sao vì xử lý bình thường đã thất bại. Không phải chờ đợi khi điều kiện tương tự xảy ra trong sản xuất với trình gỡ lỗi được đính kèm là vô giá.

Nhật ký chủ yếu là cần thiết để theo dõi và xử lý sự cố. Đặt mình vào vị trí của người khắc phục sự cố và suy nghĩ bạn muốn có loại nhật ký nào khi có sự cố xảy ra hoặc đã xảy ra trong đêm khuya.


10
Tôi thích câu trả lời này nhưng tôi sẽ nói thêm rằng điều quan trọng là ghi lại sự lựa chọn nào được đưa ra tại các điểm quyết định. Tôi đã thấy nhiều hệ thống có rất nhiều rác được ghi lại nhưng các quyết định chính không được đăng nhập. Vì vậy, 95% đăng nhập về cơ bản là vô dụng. Ngoài ra, đối với các hệ thống loại yêu cầu / phản hồi, điều quan trọng hơn là có thể đăng nhập theo yêu cầu so với hệ thống con.
Kevin

4
+1. Tôi thích quan điểm của bạn về việc đặt mình vào vị trí của người khắc phục sự cố. Nghe có vẻ như các báo cáo nhật ký sẽ chứa nhiều thông điệp chất lượng hơn sau đó là những gì chúng tôi đã và đang làm ...
c_maker

1
Điều quan trọng cần lưu ý là ghi nhật ký lỗi phải được ghi vào sự kiện chiếm dụng cũng như nhật ký ứng dụng.
Steven Evers

2
@SnOrfus: Có nhiều cách để lưu trữ nhật ký, nhưng điều cốt lõi là thông điệp nhật ký cần phải có sẵn đến giây cuối cùng mà hệ thống gặp sự cố - giống như hộp đen máy bay. Nếu bạn sử dụng bất kỳ loại bộ đệm nào, hãy cung cấp tùy chọn bỏ qua nó / xóa mọi tin nhắn.
rwong

1
@Rig: mặt khác, nhiều logger trồng tại nhà đã không thực hiện bất kỳ bộ đệm nào (và thực hiện một cách thận trọng mọi thông điệp), dẫn đến hiệu suất rất kém. Đây là lý do tại sao nó phải được thực hiện tùy chọn.
rwong

28

Tôi làm việc với các hệ thống thời gian thực an toàn quan trọng và ghi nhật ký thường là cách duy nhất để bắt những con bọ hiếm xuất hiện một lần mặt trăng xanh vào mỗi thứ ba thứ 53 khi đó là trăng tròn, nếu bạn bắt gặp sự trôi dạt của tôi. Kiểu này khiến bạn ám ảnh về chủ đề này, vì vậy tôi sẽ xin lỗi ngay bây giờ nếu tôi bắt đầu sùi bọt mép. Phần sau đây được viết cho nhật ký gỡ lỗi mã gốc, nhưng phần lớn nó cũng có thể áp dụng cho thế giới được quản lý ...

Sử dụng tệp nhật ký văn bản. Có vẻ rõ ràng, nhưng một số người cố gắng tạo các tệp nhật ký nhị phân: điều đó thật ngu ngốc vì tôi không cần phải tìm kiếm một công cụ đọc khi tôi ra ngoài thực địa. Ngoài ra, nếu văn bản và gỡ lỗi là dài dòng, rất có khả năng kỹ sư hiện trường có thể đọc tệp và chẩn đoán sự cố mà không bao giờ quay lại với tôi. Mọi người đều thắng.

Tôi thiết kế các hệ thống có khả năng ghi nhật ký khá nhiều thứ, nhưng tôi không bật mọi thứ theo mặc định. Thông tin gỡ lỗi được gửi đến hộp thoại gỡ lỗi ẩn, đánh dấu thời gian và đưa nó vào hộp danh sách (giới hạn trong khoảng 500 dòng trước khi xóa) và hộp thoại cho phép tôi dừng nó, lưu nó vào tệp nhật ký hoặc chuyển hướng nó sang tệp nhật ký một trình sửa lỗi đính kèm. Sự chuyển hướng đó cho phép tôi thấy đầu ra gỡ lỗi từ nhiều ứng dụng được tuần tự hóa gọn gàng, đôi khi có thể là một trình cứu sinh. Tôi đã từng sử dụng các mức ghi nhật ký số (bạn đặt mức càng cao, bạn càng nắm bắt được nhiều hơn):

off
errors only
basic
detailed
everything

nhưng điều này quá không linh hoạt - khi bạn tìm cách khắc phục lỗi, sẽ hiệu quả hơn nhiều khi có thể tập trung đăng nhập vào chính xác những gì bạn cần mà không phải lội qua hàng tấn mảnh vụn và đó có thể là một loại giao dịch hoặc hoạt động cụ thể Điều đó gây ra lỗi. Nếu điều đó đòi hỏi bạn phải bật mọi thứ lên, bạn chỉ đang làm cho công việc của mình trở nên khó khăn hơn. Bạn cần một cái gì đó tốt hơn.

Vì vậy, bây giờ tôi đang trong quá trình chuyển sang đăng nhập dựa trên hệ thống cờ. Mọi thứ được ghi lại đều có một cờ chi tiết loại hoạt động đó là gì và có một bộ hộp kiểm cho phép tôi xác định những gì được ghi lại. Thông thường danh sách đó trông như thế này:

#define DEBUG_ERROR          1
#define DEBUG_BASIC          2
#define DEBUG_DETAIL         4
#define DEBUG_MSG_BASIC      8
#define DEBUG_MSG_POLL       16
#define DEBUG_MSG_STATUS     32
#define DEBUG_METRICS        64
#define DEBUG_EXCEPTION      128
#define DEBUG_STATE_CHANGE   256
#define DEBUG_DB_READ        512
#define DEBUG_DB_WRITE       1024
#define DEBUG_SQL_TEXT       2048
#define DEBUG_MSG_CONTENTS   4096

Hệ thống ghi nhật ký này vận chuyển với bản dựng phát hành , bật và lưu vào tệp theo mặc định. Đã quá muộn để phát hiện ra bạn nên đăng nhập SAU lỗi đã xảy ra, nếu lỗi đó chỉ xảy ra trung bình sáu tháng một lần và bạn không có cách nào để tái tạo nó. Ghi nhật ký chỉ hoạt động với các bản dựng gỡ lỗi là chỉ. trơn. câm.

Phần mềm thường được phát hành với ERROR, BASIC, STATE_CHANGE và EXCEPTION được bật, nhưng điều này có thể được thay đổi trong trường thông qua hộp thoại gỡ lỗi (hoặc cài đặt đăng ký / ini / cfg, trong đó những thứ này được lưu).

Ồ và một điều - hệ thống gỡ lỗi của tôi tạo ra một tệp mỗi ngày. Yêu cầu của bạn có thể khác nhau. Nhưng hãy đảm bảo mã gỡ lỗi của bạn bắt đầu mọi tệp với ngày, phiên bản mã bạn đang chạy và nếu có thể, một số điểm đánh dấu cho ID khách hàng, vị trí của hệ thống hoặc bất cứ điều gì. Bạn có thể nhận được một loạt các tệp nhật ký đến từ trường và bạn cần một số bản ghi về những gì đến từ đâu và phiên bản nào của hệ thống mà họ đang chạy thực sự trong chính dữ liệu và bạn không thể tin tưởng vào khách hàng / kỹ sư lĩnh vực để cho bạn biết họ đã có phiên bản nào - họ có thể chỉ cho bạn biết họ nghĩ phiên bản nào họ có. Tệ hơn, họ có thể báo cáo phiên bản exe trên đĩa, nhưng phiên bản cũ vẫn đang chạy vì họ quên khởi động lại sau khi thay thế. Có mã của bạn cho bạn biết chính nó.

Cuối cùng, bạn không muốn mã của mình phát sinh vấn đề của riêng mình, vì vậy hãy đặt chức năng hẹn giờ để lọc các tệp nhật ký sau nhiều ngày hoặc vài tuần (chỉ cần kiểm tra sự khác biệt giữa thời gian tạo và thời gian tạo tệp). Điều này là ổn đối với một ứng dụng máy chủ chạy mọi lúc, trên ứng dụng phía máy khách, bạn có thể nhận được bằng cách xóa bất kỳ dữ liệu cũ nào khi bạn khởi động. Chúng tôi thường thanh lọc sau 30 ngày hoặc lâu hơn, trên một hệ thống không có các kỹ sư thường xuyên ghé thăm, bạn có thể muốn để nó lâu hơn. Rõ ràng điều này cũng phụ thuộc vào kích thước của tệp nhật ký của bạn.


1
+1 Nói chung câu trả lời xuất sắc, nhưng đặc biệt là để đưa id ứng dụng và thông tin phiên bản vào tệp nhật ký, thật không may, điều này rất thường xuyên bị bỏ qua.
Nhị phân nhị phân

27

Tài nguyên công cộng yêu thích của tôi cho các hướng dẫn ghi nhật ký là Thực tiễn tốt nhất của Apache JCL .

Thực tiễn tốt nhất cho JCL được trình bày trong hai loại: Chung và Doanh nghiệp. Các nguyên tắc chung là khá rõ ràng. Thực tiễn doanh nghiệp có liên quan nhiều hơn một chút và không phải lúc nào cũng rõ ràng về lý do tại sao chúng quan trọng.

Nguyên tắc thực hành tốt nhất cho doanh nghiệp áp dụng cho các thành phần và công cụ phần mềm trung gian dự kiến ​​sẽ thực thi trong môi trường cấp "Doanh nghiệp". Những vấn đề này liên quan đến Đăng nhập như Quốc tế hóa và phát hiện lỗi. Doanh nghiệp đòi hỏi nhiều nỗ lực và lập kế hoạch hơn, nhưng được khuyến khích mạnh mẽ (nếu không yêu cầu) trong các hệ thống cấp sản xuất. Các doanh nghiệp / môi trường doanh nghiệp khác nhau có các yêu cầu khác nhau, do đó, linh hoạt luôn giúp ...

Mặc dù nhắm mục tiêu JCL, nhưng những điều này dường như đủ chung để được chấp nhận để đăng nhập nói chung.

  • "Nguyên tắc" cá nhân của tôi để ghi nhật ký là ở cấp độ gỡ lỗi, tôi cố gắng làm cho nhật ký của mình đọc giống như một câu chuyện - với logic dễ hiểu và các chi tiết đầy đủ (nhưng không quá tải).

Hầu hết các mô hình chống nổi tiếng có lẽ là "nuốt ngoại lệ" - chỉ cần tìm kiếm trên web cho nó.

Đối với các tệp nhật ký lớn, trong thực tế của tôi, đây hầu hết là trường hợp bình thường. Và vâng, các tập lệnh bổ sung khi bạn gọi chúng và / hoặc các công cụ như Chainsaw cũng có vẻ bình thường đối với tôi.

  • Ở trên không có nghĩa là bạn phải luôn mù quáng đặt tất cả các bản ghi vào một tệp lớn. Đôi khi nó có thể hữu ích để viết / sao chép một số nhật ký vào các tệp riêng biệt. Ví dụ, trong dự án gần đây của tôi, những người QA đã yêu cầu các tệp chuyên dụng cho số liệu và dữ liệu thời gian và cho các báo cáo ngắn gọn về hoạt động của hệ thống. Họ nói rằng họ sẽ được hưởng lợi từ điều đó và nhà phát triển đã làm điều đó (lợi ích từ tệp báo cáo ngắn gọn hóa ra thực sự quan trọng).

Tái bút Về chống mẫu, những thứ khác xuất hiện trong tâm trí là "tràn ngập" và những thông điệp vô nghĩa.

  • Tôi gọi nó là lũ lụt khi tôi thấy nhiều tin nhắn tương tự đến từ một vòng lặp với nhiều lần lặp. Đối với tôi, lũ lụt đủ khó chịu để cố gắng loại bỏ nó khi tôi phát hiện ra nó trong mã nguồn. Thông thường việc cải thiện nó đòi hỏi một số nghệ thuật - bởi vì, tốt, những điều xảy ra trong vòng lặp có thể thú vị. Khi tôi không có thời gian để cải thiện nó sâu hơn, tôi cố gắng ít nhất thay đổi mức ghi nhật ký của những tin nhắn đó thành mức thấp nhất để dễ dàng lọc ra hơn.

  • Tin nhắn vô tri dường như là rác khá phổ biến. Chúng trông vô hại khi đọc mã nguồn - Tôi đoán người ta phải trải qua nỗi đau khi phân tích đầu ra gỡ lỗi trông giống như ...

    step #1
    step #2
    step #3
    

    ... Để đánh giá sâu sắc sự xấu xí vốn có của họ. Các heuristic yêu thích của tôi để phát hiện loại vấn đề này ở cấp mã nguồn (được đồng nghiệp đề xuất trong một trong các dự án trước đây của tôi) là tính toán số lần xuất hiện biểu tượng không gian trong chuỗi ký tự được sử dụng trong ghi nhật ký. Theo kinh nghiệm của tôi, không gian trống về cơ bản đảm bảo tuyên bố đăng nhập là vô nghĩa, một không gian cũng là một chỉ báo tốt về vấn đề tiềm năng.


4
Để tránh lũ lụt, tôi thường thu thập các heuristic của vòng lặp và xuất nó sau vòng lặp. Có nghĩa là bất cứ điều gì thú vị xảy ra trong vòng lặp nên được lưu trữ trong một biến (như somethingSpecialHappenedCount) và sau đó xuất ra bộ ghi.
Spoike

@Spoike điểm tốt! lưu trữ trong một biến thực sự là một trong những thủ thuật yêu thích của cá nhân tôi để chống lũ lụt
gnat

1
Tôi xuất tất cả các bộ đếm khác nhau cho bộ ghi dưới dạng bảng ASCII trong nhật ký sau khi vòng lặp kết thúc để chúng có thể dễ dàng so sánh. Ý tưởng bảng được lấy cảm hứng từ ý tưởng mà SpringWatch StopWatch.prettyPrint () tạo ra. Ngoài ra, làm cho văn bản nhật ký có thể đọc và có liên quan vẫn là một "nghệ thuật" như đã đề cập trước đó trong câu trả lời.
Spoike

@Spoike: (và @gnat) Điều này thật thú vị. Vì vậy, về cơ bản bạn thêm mã thực tế vào logic kinh doanh chỉ với mục đích đăng nhập? Tôi chưa bao giờ nghe về điều này hoặc làm điều này trước đây và không chắc chắn làm thế nào tôi sẽ biện minh cho đồng nghiệp của mình. Tôi sợ rằng nếu chúng tôi bắt đầu làm điều này, một số nhà phát triển của chúng tôi sẽ làm lộn xộn mã nguồn ở mức độ mà logic kinh doanh trở nên phức tạp và khó đọc. Chỉ cần đăng nhập một tuyên bố đã làm cho nguồn trông xấu hơn.
c_maker

2
@c_maker quan điểm của bạn về việc trộn ghi nhật ký với logic nghiệp vụ có vẻ đáng để đặt câu hỏi. Cá nhân tôi chưa có ý kiến ​​mạnh mẽ về những vấn đề này. Về lý thuyết có thể tưởng tượng một số cải tiến phân tách bằng AOP và iirc thậm chí có những ứng dụng thực tế cho phương pháp này. Tuy nhiên, trên thực tế, tôi gắn bó với phương pháp "hỗn hợp" và cho đến nay tôi không gặp vấn đề gì lớn với nó. Mã nguồn lộn xộn là mối nguy hiểm thực sự, nhưng, một lần nữa, cho đến nay tôi đã có thể làm cho nó cùng tồn tại với mã đăng nhập khá "ôn hòa". Điều này tất nhiên đòi hỏi nỗ lực nhất định.
gnat

11

Đăng nhập ngoại lệ chỉ một lần!

Một trong những điểm đau phổ biến mà tôi nhận thấy là đăng nhập và suy nghĩ lại một ngoại lệ. Kết quả là, các tệp nhật ký chứa các ngoại lệ giống nhau nhiều lần trên một số cấp độ ngăn xếp.


5

Đây là một mô hình chống: Tạo hai tá trường "chung chung" trong bảng cơ sở dữ liệu để theo dõi mọi thứ có thể hiểu được và sau đó có 88 (và đếm) các giá trị enum khác nhau cho các loại nhật ký khác nhau.


+1 - Tôi đã thấy điều này. "Bảng lỗi" có các cột như chuỗi1, chuỗi2, chuỗi3, chuỗi4, chuỗi5, trong đó việc kết hợp tất cả các cột sẽ dẫn đến mã lỗi không được tham chiếu trong bất kỳ tài liệu nào. Kết quả là đăng nhập vừa khó hiểu vừa vô dụng; còn được gọi là "bên thứ ba-doanh nghiệp-ứng dụng với tùy chỉnh phát triển-gỡ lỗi-địa ngục".
Morgan Herlocker

Trong trường hợp của tôi, đó là "hệ thống ghi nhật ký được cuộn bằng tay mà không có ý tưởng nào về việc đăng nhập thực sự liên quan đến cái gì"
Wayne Molina

4

Kinh nghiệm của tôi với nhật ký là càng lớn càng tốt, nhưng đủ nhất quán để làm cho nó có thể lọc được bằng máy và có thể định cấu hình mức độ nghiêm trọng cho từng thành phần trong ứng dụng của bạn.

Ngoài ra, rất khó để dự đoán bạn sẽ cần đăng nhập gì để tìm lỗi trong tương lai. Hầu hết các vị trí rõ ràng để ghi nhật ký lỗi đều được sửa trước khi sản phẩm ra khỏi cửa. Không có gì lạ khi kết quả của một báo cáo lỗi là bạn chỉ cần thêm ghi nhật ký để giúp chẩn đoán nếu nó xảy ra lần nữa.


2

Vài lưu ý từ phía hoạt động của ngôi nhà ở đây:

1) Đảm bảo các bản ghi có thể cấu hình cục bộ, tốt nhất là với một công cụ không nặng hơn trình soạn thảo văn bản. Hầu hết thời gian chúng tôi không muốn đăng nhập cấp độ TRACE, nhưng chúng tôi thích có thể bật nó lên.

2) Nếu có thể, hãy đảm bảo rằng các bản ghi có thể được đọc bằng một công cụ không nặng hơn trình soạn thảo văn bản. Không có gì tệ hơn là phải đi săn công cụ vào một giờ lẻ khi hệ thống sản xuất bị lỗi.


1

Từ kinh nghiệm của riêng tôi khi làm việc với các ứng dụng web:

(& xem xét lưu trữ là rất rẻ ngày nay)

  • Đăng nhập càng nhiều thông tin có sẵn (tại thời điểm đó) càng tốt.
  • Tôi luôn bao gồm DateTime. Bây giờ trong chuỗi log của tôi.
  • Tôi luôn luôn (nếu có thể) ghi lại thời lượng của một số "hành động" cụ thể.
  • Hãy thống nhất với chuỗi log của bạn. Vì luôn luôn tôi sử dụng loại mô hình này:

    • "[Thông tin X] [Thông tin Y] [Thông tin Z] [vv]"

1

Ngoài stacktrace, đăng nhập trạng thái ứng dụng hiện tại và đầu vào.

Phần mềm mang tính quyết định, hai phần mềm này thường là thứ duy nhất bạn cần để tái tạo lỗi. Lưu trữ trạng thái đầy đủ trong một số trường hợp có thể gây rắc rối vì vậy các cách để tạo lại trạng thái hiện tại, ví dụ như các đầu vào trước đó, cũng tốt.

Tất nhiên nhiều dữ liệu luôn luôn tốt hơn nhưng tối thiểu hai cái này là một khởi đầu tốt cho các sự cố dễ dàng nhất.


3
"Phần mềm mang tính quyết định" => không phải lúc nào cũng đáng tiếc. Hãy nghĩ lỗi đồng thời chẳng hạn.
assylias
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.