Quy tắc và lời khuyên để đăng nhập?


13

Trong tổ chức của tôi, chúng tôi đã đưa ra một số quy tắc / bang hội về việc đăng nhập mà tôi muốn biết nếu bạn có thể thêm hoặc nhận xét.

Chúng tôi sử dụng Java nhưng bạn có thể nhận xét chung về loggin - quy tắc và lời khuyên

  1. Sử dụng mức ghi nhật ký chính xác

    • LRI: Đã xảy ra lỗi và cần khắc phục ngay lập tức
    • CẢNH BÁO: Quá trình có thể tiếp tục mà không cần sửa chữa. Ứng dụng nên chấp nhận mức này nhưng cảnh báo phải luôn được điều tra.
    • THÔNG TIN: Thông tin rằng một quá trình quan trọng đã kết thúc
    • TRÁCH NHIỆM. Chỉ được sử dụng trong quá trình phát triển
  2. Hãy chắc chắn rằng bạn biết những gì bạn đang đăng nhập.

  3. Tránh việc đăng nhập ảnh hưởng đến hành vi của ứng dụng

Chức năng của việc ghi nhật ký sẽ là ghi thông điệp trong nhật ký.

  1. Thông điệp tường trình phải được mô tả, rõ ràng, ngắn gọn và súc tích.

Không có nhiều sử dụng một tin nhắn vô nghĩa khi xử lý sự cố.

  1. Đặt các thuộc tính đúng trong log4j

Đặt trong đó phương thức đúng và lớp được viết tự động.

Thí dụ:

Datedfile -web

log4j.rootLogger=ERROR, DATEDFILE
log4j.logger.org.springframework=INFO
log4j.logger.waffle=ERROR
log4j.logger.se.prv=INFO
log4j.logger.se.prv.common.mvc=INFO
log4j.logger.se.prv.omklassning=DEBUG

log4j.appender.DATEDFILE=biz.minaret.log4j.DatedFileAppender
log4j.appender.DATEDFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATEDFILE.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%C{1}.%M] - %m%n

log4j.appender.DATEDFILE.Prefix=omklassning.
log4j.appender.DATEDFILE.Suffix=.log
log4j.appender.DATEDFILE.Directory=//localhost/WebSphereLog/omklassning/
  1. Giá trị nhật ký.

Vui lòng đăng nhập giá trị từ ứng dụng.

  1. Đăng nhập tiền tố.

Nói rõ phần nào của ứng dụng đó là ghi nhật ký được viết từ, tốt nhất là với một cái gì đó cho tiền tố được dự án đồng ý, ví dụ PANDORA_DB

  1. Số lượng văn bản.

Hãy cẩn thận để không có quá nhiều văn bản đăng nhập. Nó có thể ảnh hưởng đến hiệu suất của ứng dụng.

  1. Định dạng đăng nhập:

-Có một số biến thể và phương thức sử dụng với log4j nhưng chúng tôi muốn sử dụng thống nhất định dạng sau, khi chúng tôi đăng nhập ở các trường hợp ngoại lệ:

logger.error("PANDORA_DB2: Fel vid hämtning av frist i TP210_RAPPORTFRIST", e);

Trong ví dụ trên, chúng ta giả sử rằng chúng ta đã đặt các thuộc tính log4j để nó tự động viết lớp và phương thức.

Luôn sử dụng logger và không như sau:

System.out.println(), System.err.println(), e.printStackTrace()

Nếu ứng dụng web sử dụng khung của chúng tôi, bạn có thể nhận thông tin lỗi rất chi tiết từ EJB, nếu sử dụng tính năng thử bắt trong trình xử lý và ghi nhật ký theo mô hình ở trên:

Trong dự án của chúng tôi, chúng tôi sử dụng mẫu chuyển đổi này với tên phương thức và tên lớp được viết tự động. Ở đây chúng tôi sử dụng hai pattents khác nhau cho console và cho datefil Ứng dụng:

log4j.appender.CONSOLE.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

log4j.appender.DATEDFILE.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

Trong cả hai ví dụ trên, phương thức wioll lớp được viết ra. Trong số hàng điều khiển cũng sẽ được viết của chúng tôi.

  1. toString()

Hãy có một toString()cho mọi đối tượng. VÍ DỤ:

@Override
public String toString() {
  StringBuilder sb = new StringBuilder();
  sb.append(" DwfInformation [ ");
  sb.append("cc: ").append(cc);
  sb.append("pn: ").append(pn);
  sb.append("kc: ").append(kc);
  sb.append("numberOfPages: ").append(numberOfPages);
  sb.append("publicationDate: ").append(publicationDate);
  sb.append("version: ").append(version);
  sb.append(" ]");
  return sb.toString();
}

thay vì phương pháp đặc biệt làm cho các đầu ra này

public void printAll()
{
    logger.info("inbet: " + getInbetInput());
    logger.info("betdat: " + betdat);
    logger.info("betid: " + betid);
    logger.info("send: " + send);
    logger.info("appr: " + appr);
    logger.info("rereg: " + rereg);   
    logger.info("NY: " + ny);   
    logger.info("CNT: " + cnt);   
}

Vì vậy, có bất cứ điều gì bạn có thể thêm, nhận xét hoặc tìm thấy nghi vấn với những cách sử dụng đăng nhập? Vui lòng trả lời hoặc nhận xét ngay cả khi nó không liên quan đến Java, Java và log4j chỉ là một triển khai về cách thức này được suy luận.



1
@gnat - Tôi nghĩ bạn nói đúng, có rất nhiều sự trùng lặp giữa hai câu hỏi. Tôi đang đấu tranh để gọi nó là một bản sao mặc dù.

Câu trả lời:


4

Là một phần mở rộng của quy tắc ghi nhật ký của bạn trong ứng dụng, câu lệnh ghi nhật ký xuất phát từ đâu, bạn có thể muốn thêm vào mỗi cờ ghi nhật ký cấp mô-đun. Thay vì ghi nhật ký mọi thứ, mọi lúc, điều này cho phép bạn nhắm mục tiêu có chọn lọc các phần trong ứng dụng của bạn. Có chi phí hoạt động và bạn cần tạo một cơ sở cho phép bạn bật / tắt tính năng ghi nhật ký đó. Lý tưởng nhất là bạn có thể bật / tắt nhanh khi ứng dụng đang chạy.

Tôi đã từng thấy một lớp bên dưới gỡ lỗi mà tôi gọi là "Dấu vết", nhưng đó không nhất thiết là một thuật ngữ phổ quát. Ghi nhật ký mức "theo dõi" càng nhiều càng tốt, bao gồm nhập / thoát mô-đun, dấu thời gian với mục nhập / thoát và điểm thưởng để nắm bắt các giá trị đã qua. Rõ ràng, điều đó tạo ra RẤT NHIỀU dữ liệu và đó không phải là thứ bạn bật willy-nilly. Nhưng nó có lợi thế đối với việc gỡ lỗi khi bạn không thể đính kèm vào quy trình hoặc bạn không có kết xuất cốt lõi của ứng dụng sai lầm.

Tôi muốn xem các tham chiếu tệp / mô-đun và dấu thời gian với thông tin nhật ký của tôi. Nó có thể hữu ích khi cố gắng tìm kiếm các điều kiện chạy đua giữa các luồng cũng như điều phối các hoạt động của nhiều lĩnh vực của ứng dụng. Công bằng mà nói, tôi biết một số người nghĩ rằng những chi tiết này làm lộn xộn tệp nhật ký. Thêm vào dấu thời gian là điều cần thảo luận với nhóm. (Xin lỗi nếu log4j đã làm điều đó.)

Nếu việc ghi nhật ký không được xử lý bởi luồng / quy trình riêng của nó, thì đó cũng là điều cần xem xét. Thay vì làm cho luồng ứng dụng chờ quá trình ghi nhật ký được xử lý, thông điệp tường trình sẽ được chuyển đến trình xử lý nhật ký và luồng ứng dụng tiếp tục theo cách vui vẻ của nó. Ngoài ra, tạo một số loại cơ chế bộ đệm để xử lý các thông điệp tường trình là một cách khác để tăng tốc độ phản ứng của ứng dụng.

Có các điều khiển về kích thước và lịch sử của các tệp nhật ký là một tính năng khác cần xem xét. Bạn không muốn ứng dụng thổi hết dung lượng đĩa trên hệ thống máy chủ, bạn cũng không nhất thiết muốn giữ tất cả các tệp nhật ký vĩnh viễn.


2

Một lưu ý là kiểm tra mức ghi nhật ký trước khi bạn thực hiện bất kỳ loại thao tác chuỗi nào để ghi nhật ký. Đó là, đừng đi đến tất cả công việc thiết lập một bộ định dạng ngày hoặc nối một chuỗi các chuỗi để tạo thông điệp tường trình nếu bạn không thực sự đăng nhập nó. Điều đó chỉ lãng phí công việc làm chậm ứng dụng của bạn.

FYI, dự án Apache Commons có một ToStringBuilder lớp đơn giản hóa việc tạo các toString()phương thức của bạn .


1

Tôi không tìm thấy bất cứ điều gì đáng nghi ngờ trong những gì bạn đã thêm vào đây Nick. Đây là cách tôi đã làm nó một thời gian. Bài đăng mà bạn đã cung cấp rất chi tiết và có thể có thể được sử dụng như một loại hướng dẫn để đăng nhập. Tuy nhiên, tôi muốn thêm một điều ở đây, đó là: Ở nhiều nơi, tôi đã thấy các chaps sử dụng ghi nhật ký có điều kiện, ví dụ:

     if(env_local)
     {
     write_to_local();
     }    
     else if(env_IT)
     {
     write_to_IT();
     } 
     else if(env_PROD)
     {
     write_to_prod();
     } 
     else
     dosomething();

Tôi nghĩ rằng loại theo dõi có điều kiện hoặc gỡ lỗi không phải là cách tốt nhất để đi.


1

Ngoài việc ghi nhật ký Lớp / Phương thức gây ra lỗi, cũng rất hữu ích khi ghi nhật ký các tham số được truyền vào phương thức đó. Biết nơi phát sinh lỗi không hữu ích nếu nó chỉ xảy ra 1 lần trong số 1000; bạn cũng cần biết dữ liệu nào gây ra lỗi.

Tôi cũng thấy hữu ích khi có một biến xác định mức ghi nhật ký mặc định cho ứng dụng. Bằng cách đó, bạn có thể có mã DEBUG và INFO cùng với mã CẢNH BÁO và LRI. Khi chạy trong chế độ sản xuất, bạn mặc định nó không xuất thông tin DEBUG, nhưng khi có lỗi xuất hiện, bạn có thể cập nhật cờ và bắt đầu viết tin nhắn DEBUG vào nhật ký.


1

Ghi nhật ký hầu hết là một mối quan tâm xuyên suốt. Chỉ riêng Java là không đủ biểu cảm để làm cho bạn có thể tách riêng việc ghi nhật ký từ các logic kinh doanh thực tế của bạn. Điều này có nghĩa là bạn không thể lấy một phương thức và đưa nó vào một dự án khác nhưng bạn phải loại bỏ và điều chỉnh tất cả nhật ký của mình trước khi thực hiện. Và đó chỉ là phần nổi của tảng băng chìm.

Để ngăn chặn điều đó và các vấn đề khác khi kết hợp ghi nhật ký và logic kinh doanh "thực", bạn nên xem xét sử dụng lập trình hướng theo khía cạnh. Đối với Java, khung được sử dụng nhiều nhất sẽ là AspectJ.Có video youtube này từ các cuộc thảo luận về công nghệ của google giải thích AspectJ và việc sử dụng nó ngoài việc đăng nhập khá tốt. Bạn cũng sẽ tìm thấy nhiều ví dụ để đăng nhập chính mình ở đây trên stackexchange .


0

Một điều tôi muốn đề xuất là bạn có một phương tiện để có nhiều bối cảnh ghi nhật ký được liên kết với bất kỳ tệp nhật ký cụ thể nào và sắp xếp sao cho mọi nội dung ghi vào bất kỳ bối cảnh ghi nhật ký nào sẽ được ghi lại trừ khi mã yêu cầu bối cảnh ghi nhật ký loại bỏ nội dung của nó. Thiết kế như vậy sẽ cho phép một người nắm bắt các bản ghi khá chi tiết trong một hoạt động và loại bỏ chúng nếu hoạt động thành công, nhưng có sẵn chúng nếu hoạt động thất bại. Không có tính năng ghi nhật ký như vậy, có sẵn nhật ký tốt khi có lỗi xảy ra có thể yêu cầu ứng dụng lãng phí rất nhiều thời gian để ghi dữ liệu vô ích trong 99,99% khi mọi thứ hoạt động.

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.