log4j - Hướng dẫn nhanh

log4j là một khung ghi nhật ký (API) đáng tin cậy, nhanh chóng và linh hoạt được viết bằng Java, được phân phối theo Giấy phép Phần mềm Apache.

log4j đã được chuyển sang các ngôn ngữ C, C ++, C #, Perl, Python, Ruby và Eiffel.

log4j có thể cấu hình cao thông qua các tệp cấu hình bên ngoài trong thời gian chạy. Nó xem quá trình ghi nhật ký theo mức độ ưu tiên và cung cấp các cơ chế để hướng thông tin ghi nhật ký đến nhiều đích khác nhau, chẳng hạn như cơ sở dữ liệu, tệp, bảng điều khiển, UNIX Syslog, v.v.

log4j có ba thành phần chính:

  • loggers: Chịu trách nhiệm nắm bắt thông tin ghi nhật ký.

  • appenders: Chịu trách nhiệm xuất bản thông tin ghi nhật ký đến các điểm đến ưa thích khác nhau.

  • layouts: Chịu trách nhiệm định dạng thông tin ghi nhật ký theo các kiểu khác nhau.

Lịch sử của log4j

  • Bắt đầu vào đầu năm 1996 với tư cách là API truy tìm cho dự án EU SEMPER (Thị trường điện tử an toàn cho châu Âu).

  • Sau vô số cải tiến và một số hiện thân, API ban đầu đã phát triển để trở thành log4j, một gói ghi nhật ký phổ biến cho Java.

  • Gói này được phân phối theo Giấy phép Phần mềm Apache, một giấy phép nguồn mở chính thức được chứng nhận bởi sáng kiến ​​nguồn mở.

  • Bạn có thể tìm thấy phiên bản log4j mới nhất, bao gồm mã nguồn đầy đủ, các tệp lớp và tài liệu tại http://logging.apache.org/log4j/.

Tính năng log4j

  • Nó là chủ đề an toàn.

  • Nó được tối ưu hóa cho tốc độ.

  • Nó dựa trên một hệ thống phân cấp trình ghi nhật ký được đặt tên.

  • Nó hỗ trợ nhiều trình phụ lục đầu ra cho mỗi trình ghi.

  • Nó hỗ trợ quốc tế hóa.

  • Nó không bị giới hạn trong một tập hợp các cơ sở được xác định trước.

  • Hành vi ghi nhật ký có thể được đặt trong thời gian chạy bằng tệp cấu hình.

  • Nó được thiết kế để xử lý các ngoại lệ Java ngay từ đầu.

  • Nó sử dụng nhiều cấp, cụ thể là TẤT CẢ, TRACE, GỠ LỖI, THÔNG TIN, CẢNH BÁO, LỖI và CHẤT BÉO.

  • Có thể dễ dàng thay đổi định dạng của đầu ra nhật ký bằng cách mở rộng lớp Bố cục .

  • Mục tiêu của đầu ra nhật ký cũng như chiến lược viết có thể được thay đổi bằng cách triển khai giao diện Appender.

  • Nó là thất bại. Tuy nhiên, mặc dù chắc chắn nỗ lực để đảm bảo việc phân phối, log4j không đảm bảo rằng mỗi câu lệnh nhật ký sẽ được gửi đến đích của nó.

Ưu và nhược điểm của ghi nhật ký

Ghi nhật ký là một thành phần quan trọng của phát triển phần mềm. Mã ghi nhật ký được viết tốt cung cấp khả năng gỡ lỗi nhanh chóng, bảo trì dễ dàng và lưu trữ có cấu trúc thông tin thời gian chạy của ứng dụng.

Ghi nhật ký cũng có nhược điểm của nó. Nó có thể làm chậm một ứng dụng. Nếu quá dài dòng, nó có thể gây mù cuộn. Để giảm bớt những lo lắng này, log4j được thiết kế để đáng tin cậy, nhanh chóng và có thể mở rộng.

Vì ghi nhật ký hiếm khi là trọng tâm chính của ứng dụng, nên API log4j cố gắng trở nên đơn giản để hiểu và sử dụng.

Gói API log4j được phân phối theo Giấy phép Phần mềm Apache, một giấy phép nguồn mở chính thức được chứng nhận bởi sáng kiến ​​nguồn mở.

Bạn có thể tìm thấy phiên bản log4j mới nhất, bao gồm mã nguồn đầy đủ, tệp lớp và tài liệu tại http://logging.apache.org/log4j/.

Để cài đặt log4j trên hệ thống của bạn, hãy tải xuống apache-log4j-xxxtar.gz từ URL được chỉ định và làm theo các bước dưới đây.

Bước 1

Giải nén và gỡ bỏ tệp đã tải xuống trong thư mục / usr / local / như sau:

$ gunzip apache-log4j-1.2.15.tar.gz
$ tar -xvf apache-log4j-1.2.15.tar
apache-log4j-1.2.15/tests/input/
apache-log4j-1.2.15/tests/input/xml/
apache-log4j-1.2.15/tests/src/
apache-log4j-1.2.15/tests/src/java/
apache-log4j-1.2.15/tests/src/java/org/
.......................................

Trong khi không khai báo, nó sẽ tạo một hệ thống phân cấp thư mục với tên apache-log4j-xxx như sau:

-rw-r--r--  1 root root   3565 2007-08-25 00:09 BUILD-INFO.txt
-rw-r--r--  1 root root   2607 2007-08-25 00:09 build.properties.sample
-rw-r--r--  1 root root  32619 2007-08-25 00:09 build.xml
drwxr-xr-x 14 root root   4096 2010-02-04 14:09 contribs
drwxr-xr-x  5 root root   4096 2010-02-04 14:09 examples
-rw-r--r--  1 root root   2752 2007-08-25 00:09 INSTALL
-rw-r--r--  1 root root   4787 2007-08-25 00:09 KEYS
-rw-r--r--  1 root root  11366 2007-08-25 00:09 LICENSE
-rw-r--r--  1 root root 391834 2007-08-25 00:29 log4j-1.2.15.jar
-rw-r--r--  1 root root    160 2007-08-25 00:09 NOTICE
-rwxr-xr-x  1 root root  10240 2007-08-25 00:27 NTEventLogAppender.dll
-rw-r--r--  1 root root  17780 2007-08-25 00:09 pom.xml
drwxr-xr-x  7 root root   4096 2007-08-25 00:13 site
drwxr-xr-x  8 root root   4096 2010-02-04 14:08 src
drwxr-xr-x  6 root root   4096 2010-02-04 14:09 tests

Bước 2

Bước này là tùy chọn và phụ thuộc vào các tính năng bạn sẽ sử dụng từ khung công tác log4j. Nếu bạn đã cài đặt các gói sau trên máy của mình thì vẫn ổn, nếu không bạn cần cài đặt chúng để log4j hoạt động.

  • JavaMail API:Tính năng ghi nhật ký dựa trên e-mail trong log4j yêu cầu Java Mail API (mail.jar) phải được cài đặt trên máy của bạn từ glassfish.dev .

  • JavaBeans Activation Framework: Java Mail API cũng sẽ yêu cầu rằng Khung kích hoạt JavaBeans (activation.jar) được cài đặt trên máy của bạn từ http://java.sun.com/products/javabeans/jaf/index.jsp.

  • Java Message Service: Các tính năng tương thích với JMS của log4j sẽ yêu cầu cả JMS và Java Đặt tên và Giao diện thư mục JNDI được cài đặt trên máy của bạn từ http://java.sun.com/products/jms.

  • XML Parser:Bạn cần một trình phân tích cú pháp XML tương thích với JAXP để sử dụng log4j. Đảm bảo rằng bạn đã cài đặt Xerces.jar trên máy của mình từhttp://xerces.apache.org/xerces-j/install.html.

Bước 3

Bây giờ bạn cần thiết lập CLASSPATHPATHcác biến một cách thích hợp. Ở đây chúng tôi sẽ đặt nó chỉ cho tệp log4j.xxxjar.

$ pwd
/usr/local/apache-log4j-1.2.15
$ export CLASSPATH= \
      $CLASSPATH:/usr/local/apache-log4j-1.2.15/log4j-1.2.15.jar
$ export PATH=$PATH:/usr/local/apache-log4j-1.2.15/

API log4j tuân theo một kiến ​​trúc phân lớp trong đó mỗi lớp cung cấp các đối tượng khác nhau để thực hiện các tác vụ khác nhau. Kiến trúc phân lớp này làm cho thiết kế linh hoạt và dễ dàng mở rộng trong tương lai.

Có hai loại đối tượng có sẵn với khuôn khổ log4j.

  • Core Objects:Đây là những đối tượng bắt buộc của khuôn khổ. Họ được yêu cầu sử dụng khuôn khổ.

  • Support Objects:Đây là các đối tượng tùy chọn của khung. Chúng hỗ trợ các đối tượng cốt lõi để thực hiện các nhiệm vụ bổ sung nhưng quan trọng.

Đối tượng cốt lõi

Đối tượng cốt lõi bao gồm các loại đối tượng sau:

Đối tượng Logger

Lớp cấp cao nhất là Logger cung cấp đối tượng Logger. Đối tượng Logger chịu trách nhiệm thu thập thông tin ghi nhật ký và chúng được lưu trữ trong hệ thống phân cấp vùng tên.

Đối tượng bố cục

Lớp bố cục cung cấp các đối tượng được sử dụng để định dạng thông tin ghi nhật ký theo các kiểu khác nhau. Nó cung cấp hỗ trợ để bổ sung các đối tượng trước khi xuất bản thông tin ghi nhật ký.

Các đối tượng bố cục đóng một vai trò quan trọng trong việc xuất bản thông tin ghi nhật ký theo cách mà con người có thể đọc được và có thể sử dụng lại.

Đối tượng Appender

Đây là lớp cấp thấp hơn cung cấp các đối tượng Appender. Đối tượng Appender chịu trách nhiệm xuất bản thông tin ghi nhật ký đến các điểm đến ưa thích khác nhau như cơ sở dữ liệu, tệp, bảng điều khiển, UNIX Syslog, v.v.

Sơ đồ ảo sau đây cho thấy các thành phần của khung log4J:

Đối tượng hỗ trợ

Có những đối tượng quan trọng khác trong khung log4j đóng vai trò quan trọng trong khung ghi nhật ký:

Đối tượng cấp độ

Đối tượng Cấp xác định mức độ chi tiết và mức độ ưu tiên của bất kỳ thông tin ghi nhật ký nào. Có bảy cấp độ ghi nhật ký được xác định trong API: TẮT, GỠ LỖI, THÔNG TIN, LỖI, CẢNH BÁO, CHẤT BÉO và TẤT CẢ.

Đối tượng lọc

Đối tượng Bộ lọc được sử dụng để phân tích thông tin ghi nhật ký và đưa ra quyết định tiếp theo về việc thông tin đó có nên được ghi lại hay không.

Một đối tượng Appender có thể có một số đối tượng Bộ lọc được liên kết với chúng. Nếu thông tin ghi nhật ký được chuyển đến một đối tượng Appender cụ thể, tất cả các đối tượng Bộ lọc được liên kết với Appender đó cần phải phê duyệt thông tin ghi nhật ký trước khi nó có thể được xuất bản đến đích đính kèm.

ObjectRenderer

Đối tượng ObjectRenderer chuyên cung cấp biểu diễn chuỗi của các đối tượng khác nhau được chuyển đến khung ghi nhật ký. Đối tượng này được sử dụng bởi các đối tượng Layout để chuẩn bị thông tin ghi nhật ký cuối cùng.

LogManager

Đối tượng LogManager quản lý khung ghi nhật ký. Nó chịu trách nhiệm đọc các thông số cấu hình ban đầu từ tệp cấu hình toàn hệ thống hoặc một lớp cấu hình.

Chương trước đã giải thích các thành phần cốt lõi của log4j. Chương này giải thích cách bạn có thể cấu hình các thành phần cốt lõi bằng cách sử dụng tệp cấu hình. Việc định cấu hình log4j liên quan đến việc ấn định Cấp, xác định Appender và chỉ định các đối tượng Bố cục trong tệp cấu hình.

Tệp log4j.properties là tệp cấu hình log4j giữ các thuộc tính trong các cặp khóa-giá trị. Theo mặc định, LogManager tìm kiếm một tệp có tên là log4j.properties trongCLASSPATH.

  • Cấp của trình ghi gốc được định nghĩa là GỠ LỖI. DEBUG gắn ứng dụng có tên X vào nó.

  • Đặt người khiếu nại có tên X là người khiếu nại hợp lệ.

  • Đặt bố cục cho appender X.

Cú pháp log4j.properties:

Sau đây là cú pháp của tệp log4j.properties cho appender X:

# Define the root logger with appender X
log4j.rootLogger = DEBUG, X

# Set the appender named X to be a File appender
log4j.appender.X=org.apache.log4j.FileAppender

# Define the layout for X appender
log4j.appender.X.layout=org.apache.log4j.PatternLayout
log4j.appender.X.layout.conversionPattern=%m%n

Ví dụ về log4j.properties

Sử dụng cú pháp trên, chúng tôi xác định như sau trong tệp log4j.properties :

  • Cấp của trình ghi gốc được xác định là GỠ GỠ, Trình phụ trợ Gỡ lỗi được đặt tên là FILE cho nó.

  • FILE appender được định nghĩa là org.apache.log4j.FileAppender . Nó ghi vào một tệp có tên "log.out" nằm tronglog danh mục.

  • Mẫu bố cục được xác định là % m% n , có nghĩa là thông báo ghi nhật ký đã in sẽ được theo sau bởi một ký tự dòng mới.

# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

Điều quan trọng cần lưu ý là log4j hỗ trợ thay thế biến kiểu UNIX chẳng hạn như $ {variableName}.

Mức độ gỡ lỗi

Chúng tôi đã sử dụng DEBUG với cả phần phụ. Tất cả các tùy chọn có thể là:

  • TRACE
  • DEBUG
  • INFO
  • WARN
  • ERROR
  • FATAL
  • ALL

Các cấp độ này sẽ được giải thích trong Các cấp độ ghi nhật ký log4j .

Người bổ sung

Apache log4j cung cấp các đối tượng Appender chịu trách nhiệm chính trong việc in thông báo ghi nhật ký đến các điểm đến khác nhau như bảng điều khiển, tệp, ổ cắm, nhật ký sự kiện NT, v.v.

Mỗi đối tượng Appender có các thuộc tính khác nhau được liên kết với nó và các thuộc tính này cho biết hành vi của đối tượng đó.

Bất động sản Sự miêu tả
bố trí Appender sử dụng các đối tượng Bố cục và mẫu chuyển đổi được liên kết với chúng để định dạng thông tin ghi nhật ký.
Mục tiêu Mục tiêu có thể là một bảng điều khiển, một tệp hoặc một mục khác tùy thuộc vào appender.
cấp độ Cấp được yêu cầu để kiểm soát việc lọc các thông báo nhật ký.
ngưỡng cửa Appender có thể có mức ngưỡng được liên kết với nó độc lập với mức của trình ghi. Appender bỏ qua bất kỳ thông báo ghi nhật ký nào có mức thấp hơn mức ngưỡng.
bộ lọc Các đối tượng Bộ lọc có thể phân tích thông tin ghi nhật ký vượt ra ngoài so khớp cấp và quyết định xem các yêu cầu ghi nhật ký nên được xử lý bởi một Appender cụ thể hay bị bỏ qua.

Chúng ta có thể thêm một đối tượng Appender vào Logger bằng cách thêm cài đặt sau vào tệp cấu hình với phương pháp sau:

log4j.logger.[logger-name]=level, appender1,appender..n

Bạn có thể viết cấu hình tương tự ở định dạng XML như sau:

<logger name="com.apress.logging.log4j" additivity="false">
   <appender-ref ref="appender1"/>
   <appender-ref ref="appender2"/>
</logger>

Nếu bạn muốn thêm đối tượng Appender bên trong chương trình của mình thì bạn có thể sử dụng phương pháp sau:

public void addAppender(Appender appender);

Phương thức addAppender () thêm một Appender vào đối tượng Logger. Như cấu hình ví dụ minh họa, có thể thêm nhiều đối tượng Appender vào một trình ghi nhật ký trong một danh sách được phân tách bằng dấu phẩy, mỗi thông tin ghi nhật ký in đến các đích riêng biệt.

Chúng tôi chỉ sử dụng một ứng dụng FileAppender trong ví dụ ở trên. Tất cả các tùy chọn appender có thể có là:

  • AppenderSkeleton
  • AsyncAppender
  • ConsoleAppender
  • DailyRollingFileAppender
  • ExternallyRolledFileAppender
  • FileAppender
  • JDBCAppender
  • JMSAppender
  • LF5Appender
  • NTEventLogAppender
  • NullAppender
  • RollingFileAppender
  • SMTPAppender
  • SocketAppender
  • SocketHubAppender
  • SyslogAppender
  • TelnetAppender
  • WriterAppender

Chúng tôi sẽ đề cập đến FileAppender trong Đăng nhập vào Tệp và JDBC Appender sẽ được đề cập trong Đăng nhập vào Cơ sở dữ liệu .

Bố trí

Chúng tôi đã sử dụng PatternLayout với appender của mình. Tất cả các tùy chọn có thể là:

  • DateLayout
  • HTMLLayout
  • PatternLayout
  • SimpleLayout
  • XMLLayout

Sử dụng HTMLLayout và XMLLayout, bạn cũng có thể tạo đăng nhập bằng HTML và ở định dạng XML.

Định dạng bố cục

Bạn sẽ học cách định dạng thông báo nhật ký trong chương: Định dạng nhật ký .

Chúng ta đã thấy cách tạo tệp cấu hình. Chương này mô tả cách tạo thông báo gỡ lỗi và ghi chúng vào một tệp văn bản đơn giản.

Sau đây là một tệp cấu hình đơn giản được tạo cho ví dụ của chúng tôi. Hãy để chúng tôi sửa đổi nó một lần nữa:

  • Cấp của trình ghi gốc được xác định là GỠ LỖI và đính kèm ứng dụng có tên FILE vào đó.

  • FILE appender được định nghĩa là org.apache.log4j.FileAppender và ghi vào một tệp có tên "log.out" nằm trong log danh mục.

  • Mẫu bố cục được xác định là% m% n, có nghĩa là thông báo ghi nhật ký đã in sẽ được theo sau bởi một ký tự dòng mới.

Nội dung của tệp log4j.properties như sau:

# Define the root logger with appender file
log = /usr/home/log4j
log4j.rootLogger = DEBUG, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

Sử dụng log4j trong Chương trình Java

Lớp Java sau đây là một ví dụ rất đơn giản khởi tạo và sau đó sử dụng thư viện ghi nhật ký Log4J cho các ứng dụng Java.

import org.apache.log4j.Logger;

import java.io.*;
import java.sql.SQLException;
import java.util.*;

public class log4jExample{
   /* Get actual class name to be printed on */
   static Logger log = Logger.getLogger(log4jExample.class.getName());
   
   public static void main(String[] args)throws IOException,SQLException{
      log.debug("Hello this is a debug message");
      log.info("Hello this is an info message");
   }
}

Biên dịch và Thực thi

Dưới đây là các bước để biên dịch và chạy chương trình nói trên. Đảm bảo rằng bạn đã thiết lậpPATHCLASSPATH thích hợp trước khi tiến hành biên dịch và thực hiện.

Tất cả các thư viện sẽ có sẵn trong CLASSPATHvà tệp log4j.properties của bạn sẽ có sẵn trong PATH. Làm theo các bước dưới đây:

  • Tạo log4j.properties như hình trên.

  • Tạo log4jExample.java như được hiển thị ở trên và biên dịch nó.

  • Thực thi nhị phân log4jExample để chạy chương trình.

Bạn sẽ nhận được kết quả sau trong tệp /usr/home/log4j/log.out:

Hello this is a debug message
Hello this is an info message

Lớp Logger cung cấp nhiều phương thức khác nhau để xử lý các hoạt động ghi nhật ký. Lớp Logger không cho phép chúng ta khởi tạo một thể hiện Logger mới nhưng nó cung cấp hai phương thức tĩnh để lấy một đối tượng Logger:

  • public static Logger getRootLogger();
  • public static Logger getLogger(String name);

Phương thức đầu tiên trong hai phương thức trả về trình ghi gốc của phiên bản ứng dụng và nó không có tên.

Bất kỳ cá thể đối tượng Logger có tên nào khác đều có được thông qua phương thức thứ hai bằng cách chuyển tên của trình ghi nhật ký. Tên của trình ghi nhật ký có thể là bất kỳ chuỗi nào bạn có thể chuyển, thường là một lớp hoặc một tên gói như chúng ta đã sử dụng trong chương trước và nó được đề cập bên dưới:

static Logger log = Logger.getLogger(log4jExample.class.getName());

Phương pháp ghi nhật ký

Khi chúng tôi có được một phiên bản của trình ghi nhật ký được đặt tên, chúng tôi có thể sử dụng một số phương pháp của trình ghi nhật ký để ghi lại các thông báo. Lớp Logger có các phương thức sau để in thông tin ghi nhật ký.

Sr.No Phương pháp và Mô tả
1 public void debug(Object message)

Nó in các tin nhắn với mức Level.DEBUG.

2 public void error(Object message)

Nó in các thông báo với mức Level.ERROR.

3 public void fatal(Object message);

Nó in các thông báo với mức độ Level.FATAL.

4 public void info(Object message);

Nó in ra các thông báo với mức Level.INFO.

5 public void warn(Object message);

Nó in ra các tin nhắn với mức Level.WARN.

6 public void trace(Object message);

Nó in các tin nhắn với mức độ Level.TRACE.

Tất cả các cấp được định nghĩa trong lớp org.apache.log4j.Level và bất kỳ phương thức nào được đề cập ở trên có thể được gọi như sau:

import org.apache.log4j.Logger;

public class LogClass {
   private static org.apache.log4j.Logger log = Logger.getLogger(LogClass.class);
   
   public static void main(String[] args) {
      log.trace("Trace Message!");
      log.debug("Debug Message!");
      log.info("Info Message!");
      log.warn("Warn Message!");
      log.error("Error Message!");
      log.fatal("Fatal Message!");
   }
}

Khi bạn biên dịch và chạy chương trình LogClass, nó sẽ tạo ra kết quả sau:

Debug Message!
Info Message!
Warn Message!
Error Message!
Fatal Message!

Tất cả các thông báo gỡ lỗi sẽ có ý nghĩa hơn khi chúng được sử dụng kết hợp với các cấp. Chúng tôi sẽ trình bày các cấp độ trong chương tiếp theo và sau đó, bạn sẽ hiểu rõ về cách sử dụng các phương pháp này kết hợp với các cấp độ gỡ lỗi khác nhau.

Lớp org.apache.log4j.Level cung cấp các mức sau. Bạn cũng có thể xác định các cấp độ tùy chỉnh của mình bằng cách phân loại phụ lớp Cấp độ.

Cấp độ Sự miêu tả
TẤT CẢ Tất cả các cấp bao gồm các cấp tùy chỉnh.
NỢ Chỉ định các sự kiện thông tin chi tiết hữu ích nhất để gỡ lỗi ứng dụng.
THÔNG TIN Chỉ định các thông báo cung cấp thông tin làm nổi bật tiến trình của ứng dụng ở cấp độ chi tiết.
CẢNH BÁO Chỉ định các tình huống có thể gây hại.
LỖI Chỉ định các sự kiện lỗi có thể vẫn cho phép ứng dụng tiếp tục chạy.
CHẤT BÉO Chỉ định các sự kiện lỗi rất nghiêm trọng có thể dẫn đến việc ứng dụng bị hủy bỏ.
TẮT Xếp hạng cao nhất có thể và nhằm mục đích tắt ghi nhật ký.
TRACE Chỉ định các sự kiện thông tin chi tiết hơn DEBUG.

Mức độ hoạt động như thế nào?

Yêu cầu nhật ký cấp độ p trong một máy ghi có cấp độ qđược bật nếu p> = q. Quy tắc này là trọng tâm của log4j. Nó giả định rằng các cấp được sắp xếp. Đối với các cấp độ tiêu chuẩn, chúng ta có TẤT CẢ <GỢI Ý <THÔNG TIN <CẢNH BÁO <LỖI <MỠ <TẮT.

Ví dụ sau đây cho thấy cách chúng tôi có thể lọc tất cả các thông báo GỠ LỖI và THÔNG TIN. Chương trình này sử dụng phương thức ghi nhật ký setLevel (Level.X) để đặt mức ghi nhật ký mong muốn:

Ví dụ này sẽ in tất cả các thông báo ngoại trừ Gỡ lỗi và Thông tin:

import org.apache.log4j.*;

public class LogClass {
   private static org.apache.log4j.Logger log = Logger.getLogger(LogClass.class);
   
   public static void main(String[] args) {
      log.setLevel(Level.WARN);

      log.trace("Trace Message!");
      log.debug("Debug Message!");
      log.info("Info Message!");
      log.warn("Warn Message!");
      log.error("Error Message!");
      log.fatal("Fatal Message!");
   }
}

Khi bạn biên dịch và chạy chương trình LogClass, nó sẽ tạo ra kết quả sau:

Warn Message!
Error Message!
Fatal Message!

Đặt cấp độ bằng Tệp cấu hình

log4j cung cấp cho bạn cài đặt cấp độ dựa trên tệp cấu hình giúp bạn không cần thay đổi mã nguồn khi muốn thay đổi cấp độ gỡ lỗi.

Sau đây là một tệp cấu hình ví dụ sẽ thực hiện tác vụ tương tự như chúng ta đã thực hiện bằng phương thức log.setLevel (Level.WARN) trong ví dụ trên.

# Define the root logger with appender file
log = /usr/home/log4j
log4j.rootLogger = WARN, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

Bây giờ chúng ta hãy sử dụng chương trình sau:

import org.apache.log4j.*;

public class LogClass {
   private static org.apache.log4j.Logger log = Logger.getLogger(LogClass.class);
   public static void main(String[] args) {
      log.trace("Trace Message!");
      log.debug("Debug Message!");
      log.info("Info Message!");
      log.warn("Warn Message!");
      log.error("Error Message!");
      log.fatal("Fatal Message!");
   }
}

Bây giờ biên dịch và chạy chương trình trên và bạn sẽ nhận được kết quả sau trong tệp /usr/home/log4j/log.out:

Warn Message!
Error Message!
Fatal Message!

Apache log4j cung cấp các đối tượng Bố cục khác nhau, mỗi đối tượng có thể định dạng dữ liệu ghi nhật ký theo nhiều bố cục khác nhau. Cũng có thể tạo đối tượng Bố cục định dạng dữ liệu ghi nhật ký theo cách dành riêng cho ứng dụng.

Tất cả các đối tượng Layout đều nhận một đối tượng LoggingEvent từ các đối tượng Appender. Các đối tượng Bố trí sau đó truy xuất đối số thông báo từ LoggingEvent và áp dụng ObjectRenderer thích hợp để lấy biểu diễn chuỗi của thông báo.

Các loại bố cục

Lớp cấp cao nhất trong hệ thống phân cấp là lớp trừu tượng org.apache.log4j.Layout. Đây là lớp cơ sở cho tất cả các lớp Bố cục khác trong API log4j.

Lớp Layout được định nghĩa là trừu tượng trong một ứng dụng, chúng tôi không bao giờ sử dụng trực tiếp lớp này; thay vào đó, chúng tôi làm việc với các lớp con của nó như sau:

  • DateLayout

  • HTMLLayout

  • PatternLayout.

  • SimpleLayout

  • XMLLayout

Các phương pháp bố cục

Lớp này cung cấp một triển khai khung của tất cả các hoạt động phổ biến trên tất cả các đối tượng Layout khác và khai báo hai phương thức trừu tượng.

Sr.No. Phương pháp & Mô tả
1 public abstract boolean ignoresThrowable()

Nó cho biết liệu thông tin ghi nhật ký có xử lý bất kỳ đối tượng java.lang.Throwable nào được chuyển tới nó như một phần của sự kiện ghi nhật ký hay không. Nếu đối tượng Layout xử lý đối tượng Throwable, thì đối tượng Layout sẽ không bỏ qua nó và trả về false.

2 public abstract String format(LoggingEvent event)

Các lớp con của bố cục riêng lẻ thực hiện phương pháp này để định dạng cụ thể cho bố cục.

Ngoài các phương thức trừu tượng này, lớp Layout cung cấp triển khai cụ thể cho các phương thức được liệt kê bên dưới:

Sr.No. Phương pháp & Mô tả
1 public String getContentType()

Nó trả về kiểu nội dung được sử dụng bởi các đối tượng Bố cục. Lớp cơ sở trả về văn bản / thuần túy làm kiểu nội dung mặc định.

2 public String getFooter()

Nó chỉ định thông tin chân trang của thông báo ghi nhật ký.

3 public String getHeader()

Nó chỉ định thông tin tiêu đề của thông báo ghi nhật ký.

Mỗi lớp con có thể trả về thông tin dành riêng cho lớp bằng cách ghi đè việc triển khai cụ thể của các phương thức này.

Để ghi thông tin đăng nhập của bạn vào một tệp, bạn sẽ phải sử dụng org.apache.log4j.FileAppender .

Cấu hình FileAppender

FileAppender có các tham số có thể định cấu hình sau:

Bất động sản Sự miêu tả
ngay lập tức Cờ này theo mặc định được đặt thành true, có nghĩa là luồng đầu ra tới tệp được xóa với mỗi thao tác nối thêm.
mã hóa Có thể sử dụng bất kỳ mã hóa ký tự nào. Theo mặc định, nó là lược đồ mã hóa dành riêng cho nền tảng.
ngưỡng cửa Mức ngưỡng cho người tìm kiếm này.
Tên tệp Tên của tệp nhật ký.
fileAppend Điều này theo mặc định được đặt thành true, có nghĩa là thông tin ghi nhật ký được nối vào cuối cùng một tệp.
đệmIO Cờ này cho biết liệu chúng ta có cần bật tính năng ghi trong bộ đệm hay không. Theo mặc định, nó được đặt thành false.
bufferSize Nếu I / O có bộ đệm được bật, nó cho biết kích thước bộ đệm. Theo mặc định, nó được đặt thành 8kb.

Sau đây là tệp cấu hình mẫu log4j.properties cho FileAppender.

# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender

# Set the name of the file
log4j.appender.FILE.File=${log}/log.out

# Set the immediate flush to true (default)
log4j.appender.FILE.ImmediateFlush=true

# Set the threshold to debug mode
log4j.appender.FILE.Threshold=debug

# Set the append to false, overwrite
log4j.appender.FILE.Append=false

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

Nếu bạn muốn có tệp cấu hình XML tương đương với tệp log4j.properties ở trên , thì đây là nội dung:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>

<appender name="FILE" class="org.apache.log4j.FileAppender">
   <param name="file" value="${log}/log.out"/>
   <param name="immediateFlush" value="true"/>
   <param name="threshold" value="debug"/>
   <param name="append" value="false"/>
   <layout class="org.apache.log4j.PatternLayout">
      <param name="conversionPattern" value="%m%n"/>
   </layout>
</appender>

<logger name="log4j.rootLogger" additivity="false">
   <level value="DEBUG"/>
   <appender-ref ref="FILE"/>
</logger>

</log4j:configuration>

Bạn có thể thử log4j - Chương trình mẫu với cấu hình trên.

Đăng nhập nhiều tệp

Bạn có thể muốn viết thông báo nhật ký của mình thành nhiều tệp vì những lý do nhất định, chẳng hạn như nếu kích thước tệp đạt đến một ngưỡng nhất định.

Để ghi thông tin đăng nhập của bạn vào nhiều tệp, bạn sẽ phải sử dụng lớp org.apache.log4j.RollingFileAppender mở rộng lớp FileAppender và kế thừa tất cả các thuộc tính của nó.

Chúng tôi có các tham số có thể định cấu hình sau đây ngoài các tham số được đề cập ở trên cho FileAppender:

Bất động sản Sự miêu tả
Kích thước tệp tối đa Đây là kích thước quan trọng của tệp mà trên đó tệp sẽ được cuộn. Giá trị mặc định là 10 MB.
maxBackupIndex Thuộc tính này biểu thị số lượng tệp sao lưu sẽ được tạo. Giá trị mặc định là 1.

Sau đây là tệp cấu hình mẫu log4j.properties cho RollingFileAppender.

# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.RollingFileAppender

# Set the name of the file
log4j.appender.FILE.File=${log}/log.out

# Set the immediate flush to true (default)
log4j.appender.FILE.ImmediateFlush=true

# Set the threshold to debug mode
log4j.appender.FILE.Threshold=debug

# Set the append to false, should not overwrite
log4j.appender.FILE.Append=true

# Set the maximum file size before rollover
log4j.appender.FILE.MaxFileSize=5MB

# Set the the backup index
log4j.appender.FILE.MaxBackupIndex=2

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

Nếu bạn muốn có tệp cấu hình XML, bạn có thể tạo tệp giống như đã đề cập trong phần ban đầu và chỉ thêm các tham số bổ sung liên quan đến RollingFileAppender .

Cấu hình ví dụ này chứng minh rằng kích thước tối đa cho phép của mỗi tệp nhật ký là 5 MB. Khi vượt quá kích thước tối đa, một tệp nhật ký mới sẽ được tạo. Vì maxBackupIndex được định nghĩa là 2 nên khi tệp nhật ký thứ hai đạt đến kích thước tối đa, tệp nhật ký đầu tiên sẽ bị xóa và sau đó, tất cả thông tin ghi nhật ký sẽ được quay trở lại tệp nhật ký đầu tiên.

Bạn có thể thử log4j - Chương trình mẫu với cấu hình trên.

Tạo tệp nhật ký hàng ngày

Có thể có yêu cầu tạo tệp nhật ký của bạn hàng ngày để giữ một bản ghi rõ ràng về thông tin ghi nhật ký của bạn.

Để ghi thông tin đăng nhập của bạn vào các tệp hàng ngày, bạn sẽ phải sử dụng lớp org.apache.log4j.DailyRollingFileAppender mở rộng lớp FileAppender và kế thừa tất cả các thuộc tính của nó.

Chỉ có một tham số quan trọng có thể định cấu hình ngoài những tham số được đề cập ở trên cho FileAppender:

Bất động sản Sự miêu tả
DatePattern Điều này cho biết thời điểm cuộn qua tệp và quy ước đặt tên sẽ được tuân theo. Theo mặc định, cuộn qua được thực hiện vào lúc nửa đêm mỗi ngày.

DatePattern kiểm soát lịch trình cuộn qua bằng một trong các mẫu sau:

DatePattern Sự miêu tả
'.' yyyy-MM Lăn qua vào cuối mỗi tháng và đầu tháng tiếp theo.
'.' yyyy-MM-dd Lăn qua nửa đêm mỗi ngày. Đây là giá trị mặc định.
'.' yyyy-MM-dd-a Lăn qua vào giữa trưa và nửa đêm mỗi ngày.
'.' yyyy-MM-dd-HH Lăn qua đầu mỗi giờ.
'.' yyyy-MM-dd-HH-mm Lăn qua mỗi phút.
'.' yyyy-ww Lăn qua vào ngày đầu tiên của mỗi tuần tùy thuộc vào ngôn ngữ.

Sau đây là tệp cấu hình mẫu log4j.properties để tạo tệp nhật ký di chuyển vào giữa trưa và nửa đêm mỗi ngày.

# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender

# Set the name of the file
log4j.appender.FILE.File=${log}/log.out

# Set the immediate flush to true (default)
log4j.appender.FILE.ImmediateFlush=true

# Set the threshold to debug mode
log4j.appender.FILE.Threshold=debug

# Set the append to false, should not overwrite
log4j.appender.FILE.Append=true

# Set the DatePattern
log4j.appender.FILE.DatePattern='.' yyyy-MM-dd-a

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

Nếu bạn muốn có tệp cấu hình XML, bạn có thể tạo tệp giống như đã đề cập trong phần ban đầu và chỉ thêm các tham số bổ sung liên quan đến DailyRollingFileAppender .

Bạn có thể thử log4j - Chương trình mẫu với cấu hình trên.

API log4j cung cấp đối tượng org.apache.log4j.jdbc.JDBCAppender , có thể đưa thông tin ghi nhật ký vào cơ sở dữ liệu được chỉ định.

Cấu hình JDBCAppender

Bất động sản Sự miêu tả
bufferSize Đặt kích thước bộ đệm. Kích thước mặc định là 1.
người lái xe Đặt lớp trình điều khiển thành chuỗi được chỉ định. Nếu không có lớp trình điều khiển nào được chỉ định, nó sẽ mặc định là sun.jdbc.odbc.JdbcOdbcDriver.
bố trí Đặt bố cục sẽ được sử dụng. Bố cục mặc định là org.apache.log4j.PatternLayout.
mật khẩu Đặt mật khẩu cơ sở dữ liệu.
sql Chỉ định câu lệnh SQL được thực thi mỗi khi sự kiện ghi nhật ký xảy ra. Đây có thể là CHÈN, CẬP NHẬT hoặc XÓA.
URL Đặt URL JDBC.
người dùng Đặt tên người dùng cơ sở dữ liệu.

Cấu hình bảng nhật ký

Trước khi bắt đầu sử dụng ghi nhật ký dựa trên JDBC, bạn nên tạo một bảng để duy trì tất cả thông tin nhật ký. Sau đây là câu lệnh SQL để tạo bảng LOGS:

CREATE TABLE LOGS
   (USER_ID VARCHAR(20) NOT NULL,
    DATED   DATE NOT NULL,
    LOGGER  VARCHAR(50) NOT NULL,
    LEVEL   VARCHAR(10) NOT NULL,
    MESSAGE VARCHAR(1000) NOT NULL
   );

Tệp cấu hình mẫu

Sau đây là tệp cấu hình mẫu log4j.properties cho JDBCAppender sẽ được sử dụng để ghi thông báo vào bảng LOGS.

# Define the root logger with appender file
log4j.rootLogger = DEBUG, DB

# Define the DB appender
log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender

# Set JDBC URL
log4j.appender.DB.URL=jdbc:mysql://localhost/DBNAME

# Set Database Driver
log4j.appender.DB.driver=com.mysql.jdbc.Driver

# Set database user name and password
log4j.appender.DB.user=user_name
log4j.appender.DB.password=password

# Set the SQL statement to be executed.
log4j.appender.DB.sql=INSERT INTO LOGS VALUES('%x','%d','%C','%p','%m')

# Define the layout for file appender
log4j.appender.DB.layout=org.apache.log4j.PatternLayout

Đối với cơ sở dữ liệu MySQL, bạn sẽ phải sử dụng DBNAME, ID người dùng và mật khẩu thực, nơi bạn đã tạo bảng LOGS. Câu lệnh SQL là thực thi một câu lệnh INSERT với tên bảng LOGS và các giá trị được nhập vào bảng.

JDBCAppender không cần bố cục được định nghĩa rõ ràng. Thay vào đó, câu lệnh SQL được chuyển tới nó sử dụng một PatternLayout.

Nếu bạn muốn có tệp cấu hình XML tương đương với tệp log4j.properties ở trên , thì đây là nội dung:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>

<appender name="DB" class="org.apache.log4j.jdbc.JDBCAppender">
   <param name="url" value="jdbc:mysql://localhost/DBNAME"/>
   <param name="driver" value="com.mysql.jdbc.Driver"/>
   <param name="user" value="user_id"/>
   <param name="password" value="password"/>
   <param name="sql" value="INSERT INTO LOGS VALUES('%x','%d','%C','%p','%m')"/>
   <layout class="org.apache.log4j.PatternLayout">
   </layout>
</appender>

<logger name="log4j.rootLogger" additivity="false">
   <level value="DEBUG"/>
   <appender-ref ref="DB"/>
</logger>

</log4j:configuration>

Chương trình mẫu

Lớp Java sau đây là một ví dụ rất đơn giản khởi tạo và sau đó sử dụng thư viện ghi nhật ký Log4J cho các ứng dụng Java.

import org.apache.log4j.Logger;
import java.sql.*;
import java.io.*;
import java.util.*;

public class log4jExample{
   /* Get actual class name to be printed on */
   static Logger log = Logger.getLogger(log4jExample.class.getName());
   
   public static void main(String[] args)throws IOException,SQLException{
      log.debug("Debug");
      log.info("Info");
   }
}

Biên dịch và Thực thi

Dưới đây là các bước để biên dịch và chạy chương trình nói trên. Đảm bảo rằng bạn đã thiết lậpPATHCLASSPATH một cách thích hợp trước khi tiến hành biên dịch và thực thi.

Tất cả các thư viện sẽ có sẵn trong CLASSPATHvà tệp log4j.properties của bạn sẽ có sẵn trong PATH. Làm theo các bước đã cho:

  • Tạo log4j.properties như hình trên.
  • Tạo log4jExample.java như được hiển thị ở trên và biên dịch nó.
  • Thực thi nhị phân log4jExample để chạy chương trình.

Bây giờ, hãy kiểm tra bảng LOGS của bạn bên trong cơ sở dữ liệu DBNAME và bạn sẽ tìm thấy các mục sau:

mysql >  select * from LOGS;
+---------+------------+--------------+-------+---------+
| USER_ID | DATED      | LOGGER       | LEVEL | MESSAGE |
+---------+------------+--------------+-------+---------+
|         | 2010-05-13 | log4jExample | DEBUG | Debug   |
|         | 2010-05-13 | log4jExample | INFO  | Info    |
+---------+------------+--------------+-------+---------+
2 rows in set (0.00 sec)

Note:Ở đây x được sử dụng để xuất ra Ngữ cảnh chẩn đoán lồng nhau (NDC) được liên kết với chuỗi đã tạo ra sự kiện ghi nhật ký. Chúng tôi sử dụng NDC để phân biệt máy khách trong các thành phần phía máy chủ xử lý nhiều máy khách. Kiểm tra Sổ tay hướng dẫn sử dụng Log4J để biết thêm thông tin về điều này.