• Thứ Hai, 06/09/2010 16:39 (GMT+7)

    Nhật ký ứng dụng

    Duy Khoa
    Một yêu cầu quan trọng đối với lập trình viên đó là xử lý hậu trường của ứng dụng, ghi nhật ký để sửa lỗi và nâng cấp, nhưng thường bị... bỏ qua.

    Có một khâu quan trọng mà lập trình viên thường quên đó là xử lý hậu trường của ứng dụng, ghi nhật ký để sửa lỗi và nâng cấp. Ví dụ, trong quá trình chạy ứng dụng sẽ có một số biệt lệ (exception) xảy ra (chẳng hạn chia cho số 0), thực tế có những biệt lệ bạn không biết trước được, bạn xử lý thế nào với các biệt lệ đó? 

    Nếu thiết kế class (trong lập trình hướng đối tượng), bạn có thể đặt lệnh throws Exception sau phần khai báo của phương thức đó.

    Public Double Divide(Double a, Double b) throws Exception
    {
    Return a/b;
    }

    Khi phương thức này được gọi trên một chức năng cụ thể nào đó của ứng dụng, bạn không thể throws Exception được, vì khi chạy đến tình huống exception này được bung ra, ứng dụng của bạn sẽ bị ngắt ngang và không cho ra kết quả như mong muốn, bạn phải dùng phương pháp try{}…catch(){} có trong hầu hết ngôn ngữ lập trình hiện đại. Nhưng nguy hiểm ở chỗ có những biệt lệ không thể dự tính trước, nếu đó là ứng dụng web và lỗi hiển thị ra có thể là mồi ngon cho hacker khai thác.

    Xét ví dụ thực tế một website nhà sách trực tuyến http://.....vn, khi thay tham số ShopID trên URL bạn sẽ thấy trình duyệt web hiển thị exception như hình.

    Người xây dựng ứng dụng web này đã sơ hở, để người dùng cuối thấy được lỗi từ các biệt lệ. Bất cứ 1 lỗi nhỏ nào trên web đều có nguy cơ trở thành mồi ngon cho hacker khai thác. Do vậy chúng ta cần có phương pháp ngăn ngừa. 

    Đa số các ngôn ngữ lập trình hay công nghệ xử lý web động đều cung cấp giải pháp khi biệt lệ được tung ra, đó là:

    * Logging – ghi nhật ký lỗi và nhắc nhở để giải quyết về sau 

    * Chuyển hướng trang web đến 1 trang thông báo khác với nội dung: “Trang web bị lỗi, vui lòng quay lại sau”. Hay hơn nữa, ta có thể cung cấp cho người dùng 1 form để thông báo lỗi cho người quản trị.

    Ở đây tôi giới thiệu cách cài đặt các hướng xử lý này trên môi trường web với công nghệ JSP.

    Các phần mềm cần thiết gồm:

    + Thư viện Jdk1.6.0_20 – tải từ http://www.java.sun.com

    + Webserver Apache Tomcat 6.0 – tải từ http://www.apache.org

    + Phần mềm phát triển Eclipse for JavaEE – tải từ http://www.eclipse.org

    Với thư viện Jdk và Webserver Tomcat là bắt buộc phải có, còn Eclipse là môi trường phát triển trực quan dung lượng gần 200 MB (hơi nặng), bạn có thể dùng một trình soạn thảo khác như notepad thay thế. Ở đây tôi dùng Eclipse để bớt được nhiều thao tác config, set path, set classpath…

    Các bước thực hiện như sau:

    1/ Khởi động Eclipse

    2/ Tại 1 JSP Web project 

    * Chọn File – New – Other hoặc nhấn Ctrl+N

    * Chọn Web – chọn Dynamic Web Project – nhấn Next

    * Đặt tên Project là LoggingDemo như hình

    * Ở phần Target Runtime chọn Apache Tomcat v6. Nếu chưa có bạn nhấn nút New kế bên, chọn Apache Tomcat, chọn version 6 và trỏ đến thư mục Tomcat

    * Nhấn Next

    * Nhấn Finish

    3/ Tạo 1 trang JSP

    * Trên nhánh WebContent - nhấn phải - chọn New - chọn JSP

    * Đặt tên trang là test.jsp

    * Chọn Finish

    * Chèn đoạn code có khả năng bung ra biệt lệ như sau - đây là lỗi chia cho số chia 0
    <%
    int a=9;
    int b=0;
    int c=a/b;
    out.println(c);
    %>

    4/ Chạy trang web vừa tạo

    * Nhấn chuột phải - chọn Run - chọn Run on Server 

    * Chọn Next

    * Chọn Finish

    * Xem kết quả trên trình duyệt: infinity phép chia cho 0 ra kết quả vô định như hình

    * Mỗi khi trang bung ra biệt lệ, ta muốn che đi thông tin đó và chuyển hướng đến 1 trang thông báo. Trên thẻ đầu tiên của trang web (page directive), ta thêm thuộc tính errorPage=”error.jsp” như hình. Như vậy mỗi khi có biệt lệ, trang này sẽ chuyển sang trang error.jsp

    5/ Bây giờ ta tạo thêm 1 trang error.jsp để thông báo như hình

    * Ở page directive của trang error.jsp, ta thêm thuộc tính isErrorPage=”true” để đánh dấu đây là trang dùng để hiển thị khi có lỗi.

    * Trên trang error.jsp ta thêm dòng code sau:
    <%
    out.println(“handled: ”+exception.getMessage());
    %>

    * Dòng code đó sẽ hiển thị ra lỗi mà trang trước bung ra.

    * Các bạn xem kết quả bằng cách chạy lại trang test.jsp

    6/ Ghi nhật ký ứng dụng

    * Cho đến lúc này chúng ta đã giải quyết được vấn đề đón bắt biệt lệ ngoài dự tính. Tuy nhiên hiển thị thông điệp lỗi ở trang error.jsp là điều không nên vì: người xem không hiểu những thông báo lỗi kỹ thuật, đồng thời lại tạo điều kiện cho hacker nắm bắt thông tin để phá hoại. Chúng ta cần che đi lỗi, và thông báo ra 1 thông điệp thân thiện hơn như hình

    * Lưu ý hàm log() ở trên sẽ ghi lại biệt lệ chứa trong đối tượng implicit exception, bạn có thể tìm thấy file nhật ký này trong thư mục logs của Apache Tomcat Server.

    * Xem lại kết quả bằng cách chạy lại file test.jsp

    * Lưu ý là bạn đang kiểm tra ứng dụng trên server ảo mà Eclipse tạo ra. Khi triển khai thực sự lên Tomcat Server, ở vị trí tomcat\webapps\ chẳng hạn, lúc đó chạy demo, bạn sẽ thấy nhật ký lỗi được lưu trong folder tomcat\logs.

    * Tên file nhật ký được quy định mặc định như sau <tên host>.năm-tháng-ngày.log.

    7/ Gợi mở thêm về kỹ thuật logging

    Ngoài cách sử dụng hàm log được cung cấp sẵn như trên, bạn cũng nên tìm hiểu thêm về thư viện nguồn mở Log4j, được cung cấp miễn phí tại http://apache.org. Với Log4j bạn sẽ tùy biến được các thông số uyển chuyển hơn (thông qua file cấu hình xml), phân định mức log để lọc và trích xuất tùy mục đích. Và kết quả file log cũng được xuất ra ở nhiều dạng hơn, có thể là văn bản thuần, hoặc định dạng html.

    Thực sự logging không phải là kỹ thuật mới, trong hệ điều hành Windows bạn có thể tìm thấy nhật ký lỗi của hệ điều hành ở Event Viewer. Khi phát triển chương trình trên bất kỳ môi trường nào, bạn cũng nên lập kế hoặch ghi nhật ký ứng dụng, điều này tốt cho việc quản lý lỗi, giúp người quản trị thu thập, xử lý sự cố kịp thời cho người dùng cuối, và thông báo cho lập trình viên để sửa lỗi, đồng thời cũng ngăn tình trạng hacker lợi dụng lỗ hổng ứng dụng để truy xuất thông tin nhạy cảm.

    Bạn có thể tham khảo mã nguồn WebProject dùng làm demo đi theo bài.

    Mọi chi tiết đóng góp, trao đổi, thảo luận, các bạn vui lòng liên hệ: td.khoa@yahoo.com
     

    ID: A1007_114