1.1 Giới thiệu về nhật ký

Nhật ký là một danh sách các sự kiện đã xảy ra. Gần giống như một tạp chí hàng hải hoặc nhật ký. Chà, theo đó, trình ghi nhật ký là một đối tượng mà bạn có thể đăng nhập. Trong lập trình, hầu hết mọi thứ đều được ghi nhật ký. Và trong Java, mọi thứ đều như vậy và thậm chí còn hơn thế nữa.

ghi nhật ký java

Thực tế là các chương trình Java thường là các ứng dụng máy chủ lớn không có giao diện người dùng, bảng điều khiển, v.v. Họ xử lý các yêu cầu từ hàng nghìn người dùng cùng một lúc và thường xảy ra nhiều lỗi khác nhau. Đặc biệt là khi các luồng khác nhau bắt đầu can thiệp lẫn nhau.

Và trên thực tế, cách duy nhất để tìm ra các lỗi và lỗi hiếm khi được lặp lại trong tình huống như vậy là ghi vào nhật ký / tệp mọi thứ xảy ra trong mỗi luồng.

Thông thường, thông tin được ghi vào nhật ký về các tham số của phương thức mà nó được gọi, tất cả các lỗi bị chặn và nhiều thông tin trung gian. Nhật ký càng đầy đủ thì càng dễ dàng khôi phục chuỗi sự kiện và theo dõi nguyên nhân gây ra lỗi hoặc lỗi.

Nhưng nhật ký càng lớn thì càng khó làm việc với nó. Đôi khi nhật ký đạt tới vài gigabyte mỗi ngày. Điều này là tốt.

1.2 Nhật ký không thành công

Là nhật ký đầu tiên, các nhà phát triển đã sử dụng đầu ra đơn giản cho bảng điều khiển . Thật tiện lợi khi thực hiện việc này trong quá trình gỡ lỗi ứng dụng - khi tất cả thông tin quan trọng và giá trị biến được ghi vào bảng điều khiển. Nhưng nhật ký như vậy hoàn toàn không thể áp dụng được trong quá trình hoạt động bình thường của ứng dụng.

Đầu tiên, ứng dụng có thể muốn tự xuất một thứ gì đó ra bảng điều khiển và người dùng hoàn toàn không muốn xem thông tin dịch vụ dành cho lập trình viên.

Thứ hai, kích thước của bộ đệm giao diện điều khiển bị hạn chế, bạn không thể viết nhiều ở đó.

Và cuối cùng, thứ ba, thông tin về lỗi chương trình được thu thập trong một thời gian dài nên được gửi đến các nhà phát triển chương trình. Và cách thuận tiện nhất là ghi tất cả thông tin này vào một tệp cùng một lúc.

Các nhà phát triển đã nhanh chóng giải quyết vấn đề đầu tiên - họ đã nghĩ ra một luồng đầu ra khác - System.err. Bạn có thể viết tin nhắn cho nó và chúng sẽ được gửi đến một chuỗi riêng biệt chứ không phải đến bảng điều khiển tiêu chuẩn.

Và ngay cả vấn đề ghi vào tệp cũng đã được giải quyết:

// Define the file to which we will write the log
System.setErr(new PrintStream(new File("log.txt")));
// Display messages
System.err.println("Message 1");
System.err.println("Message 2");
// Display an error message
try {
    throw new Exception("Error message");
} catch (Exception e) {
    e.printStackTrace();
}

Nhưng ngay cả ở dạng này, nó cũng không giải quyết được toàn bộ vấn đề, vì vậy người ta đã quyết định tạo một thư viện đặc biệt để ghi thông điệp tường trình vào một tệp. Cô ấy đã làm điều đó một cách thông minh và cho phép linh hoạt định cấu hình bộ lọc cho các sự kiện và dữ liệu đã ghi.

Trên thực tế, toàn bộ quá trình ghi nhật ký bao gồm ba phần:

  • Phần đầu tiên là thu thập thông tin .
  • Phần thứ hai là lọc thông tin thu thập được.
  • Phần thứ ba là ghi lại thông tin đã chọn.

1.3 Giới thiệu về bộ ghi nhật ký log4j

Trình ghi nhật ký phổ biến đầu tiên trong cộng đồng Java là log4j. Việc đưa nó vào dự án rất đơn giản, để làm được điều này, bạn chỉ cần thêm một vài dòng vào tệp pom.xml của mình


<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>2.2.17</version>
</dependency>

Sự tương tác của chương trình của bạn với một bộ ghi như vậy sẽ giống như thế này:

class Manager {
   private static final Logger logger = LoggerFactory.getLogger(Manager.class);

   public boolean processTask(Task task) {
        logger.debug("processTask id = " + task.getId());
        try {
            task.start();
            task.progress();
            task.complete();
            return true;
        } catch (Exception e) {
            logger.error("Unknown error", e);
            return false;
        }
    }
}

Ba điều xảy ra ở đây:

Việc tạo đối tượng được đánh dấu bằng màu xanh lá cây Logger . Đối tượng của nó được lưu trữ trong một biến tĩnh để làm việc thuận tiện hơn với nó. Và cả getLogger()thông tin về lớp mà thông tin được thu thập cũng được truyền cho phương thức.

Dòng được đánh dấu màu xanh lam là nơi chúng tôi chỉ ghi thông tin có giá trị trong quá trình gỡ lỗi . Đối với điều này, một phương pháp đặc biệt được sử dụng -debug()

Và cuối cùng, dòng nơi chúng tôi lưu ngoại lệ đã phát sinh vào nhật ký được đánh dấu bằng màu đỏ . Các ngoại lệ là các lỗi tiềm ẩn, vì vậy tệp error().