Log là một quá trình ghi lại những thông tin được thông báo, lưu lại trong quá trình hoạt động của một ứng dụng ở một nơi tập trung. Mục đích chính là để có thể xem lại các thông tin hoạt động của ứng dụng trong quá khứ như debug khi có lỗi xảy ra, check health, xem info, error, warning,… Show Có nhiều cách để ghi log: có thể lưu vào file, console (sử dụng lệnh sysout), database hoặc đâu đó để có thể xem lại được. Trong các ứng dụng thực tế, lưu ra console ít được lựa chọn bởi có một số hạn chế sau:
Log như thế nào?Việc đầu tiên trước khi output dòng log ra hãy tưởng tượng sau đó có thể sử dụng được không, hay chỉ là thông tin vô nghĩa. Ví dụ: khi bạn xử lý một HTTP request từ phía client, request này khi được xử lý thì gây ra lỗi 500 – “Internal server error”. Khi đó thông tin log ở đây ít nhất phải có:
Khi xem lại đoạn log, chúng ta biết được cách tái hiện lại lỗi hay phán đoán lỗi xảy ra như thế nào để khác phục nhanh hơn và chính xác hơn. Phân loại log (Log level)Log nên được phân loại tùy theo mục đích sử dụng, theo level:
Độ ưu tiên của các cấp độ log từ thấp đến cao như sau: ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF. Format logMột điều quan trọng là log đó phải sử dụng được, nghĩa là dễ đọc, dễ trace ra được thông tin cần tìm. Để làm được điều này, các log của chúng ta phải tuân thủ theo một format được chỉ định. Có nhiều ứng dụng phục vụ cho việc thu thập và phân tích dữ liệu từ file log để có thể thống kê, search,… Một trong những ứng dụng trong Java thường dùng là Logstash. Vì vậy file log nên tuân thủ theo format của các ứng dụng này. Log rotateLog rotate là việc cắt nhỏ log ra và lưu trữ trên nhiều file thay vì một file. Một số chiến lược:
Apache Log4j là gì?Apache Log4j hay ngắn gọn là Log4j là một thư viện được cung cấp bởi Apache hỗ trợ ghi log được viết bằng ngôn ngữ Java. Cách thành phần chính của Log4j:
Các tính năng của Log4j:
Để sử dụng Log4j, chúng ta cần thực hiện theo các bước:
Cài đặt Log4jTrong bài này, chúng ta sẽ sử dụng Log4j 2, đây là một version mới của Log4j. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.gpcoder</groupId> <artifactId>JavaLogging</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>JavaLogging</name> <url>http://maven.apache.org</url> <properties> </properties>
<dependencies> </dependencies>
</project>Cấu hình Log4jLog4j 2 có thể được cấu hình bằng nhiều cách.
Để cấu hình Log4j 2, chúng ta sẽ tạo một file log4j2.properties trong thư mục src/main/resources của project. Nội dung file như sau: status = error dest = err name = PropertiesConfig property.foldername = logs property.filename = ${foldername}/app.log filter.threshold.type = ThresholdFilter filter.threshold.level = debug Direct log messages to stdoutappender.console.type = Console appender.console.name = STDOUT appender.console.layout.type = PatternLayout appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n appender.console.filter.threshold.type = ThresholdFilter appender.console.filter.threshold.level = debug Direct log messages to a log fileappender.rolling.type = RollingFile appender.rolling.name = ROLLING_FILE appender.rolling.fileName = ${filename} appender.rolling.filePattern = ${foldername}/app-backup-%d{yyyy-MM-dd-HH-mm}-%i.log.gz appender.rolling.layout.type = PatternLayout appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n appender.rolling.policies.type = Policies appender.rolling.policies.time.type = TimeBasedTriggeringPolicy appender.rolling.policies.time.interval = 2 appender.rolling.policies.time.modulate = true appender.rolling.policies.size.type = SizeBasedTriggeringPolicy appender.rolling.policies.size.size = 100MB appender.rolling.strategy.type = DefaultRolloverStrategy appender.rolling.strategy.max = 20 logger.rolling.name = com.gpcoder logger.rolling.level = debug logger.rolling.additivity = true logger.rolling.appenderRef.rolling.ref = ROLLING_FILE rootLogger.level = debug rootLogger.appenderRef.stdout.ref = STDOUT File log4j2.properties này bao gồm 2 cấu hình: xuất nội dung log ra console và ra file. Tương tự, nếu bạn muốn sử dụng các định dạng khác, có thể tạo file log4j2.xml, log4j2.yml, log4j2.json. Chi tiết, các bạn tham khảo thêm trên document của Log4j. Sử dụng Log4j trong ứng dụngAppController.java package com.gpcoder; import java.text.MessageFormat; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class AppController { private static final Logger LOGGER = LogManager.getLogger(AppController.class); public static void main(String[] args) { }
public static void divide(int number1, int number2) { }
}Chạy chương trình trên, chúng ta sẽ thấy nội dung của console như sau: 2019-04-14 13:39:42 DEBUG AppController:13 - Debug log message 2019-04-14 13:39:42 INFO AppController:22 - Info: 4 / 2 = 2 2019-04-14 13:39:42 ERROR AppController:25 - Error: Cannot divide two number 4/0 java.lang.ArithmeticException: / by zero at com.gpcoder.AppController.divide(AppController.java:21) [classes/:?] at com.gpcoder.AppController.main(AppController.java:15) [classes/:?] 2019-04-14 13:39:42 FATAL AppController:16 - Fatal log message Như bạn thấy, nội dung log rất chi tiết, bao gồm: thời gian thực hiện, log level, tên class được thực thi, dòng code được thực thi, nội dung message, chi tiết exception. Refesh lại project chúng ta sẽ thấy file log được tạo ra trong project. Nếu trong project của bạn đã sử dụng thư viện Lombok, thì hãy sử dụng tính năng @Log4j2 được hỗ trợ bởi Lombok. Chúng ta có thể gọi trực tiếp log.error() mà không cần phải khai báo biến LOGGER như trên. package com.gpcoder; import lombok.extern.log4j.Log4j2; @Log4j2 public class LoggerWithLombok { public static void main(String[] args) { }
}Ngoài Log4j, chúng ta có thể sử dụng một số thư viện khác để ghi log như Logback, SLF4J. Cách sử dụng cũng tương tự như Log4j, nếu có thời gian các bạn hãy tìm hiểu thêm để áp dụng trong dự án. |