Khi làm việc với những hệ thống cũ , đôi khi có những Error Log được bắn tới Mail liên tực , mà những Error Log đó thực chất cũng không nguy hiểm gì , ta muốn chặn việc gửi Error Log đó tới Mail. Nhưng ta lại không thể vô cái Class phát sinh ra Error Log đó để thay đổi Event Level Log, vì đó là 1 file .jar chẳng hạn , thì khi đó ta có thể sử dụng phương thức isTriggeringEvent() của interface TriggeringEventEvaluator  để bắt lại cái Error Log đó và xử lý đê không gửi nó đến Mail nữa. Phương thức isTriggeringEvent( ) nếu set giá trị trả về là false thì Error Log đó sẽ không được bắn tới Mail .

1. Giới thiệu về cách gửi Mail trong Java

Khi sử dụng class SMTPAppender , bạn có thể gửi đến Mail 1 Output Log . Để sử dụng class này thì cần có  JavaMail và  JAF ( JavaBeans Activation Framework ), bạn có thể tham khảo cách cài đặt và sử dụng ở đây http://vietjack.com/java/gui_email_trong_java.jsp.

Để tạo Object của SMTPAppender ta có 2 cách  :

`         1``: SMTPAppender()`
`         2``: SMTPAppender(TriggeringEventEvaluator evaluator)`
-  Với cách thứ nhất  , hàm khởi tạo không có đối số thì mặc định nếu Event Level là ERROR hay FATAL  phát sinh , thi Output Log sẽ được bắn đến Mail . Trong trường hợp này Method error() hoặc là fatal() của class Logger sẽ được gọi để bắn ra Output Log.
- Với cách thử hai , hàm khởi tạo có đối số  là 1 Class thực thi interface TriggeringEventEvaluator thì với bất kỳ Event Level Log nào khi phát sinh , đều có thể điều khiển để bắn Output Log đến Mail .Hàm khởi tạo này sẽ lấy đối tượng được tạo ra từ Class thực thi interface org.apache.log4j.spi.TriggeringEventEvaluator nhờ vào Method isTriggeringEvent( ).
Dưới đây là ví dụ về Class thực thi interface TriggeringEventEvaluator có thể bắt log có Level là DEBUG trở lên và gửi đến Mail.
import org.apache.log4j.*; import org.apache.log4j.spi.*; class SampleEvaluator implements TriggeringEventEvaluator { public boolean isTriggeringEvent(LoggingEvent event){ return(event.getLevel().isGreaterOrEqual(Priority.DEBUG)); } }

2. Bắt Event  Log của 1 Class bất kỳ

Sau đây tôi sẽ hướng dẫn chi tiết về  việc bắt Event  Log của 1 Class bất kỳ, và sử lý để nó không gửi Error Log tới Mail.

Giống như trên ta tạo 1 class kế thừa interface TriggeringEventEvaluator. Class này sẽ bắt tất cả các Log có Level là Error và lọc ra cái Log Error có tên là E-OTT-0003 , khi set Method isTriggeringEvent( ) trả về false thì Error Log này sẽ không được gửi tới Mail.

import org.apache.log4j.Level; import org.apache.log4j.spi.LoggingEvent; import org.apache.log4j.spi.TriggeringEventEvaluator; //Nếu ERROR LOG có tên là E-OTT-0003 thì sẽ chặn lại không gửi tới mail public class OttSkipSendMailLog implements TriggeringEventEvaluator { @Override public boolean isTriggeringEvent(LoggingEvent event) { if (event.getLevel().toInt() != Level.ERROR.toInt()) { return false; } if (event.getThrowableStrRep()[0].toString().contains("E-OTT-0003")) { return false; } return true; } }

Tiếp theo là sẽ thiết lập , khai báo các thông số cho việc gửi Mail trong fiel log4j.xml

Vài điểm cần lưu ý

  • Class kế thứa interface TriggeringEventEvaluator
  • Class cần bắt Event Level Log

3. Kết luận

Bài viết được viết trên những điểu căn bản nhất , thiết thực nhất khi làm một project thực tế, không có kiến thức gì cao siêu phức tạp , nhưng lại có thể giúp ích đối với những bạn mới vào nghề .

Tham khảo

http://www.techscore.com/tech/Java/ApacheJakarta/Log4J/4/

http://www.nurs.or.jp/~sug/soft/log4j/log4j6.htm