"Ồ, bạn đây rồi! Bạn có nhớ hôm nay chúng ta có một bài học khác không?"
"Không, tôi chỉ đang tìm bạn. Gần như..."
"Tuyệt vời, vậy thì bắt đầu thôi. Hôm nay tôi muốn nói với bạn về việc đăng nhập."
"Nhật ký là danh sách các sự kiện đã xảy ra. Gần giống như nhật ký của một con tàu hoặc nhật ký. Hoặc Twitter - có lẽ bạn có thể liên hệ tốt hơn với điều đó. Không có gì ngạc nhiên khi máy ghi nhật ký là một đối tượng mà bạn sử dụng để ghi nhật ký."
"Trong lập trình, thông lệ là ghi lại hầu hết mọi thứ. Và trong Java, chúng tôi ghi lại mọi thứ và thậm chí nhiều hơn một chút."
"Thực tế là các chương trình Java thường là các ứng dụng máy chủ lớn không có giao diện người dùng, bảng điều khiển, v.v. Chúng xử lý hàng nghìn yêu cầu của người dùng cùng một lúc và thường có nhiều lỗi khác nhau. Đặc biệt là khi các luồng khác nhau bắt đầu can thiệp lẫn nhau."
"Trên thực tế, cách duy nhất để tìm kiếm các lỗi và lỗi hiếm khi lặp lại trong những trường hợp này là ghi nhật ký mọi thứ xảy ra trên mỗi luồng."
"Thông thường, nhật ký chứa thông tin về các đối số của phương thức, mọi lỗi đã bắt được và rất nhiều thông tin trung gian."
"Nhật ký càng đầy đủ thì càng dễ tái tạo chuỗi sự kiện và theo dõi nguyên nhân gây ra lỗi hoặc lỗi."
"Đôi khi nhật ký đạt tới vài gigabyte mỗi ngày. Điều này là bình thường."
"Vài gigabyte? O_o"
"Đúng. Thông thường, các tệp nhật ký được lưu trữ tự động, với chỉ báo về ngày liên quan."
"Ái chà."
"Uh-huh. Ban đầu, Java không có trình ghi nhật ký riêng. Kết quả là, một số trình ghi nhật ký độc lập đã được viết. Phổ biến nhất trong số này là log4j."
"Vài năm sau, Java có một bộ ghi nhật ký của riêng mình, nhưng chức năng của nó kém hơn nhiều và nó không được sử dụng rộng rãi."
"Thực tế là Java có một trình ghi nhật ký chính thức, nhưng toàn bộ cộng đồng lập trình viên Java thích sử dụng các trình ghi nhật ký khác. "
"Sau đó, một số logger khác đã được viết dựa trên log4j."
"Sau đó, trình ghi nhật ký chung đặc biệt slf4j, hiện đang được sử dụng rộng rãi, được viết cho tất cả chúng. Nó rất giống với log4j, vì vậy tôi sẽ sử dụng nó làm ví dụ khi giải thích việc ghi nhật ký."
"Toàn bộ quá trình khai thác gỗ bao gồm ba phần."
" Đầu tiên , thu thập thông tin."
" Thứ hai , lọc thông tin thu thập được."
" Thứ ba , ghi lại thông tin đã chọn."
"Hãy bắt đầu với bộ sưu tập. Đây là một ví dụ điển hình của một lớp ghi nhật ký:"
class Manager
{
private static final Logger logger = LoggerFactory.getLogger(Manager.class);
public boolean processTask(Task task)
{
logger.debug("processTask id = " + task.getId());
try
{
task.start();
task.progress();
task.complete();
return true;
}
catch(Exception e)
{
logger.error("Unknown error", e);
return false;
}
}
}
"Hãy chú ý đến những từ được đánh dấu màu đỏ."
" Dòng 3 – Tạo đối tượng logger . Đối tượng tĩnh như vậy được tạo trong hầu hết mọi lớp! Chà, ngoại trừ các lớp không làm gì khác ngoài lưu trữ dữ liệu."
" LoggerFactory là một lớp đặc biệt để tạo trình ghi nhật ký và getLogger là một trong các phương thức tĩnh của nó. Đối tượng hiện tại thường được chuyển, nhưng có thể có nhiều tùy chọn khác nhau."
" Dòng 7 – Thông tin về lệnh gọi phương thức được ghi vào nhật ký. Lưu ý rằng đây là dòng đầu tiên của phương thức. Ngay sau khi phương thức được gọi, chúng tôi sẽ ngay lập tức ghi thông tin vào nhật ký."
"Chúng tôi gọi phương pháp gỡ lỗi, có nghĩa là tầm quan trọng của thông tin ở mức GỠ LỖI. Phương pháp này được sử dụng để lọc. Tôi sẽ cho bạn biết về điều đó sau vài phút nữa."
" Dòng 17 – Chúng tôi phát hiện một ngoại lệ và... ngay lập tức ghi nó vào nhật ký! Đây chính xác là điều cần phải làm."
"Lần này chúng tôi gọi phương thức lỗi, phương thức này ngay lập tức chỉ ra rằng thông tin ở mức LỖI"
"Bây giờ mọi thứ có vẻ rõ ràng. Chà, trong chừng mực có thể rõ ràng trong cuộc trò chuyện của chúng ta."
"Tuyệt, vậy hãy chuyển sang phần lọc tin nhắn."
"Thông thường, mỗi thông báo bản ghi có mức độ quan trọng riêng mà bạn có thể sử dụng để loại bỏ một số thông báo. Dưới đây là các mức độ quan trọng mà tôi đã đề cập:"
mức độ quan trọng | Sự miêu tả |
---|---|
TẤT CẢ | Tất cả các tin nhắn |
DẤU VẾT | Thông báo gỡ lỗi chi tiết |
GỠ LỖI | Thông báo gỡ lỗi quan trọng |
THÔNG TIN | tin nhắn thông tin |
CẢNH BÁO | cảnh báo |
LỖI | lỗi |
GÂY TỬ VONG | lỗi nghiêm trọng |
TẮT | Không có tin nhắn |
Các mức này cũng được sử dụng khi lọc tin nhắn.
Giả sử bạn đặt mức ghi nhật ký là WARN. Sau đó, tất cả các thông báo ít quan trọng hơn WARN sẽ bị loại bỏ: TRACE, DEBUG, INFO.
Nếu bạn đặt mức lọc thành FATAL, thì ngay cả các thông báo LỖI cũng sẽ bị loại bỏ.
"Có hai mức độ quan trọng nữa được sử dụng khi lọc: TẮT, loại bỏ tất cả thư; và TẤT CẢ, hiển thị tất cả thư (không có gì bị loại bỏ)."
"Làm cách nào và ở đâu để thiết lập bộ lọc?"
"Ta sẽ nói cho ngươi biết ngay."
"Thông thường, cài đặt trình ghi nhật ký log4j được chỉ định trong tệp log4j.properties."
Bạn có thể chỉ định nhiều đối tượng appender trong tệp này. Dữ liệu được ghi vào các đối tượng này. Có các nguồn dữ liệu và có các phần bổ sung - các đối tượng có mục đích trái ngược nhau. Các đối tượng mà dữ liệu chảy vào như nước.
"Đây là một số ví dụ:"
# Root logger option
log4j.rootLogger = INFO, stdout
# Direct log messages to stdout
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}
Dòng 1 và 4 – Đây là những bình luận
Dòng 2 – Chúng tôi cho biết mức ghi nhật ký mà chúng tôi muốn. Tất cả các mức ít quan trọng hơn (DEBUG, TRACE) sẽ bị loại bỏ.
Ở cùng một nơi, chúng tôi thêm dấu phẩy và sau đó cho biết tên của đối tượng (mà chúng tôi tự nghĩ ra) mà nhật ký sẽ được ghi vào. Các dòng 5-9 chứa các cài đặt của nó.
Dòng 5 – Chúng tôi chỉ định loại appender ( ConsoleAppender ).
Dòng 6 – Chúng tôi chỉ ra chính xác nơi chúng tôi đang viết ( System.out. ).
Dòng 7 - Chúng tôi đặt lớp sẽ quản lý các mẫu chuyển đổi (PatternLayout).
Dòng 8 - Chúng tôi đặt mẫu chuyển đổi sẽ được sử dụng để viết. Trong ví dụ trên, đó là ngày và giờ.
"Và đây là giao diện ghi vào tệp:"
# Root logger option
log4j.rootLogger = INFO, file
# Direct log messages to a log file
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File = C:\\loging.log
log4j.appender.file.MaxFileSize = 1MB
log4j.appender.file.MaxBackupIndex = 1
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %-5p %c{1}:%L - %m%n
"Dòng 2 đặt mức lọc thư và tên của đối tượng appender (chìm)."
"Dòng 5 – Chúng tôi chỉ định loại trình nối thêm tệp ( RollingFileAppender )."
"Dòng 6 – Chúng tôi chỉ định tên của tệp mà nhật ký sẽ được ghi vào."
"Dòng 7 – Chúng tôi chỉ định kích thước nhật ký tối đa. Khi vượt quá giới hạn kích thước này, một tệp mới sẽ được tạo."
"Dòng 8 – Chúng tôi chỉ định số lượng tệp nhật ký cũ sẽ được lưu trữ."
"Dòng 9-10 – Đặt mẫu chuyển đổi."
"Tôi không biết chuyện gì đang xảy ra ở đây, nhưng tôi có thể đoán được. Điều đó thật đáng khích lệ."
"Thật tuyệt. Sau đây là ví dụ về cách ghi nhật ký vào tệp và bảng điều khiển:"
# Root logger option
log4j.rootLogger = INFO, file, stdout
# Direct log messages to a log file
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File = C:\\loging.log
log4j.appender.file.MaxFileSize = 1MB
log4j.appender.file.MaxBackupIndex = 1
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %-5p %c{1}:%L - %m%n
# Direct log messages to stdout
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}
"À, vậy là cậu có thể làm thế à? Thật tuyệt!"
"Yep. Bạn có thể khai báo bao nhiêu appender tùy thích và tùy chỉnh từng cái."
Hơn nữa, mỗi appender có thể có các cài đặt rất linh hoạt để lọc tin nhắn. Chúng tôi không chỉ có thể chỉ định một mức lọc thư riêng lẻ cho từng ứng dụng mà còn có thể lọc thư theo gói! Đó là lý do tại sao bạn cần chỉ định một lớp khi tạo bộ ghi nhật ký (Tôi đang nói về LoggerFactory.getLogger ).
"Ví dụ:"
# Root logger option
log4j.rootLogger = INFO, file, stdout
# Direct log messages to a log file
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.threshold = DEBUG
log4j.appender.file.File = C:\\loging.log
log4j.appender.file.MaxFileSize = 1MB
log4j.appender.file.MaxBackupIndex = 1
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %-5p %c{1}:%L - %m%n
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.threshold = ERROR
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}
log4j.logger.org.springframework = ERROR
log4j.logger.org.hibernate = ERROR
log4j.logger.com.codegym = DEBUG
log4j.logger.org.apache.cxf = ERROR
"Dòng 6 và 15 – Chúng tôi đặt mức lọc riêng cho từng ứng dụng."
"Dòng 20-23 – Chúng tôi chỉ định tên gói và cấp độ lọc cho thông báo của gói. Log4j.logger là tiền tố: tên gói được đánh dấu bằng màu cam."
"Thật không? Bạn thậm chí có thể làm điều đó. Chà, thật tuyệt!"
"Nhân tiện, cả log4j và slf4j đều không được bao gồm trong JDK. Bạn sẽ cần tải xuống chúng một cách riêng biệt. Bạn có thể làm điều đó tại đây . Nhưng có một cách khác:"
" Bước 1 .Thêm nhập vào lớp:"
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
" Bước 2. Đặt con trỏ vào những dòng này và nhấn Alt+Enter trong IntelliJ IDEA"
" Bước 3 . Chọn mục menu 'File jar trên web».'
" Bước 4. Chọn 'slf4j-log4j13.jar'"
" Bước 5. Chỉ định nơi tải xuống thư viện (jar)"
" Bước 6. Sử dụng các lớp bạn cần."
"Chà! Thật là một ngày tuyệt vời. Có quá nhiều điều mới mẻ và quá nhiều điều thú vị!"
"Đây là một bài viết hay khác về ghi nhật ký: https://docs.oracle.com/javase/10/core/java-logging-overview.htm#JSCOR-GUID-48004124-2C00-49F7-A640-0C0DDA271DBC "
"Được rồi, đủ rồi. Nghỉ ngơi đi, lập trình viên."
GO TO FULL VERSION