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
<?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> 
    
    <Logger name="org.springframework" level="info" additivity="false" />

    
    <Logger name="com.mycompany.myproduct" level="debug" additivity="true">
      <ThreadContextMapFilter>
        <KeyValuePair key="test" value="123"/>
      </ThreadContextMapFilter>
      <AppenderRef ref="STDOUT"/>
    </Logger>
 
    
    <Root level="trace">
      <AppenderRef ref="file"/>
      <AppenderRef ref="STDOUT" level="error"/>
    </Root>
  </Loggers>
 
</Configuration>
```


### Ví dụ cho Log4j 1.2

```xml
<?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>
    
    <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>
 
    
    <logger name="org.springframework">
        <level value="info"/>
    </logger>

    
    <logger name="org.springframework.beans.PropertyEditorRegistrySupport">
        <level value="debug"/>
    </logger>
 
    <logger name="org.acegisecurity">
        <level value="info"/>
    </logger>
    
    
    <root>
        
        <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