Log4j

Apache Log4j là một trình ghi nhật ký trên nền tảng Java. Ban đầu, Log4j được phát triển bởi Ceki Gülcü và hiện nay là một dự án của Quỹ Phần mềm Apache. Log4j là một trong một vài khung ghi nhật ký Java.
Gülcü bắt đầu các dự án SLF4J và Logback, với ý định tạo tiền đề cho Log4j.
Nhóm Apache Log4j sau khi tạo ra Log4j 1 đã tiếp tục với phiên bản số 2. Log4j 2 được phát triển tập trung vào các lỗi mà phiên bản Log4j 1.2, 1.3, java.util.logging và Logback chưa giải quyết được, tiếp cận các vấn đề xuất hiện trong các khung phần mềm này. Thêm vào đó, Log4j 2 hỗ trợ một kiến trúc trình cắm làm cho khả năng mở rộng của nó lớn hơn nhiều so với phiên bản trước. Log4j 2 không hỗ trợ khả năng tương thích bản cũ với các phiên bản 1.x, mặc dù nếu muốn, người dùng có thể sử dụng kèm một trình chuyển tiếp.
Ngày 5 tháng 8 năm 2015, Ban Quản lý Dự án Dịch vụ Trình nhật ký Apache (Apache Logging Services Project Management Committee) ra thông báo kết thúc vòng đời của Log4j 1, đồng thời khuyến nghị người dùng Log4j 1 nâng cấp lên phiên bản Apache Log4j 2.
Apache Log4j 2.
Apache Log4j 2 là phiên bản nối tiếp của Log4j 1, được phát hành như một bản GA vào tháng 7 năm 2014. Bộ khung này được viết lại từ đầu, lấy cảm hứng từ nhiều giải pháp ghi nhật ký trước đó, trong đó có Log4j 1 và java.util.logging. Những khác biệt chính so với Log4j 1 là:
Một trong những tính năng nổi bật nhất của Log4j 2 là khả năng thực hiện ghi nhật ký bất đồng bộ ("Asynchronous Logging"). Log4j 2 sử dụng LMAX Disruptor. Sử dụng thư viện giúp hạn chế khóa kernel và tăng tốc độ khi nhật ký lên gấp 12 lần. Ví dụ, trong cùng điều kiện môi trường máy Log4j 2 có thể ghi hơn 18.000.000 thông điệp mỗi giây, trong khi các bộ khung khác như Logback và Log4j 1 chỉ có thể ghi dưới 2.000.000 thông điệp mỗi giây.
Cấp độ ghi trong Log4j.
Bảng sau liệt kê các cấp độ ghi đã được định nghĩa sẵn trong Log4j, theo thứ tự giảm dần về mức nghiêm trọng. Cột bên trái liệt kê các định mức ghi trong khi cột bên phải tóm tắt thông tin về mức độ ghi đó.
Tùy chỉnh cấp độ ghi.
Log4j 2 cho phép người phát triển phần mềm tự định nghĩa cấp độ ghi nhật ký. Một trình sinh mã (source code generator tool) được cung cấp để giúp tạo ra Bộ ghi (Logger) hỗ trợ nhận biết cấp độ tùy chỉnh của người dùng so với các mức định sẵn. Cấp độ tùy chỉnh này có thể dùng để bổ sung hoặc thay thế các cấp độ sẵn có.
Cấu hình Log4j.
Log4j có thể được cấu hình thông qua file cấu hình hoặc mã Java. File cấu hình có thể được viết dưới định dạng XML, JSON, YAML, hoặc file properties. File cấu hình này có 3 thàn phần chính: Bộ ghi (Logger), Bộ nối (Appender) và Bản mẫu (Layout). Cấu hình nhật ký bằng file có một lợi thế là việc ghi có thể tiến hành hoặc tạm ngưng mà không cần phải sửa đổi mã nguồn ứng dụng. Ứng dụng có thể cho phép chạy mà không cần phải ghi nhật ký đến khi xuất hiện lỗi, ví dụ như thế, và khi đó, việc ghi nhật ký lại được kích hoạt lại đơn giản bằng cách sửa đổi file cấu hình.
Bộ ghi (Loggers) được dùng để chỉ ra tên của nơi xuất các thông điệp (message) mà quá trình ghi nhật ký tạo ra. Đây là tên mà ứng dụng Java nhận biết được. Mỗi Bộ ghi được cấu hình riêng biệt ở mức ghi (FATAL, ERROR, v.v.) mà nó đang thực hiện. Ở các phiên bản cũ của Log4j, nó được đề cập đến là thư mục (category) và mức ưu tiên (priority), nhưng nay nó được gọi tương ứng là bộ ghi và cấp độ. Mỗi Bộ ghi có thể gởi thông điệp ghi (log message) tới nhiều Bộ nối (Appenders).
Sản phẩm thật sự được tạo là bởi từ Bộ nối (Appenders). Log4j cung cấp nhiều Bộ nối mà tên của chúng thể hiện phần nào tính năng, như FileAppender, RollingFileAppender, ConsoleAppender, SocketAppender, SyslogAppender, và SMTPAppender. Logj 2 thêm các Bộ nối mới nhằm hỗ trợ ghi nhật ký vào Apache Flume, Java Persistence API, Apache Kafka, các hệ cơ sở dữ liệu NoSQL, tập tin ánh xạ dữ liệu (Memory-mapped file), tập tin truy cập ngẫu nhiên (Random Access file) và điểm cuối ZeroMQ. Nhiều Bộ nối có thể sử dụng cho một Bộ ghi, như thế, một thông tin nhật ký có thẻ được ghi ra ở nhiều nơi khác nhau; ví dụ như trường hợp ghi thông tin nhật ký ra một tập tin cục bộ và tới một trình thu nhận thông qua socket trên một máy tính khác.
Bộ nối sử dụng Bản mẫu để định dạng các mẫu nhật ký. PatternLayout là bản mẫu thông dụng để ghi nhật ký, bản mẫu này hỗ trợ ghi mỗi-lần-một-dòng, sử dụng chuỗi pattern tương tự như cách sử dụng hàm printf trong ngôn ngữ C / C++. Các Bản mẫu HTMLLayout và XMLLayout được sử dụng khi định dạng nhật ký với các cấu trúc HTML hoặc XML thuận tiện hơn. Log4j 2 cũng thêm các Bản mẫu cho định dạng CSV, Graylog Extended Log Format (GELF), JSON, YAML và RFC-5424.
Với Log4j 2, Bộ lọc (Filters) được sử dụng để cấu hình để giúp việc kiểm soát chặt chẽ hơn mẫu nhật ký nào nên được xử lý bởi Bộ ghi nào và Bộ nối nào. Bên cạnh đó, ngoài việc lọc theo cấp độ và sử dụng biểu thức chính quy, Log4j 2 bổ sung các tính năng lọc theo tần suất mẫu nhật ký xuất hiện, lọc theo thời gian, lọc theo các đặc tính của sự kiện khi nhật ký khác như Markers hoặc Thread Context Map và lọc sử dụng ngôn ngữ kịch bản JSR 223.
To debug a misbehaving configuration:
To find out where a log4j2.xml configuration file was loaded from inspect codice_4.
Có một dạng cấu hình cho Log4j được ngầm hiểu là "không được cấu hình" (unconfigured) hoặc "mặc định" (default), khi mà Log4j được sử dụng trong ứng dụng nền tảng Java nhưng lại thiếu cấu hình cho nó. Khi đó, stdout hiển thị cảnh báo rằng chương trình chưa được cấu hình, và đường dẫn tới URL của web site Log4j nơi thông tin chi tiết và cảnh báo được tìm thấy. Ngoài việc hiển thị cảnh báo này, ứng dụng sử dụng Log4j thiếu cấu hình chỉ ghi lại các mẫu nhật ký ở cấp độ ERROR hoặc FATAL vào stdout.
Ví dụ cho Log4j 2.
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;Configuration status="trace" monitorInterval="60"&gt;
 &lt;Properties&gt;
 &lt;Property name="filename"&gt;target/test.log&lt;/Property&gt;
 &lt;/Properties&gt;
 &lt;Appenders&gt;
 &lt;Console name="STDOUT"&gt;
 &lt;PatternLayout pattern="%d %p %c{1.} [%t] %m%n"/&gt;
 &lt;/Console&gt;
 &lt;File name="file" fileName="${filename}"&gt;
 &lt;PatternLayout&gt;
 &lt;pattern&gt;%d %p %c{1.} [%t] %m%n&lt;/pattern&gt;
 &lt;/PatternLayout&gt;
 &lt;/File&gt;
 &lt;/Appenders&gt;
 &lt;Loggers&gt; 
 Các bộ ghi có không gian tên là 'org.springframework' chỉ ghi các mẫu nhật ký ở cấp độ "INFO" hoặc cao hơn;
 nếu bạn gọi Bộ ghi sử dụng tên lớp (ví dụ: Logger.getLogger(AClass.class))
 và nếu AClass thuộc về gói org.springframework, nó cũng thuộc vào trường hợp này
 &lt;Logger name="org.springframework" level="info" additivity="false" /&gt;
 Ví dụ về Bộ lọc: với những bộ ghi thuộc không gian tên 'com.mycompany.myproduct',
 các mẫu nhật ký thuộc cấp bậc "DEBUG" hay cao hơn có dữ liệu ThreadContextMap chứa
 cặp khóa-giá trị (key-value) "test=123", cũng sẽ gởi mẫu nhật ký đến Bộ nối "STDOUT".
 &lt;Logger name="com.mycompany.myproduct" level="debug" additivity="true"&gt;
 &lt;ThreadContextMapFilter&gt;
 &lt;KeyValuePair key="test" value="123"/&gt;
 &lt;/ThreadContextMapFilter&gt;
 &lt;AppenderRef ref="STDOUT"/&gt;
 &lt;/Logger&gt;
 &lt;!--
 Mặc định, tất cả mẫu nhật ký có cấp "TRACE" hoặc cao hơn sẽ được ghi lại.
 Mẫu nhật ký sau đó sẽ được gởi tới bộ nối "file" và
 mẫu nhật ký có cấp "ERROR" hoặc cao hơn sẽ được gởi tới bộ nối "STDOUT".
 &lt;Root level="trace"&gt;
 &lt;AppenderRef ref="file"/&gt;
 &lt;AppenderRef ref="STDOUT" level="error"/&gt;
 &lt;/Root&gt;
 &lt;/Loggers&gt;
&lt;/Configuration&gt;
Ví dụ cho Log4j 1.2.
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE log4j:configuration PUBLIC "-//LOGGER" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd"&gt;
&lt;log4j:configuration&gt;
 bộ nối định ra đầu ra cho trình ghi nhật ký, là màn hình điều khiển hoặc là một tập tin nào đó;
 tên cho bộ nối được chọn tùy ý.
 &lt;appender name="stdout" class="org.apache.log4j.ConsoleAppender"&gt;
 &lt;layout class="org.apache.log4j.PatternLayout"&gt;
 &lt;param name="ConversionPattern"
 value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n" /&gt;
 &lt;/layout&gt;
 &lt;/appender&gt;
 &lt;!-- 
 Bộ ghi ở thư mục 'org.springframework' chỉ ghi các mẫu nhật ký có cấp "INFO" hoặc cao hơn;
 nếu bạn sử dụng các bộ ghi có bằng cách gọi tên của nó (ví dụ: Logger.getLogger(AClass.class))
 và nếu AClass nằm trong gói org.springframework, nó cũng thuộc về thư mục này
 &lt;logger name="org.springframework"&gt;
 &lt;level value="info"/&gt;
 &lt;/logger&gt;
 mọi thứ nằm trong Spring được xét ở cấp "INFO" nhưng với lớp 
 PropertyEditorRegistrySupport ta muốn ghi nhật ký ở cấp "DEBUG" 
 &lt;logger name="org.springframework.beans.PropertyEditorRegistrySupport"&gt;
 &lt;level value="debug"/&gt;
 &lt;/logger&gt;
 &lt;logger name="org.acegisecurity"&gt;
 &lt;level value="info"/&gt;
 &lt;/logger&gt;
 
 &lt;root&gt;
 Tất cả mẫu nhật ký có cấp "DEBUG" hoặc cao hơn sẽ được ghi lại, nếu không được định nghĩa riêng 
 tất cả thông điệp nhật ký sẽ được gởi tới bộ nối "stdout", nếu không được định nghĩa riêng
 &lt;level value="debug" /&gt;
 &lt;appender-ref ref="stdout" /&gt;
 &lt;/root&gt;
&lt;/log4j:configuration&gt;
TTCC.
TTCC là định dạng thông điệp được log4j sử dụng. TTCC là cụm viết tắt của "Time Thread Category Component" nghĩa là "Phần Thư mục Luồng Thời gian". TTCC sử dụng mẫu định dạng sau:
 %r [%t] %-5p %c %x - %m%n
Trong đó
Ví dụ đầu ra
467 [main] INFO org.apache.log4j.examples.Sort - Exiting main method.