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à:
Tăng độ tin cậy. Thông điệp (message) không bị mất khi cấu hình lại bộ khung như đã xuất hiện ở Log4j 1 hoặc Logback
Khả năng mở rộng: Log4j 2 hỗ trợ hệ thống trình cắm cho phép người dùng định nghĩa và cấu hình các thành phần mới tùy ý
Cú pháp cấu hình được đơn giản hóa
Hỗ trợ cấu hình theo định dạng xml, json, yaml và properties
Nâng cấp Bộ lọc (Filter)
Property lookup support for values defined in the configuration file, system properties, environment variables, the ThreadContext Map, and data present in the event
Hỗ trợ nhiều APIs: Log4j 2 có thể sử dụng đồng thời trên các ứng dụng đã có các API Log4j 2, Log4j 1.2, SLF4J, Commons Logging và java.util.logging (JUL).
Tùy chỉnh cấp độ ghi nhật ký
Hỗ trợ "ghi lười" ("lazy logging") nhờ công nghệ lambda theo dạng Java 8 
Đánh dấu (Marker)
Hỗ trợ đối tượng Message do người dùng tự định nghĩa
"Garbage-free or low garbage" trong cấu hình thông dụng
Tăng tốc độ

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:
 In Log4j hai configurations set the status attribute to TRACE to send internal status logging output to standard out. To enable status logging before the configuration is found, use the Java VM property -Dorg.apache.logging.log4j.simplelog.StatusLogger.level=trace.
 In Log4j 1, use the Java VM property -Dlog4j.debug. 
To find out where a log4j2.xml configuration file was loaded from inspect getClass().getResource("/log4j2.xml").

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
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="trace" monitorInterval="60">
  <Properties>
    <Property name="filename">target/test.log</Property>
  </Properties>
 
  <Appenders>
    <Console name="STDOUT">
      <PatternLayout pattern="%d %p %c{1.} [%t] %m%n"/>
    </Console>

    <File name="file" fileName="${filename}">
      <PatternLayout>
        <pattern>%d %p %c{1.} [%t] %m%n</pattern>
      </PatternLayout>
    </File>
  </Appenders>
 
  <Loggers> 
    <!-- 
         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
    -->
    <Logger name="org.springframework" level="info" additivity="false" />

    <!--
        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".
    -->
    <Logger name="com.mycompany.myproduct" level="debug" additivity="true">
      <ThreadContextMapFilter>
        <KeyValuePair key="test" value="123"/>
      </ThreadContextMapFilter>
      <AppenderRef ref="STDOUT"/>
    </Logger>
 
    <!--
        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".
    -->
    <Root level="trace">
      <AppenderRef ref="file"/>
      <AppenderRef ref="STDOUT" level="error"/>
    </Root>
  </Loggers>
 
</Configuration>

Ví dụ cho Log4j 1.2 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//LOGGER" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration>
    <!-- 
         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 ý.
    -->
    <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n" />
        </layout>
    </appender>
 
    <!-- 
         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
    -->
    <logger name="org.springframework">
        <level value="info"/>
    </logger>

    <!-- 
         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" 
    -->
    <logger name="org.springframework.beans.PropertyEditorRegistrySupport">
        <level value="debug"/>
    </logger>
 
    <logger name="org.acegisecurity">
        <level value="info"/>
    </logger>
    
    
    <root>
        <!-- 
            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
        -->
        <level value="debug" />
        <appender-ref ref="stdout" />
    </root>
</log4j:configuration>

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.

Cổng
log4c - A port for C. Log4C là thư viện ghi nhật ký cho nền tảng C, phát hành trên SourceForge với giấy phép LGPL. Cho các hệ điều hành có nhân Unix khác nhau, tập tin cấu hình cài đặt autoconf và automake được cung cấp kèm. Với nền tảng Windows tập tin Makefile cũng được giới thiệu để sử dụng với Visual C++. Lập trình viên có thể lựa chọn sử dụng tập tin cấu hình cài đặt họ tự tạo để  biên dịch mã nguồn, dựa vào yêu cầu kỹ thuật bản dựng của họ. Thực thể của thư viện log4c có thể được cấu hình sử dụng 3 phưowng pháp: sử dụng biến môi trường, mã lập trình, hoặc thông qua tập tin cấu hình định dạng XML. Phiên bản mới nhất của Log4C là 1.2.4, được phát hành năm 2013, và dự án này đã không còn được tiếp tục phát triển.
log4js - A port for JavaScript. Log4js được phát hành theo giấy phép Quỹ Phần mềm Apache. Một tính năng đặc biệt của Log4js là khả năng ghi nhật ký các sự kiện của trình duyệt từ phía máy chủ. Bằng việc sử dụng Ajax, thư viện này hỗ trợ gởi sự kiện nhật ký dưới nhiều định dạng khác nhau (XML, JSON, ASCII thuần, v.v.) tới máy chủ để được xử lý. Các bộ nối được sử dụng log4js: AjaxAppender, ConsoleAppender, FileAppender, JSConsoleAppender, MetatagAppender, và WindowsEventsAppender. Các lớp Bản mẫu được cung cấp gồm có: BasicLayout, HtmlLayout, JSONLayout, và XMLLayout. Phiên bản cuối cùng của Log4js là 1.1, phát hành năm 2008.
log4javascript - Another port for JavaScript. log4javascript là bộ khung ghi nhật ký cho JavaScript dựa theo log4j. Phiên bản cuối cùng là 1.4.9, được phát hành vào tháng 5 năm 2014.
JSNLog - A port for JavaScript. Automatically places messages from JavaScript loggers in server side logs using a.Net server side component that interfaces with Log4Net, NLog, Elmah or Common.Logging. This to provide an integrated log for client and server side events. Request ids correlate events related to a specific user. Configuration is via a server side web.config file. Supports exception logging including stack traces. In July 2014 the latest version was 2.7.1 and updates were made regularly.
Apache Log4net - A port to the Microsoft .NET Framework. Dự án được Neoworks khơi mào, sau đó hòa vào Quỹ Phần mềm Apache vào tháng 2 năm 2004. Bộ khung này tương tự với log4j, được bổ sung các điểm mạnh từ các tính năng mới trong thời gian thực thi.NET. Hỗ trợ Nested Diagnostic Context (NDC) và Mapped Diagnostic Context (MDC). Phiên bản mới nhất là 1.2.15, phát hành năm 2015.
log4perl -  A Perl port of the widely popular log4j logging package. Phiên bản mới nhất là 1.44, phát hành vào tháng 5 năm  2014.
Apache log4php - "Bộ khung ghi nhật ký hoàn hảo cho PHP. Khởi đầu là một cổng Apache log4j cho PHP, log4php đã phát triển và chứa đựng nhiều đặc tính PHP."
PL-SQL-Logging-Utility is an adaptation of log4j in PL/SQL.
Log4db2 là một trình ghi nhật ký dành cho DB2 for LUW sử dụng câu lệnh SQL với mã SQL PL.
Apache Log4cxx - A logging framework for C++ patterned after Apache log4j, which uses Apache Portable Runtime for most platform-specific code and should be usable on any platform supported by APR. It is currently undergoing Incubation, phiên bản mới nhất là 0.10.0, phát hành năm 2013.

Tham khảo

Xem thêm

Liên kết ngoài
Website chính thức

Quỹ Phần mềm Apache
Phần mềm miễn phí được lập trình bằng ngôn ngữ Java
Định dạng tập tin nhật ký
Phần mềm giấy phép Apache