2011-05-09 7 views
12

Tôi đang tìm cách truy xuất nhật ký Tomcat trong một ứng dụng web. Trong quá khứ, tôi đã thấy tính năng này được cung cấp trong các ứng dụng web khác, thường là xóa nhật ký trong Servlet.Nhận tệp nhật ký tomcat theo lập trình trong webapp

Tôi đang sử dụng slf4j (với log4j) và Tomcat 6. Tôi không tìm thấy bất cứ điều gì có liên quan trong tài liệu Tomcat, mặc dù API JMX có vẻ như nó có thể cung cấp một cái gì đó hữu ích? Tôi không quá quan tâm liệu đầu ra có đại diện cho việc ghi nhật ký webapp hay toàn bộ nhật ký Tomcat, hoặc là đủ. Lý tưởng nhất, tôi hy vọng cho một giải pháp mà không liên quan đến cạo nhật ký từ hệ thống tập tin, mặc dù nếu đó là cách duy nhất, nó sẽ là tuyệt vời nếu thư mục log có thể được tính toán trong thời gian chạy ...

Trả lời

17

Cạo nhật ký khỏi hệ thống tập tin có lẽ là cách dễ nhất để đi. Bạn có thể lấy nhật ký một cách trực tiếp bằng cách sử dụng System.getProperty("catalina.base") + "/logs".

Nếu không, bạn có thể thiết lập một trình bổ sung bổ sung trong cấu hình log4j để đăng nhập vào một cái gì đó như JDBC, JMS, Writer, v.v. Dù có ý nghĩa gì đối với ứng dụng của bạn.

+0

Tôi đã thử cả hai cách tiếp cận và nhật ký Tomcat phù hợp nhất với yêu cầu của tôi. Cảm ơn đã giúp đỡ! – seanhodges

6

Chức năng này sẽ nhận tệp nhật ký gần đây nhất khớp với tiền tố đã cho. Bạn không cần phải biết thư mục nào được ghi vào nhật ký.

public static File locateLogFile(final String prefixToMatch) { 
    File result = null; 
    Handler[] handlers = LogManager.getLogManager().getLogger("").getHandlers(); 
    try { 
     for(Handler handler : handlers) { 

      Field directoryField; 
      Field prefixField; 
      try { 
       //These are private fields in the juli FileHandler class 
       directoryField = handler.getClass().getDeclaredField("directory"); 
       prefixField = handler.getClass().getDeclaredField("prefix"); 
       directoryField.setAccessible(true); 
       prefixField.setAccessible(true); 
      } catch(NoSuchFieldException e) { 
       continue; 
      } 

      String directory = (String)directoryField.get(handler); 
      if(prefixToMatch.equals(prefixField.get(handler))) { 
       File logDirectory = new File( directory); 
       File[] logFiles = logDirectory.listFiles(new FileFilter() { 
        public boolean accept(File pathname) { 
         return pathname.getName().startsWith(prefixToMatch); 
        } 
       }); 
       if(logFiles.length == 0) continue; 
       Arrays.sort(logFiles); 
       result = logFiles[ logFiles.length - 1 ]; 
       break; 
      } 
     } 
    } catch(IllegalAccessException e) { 
     log.log(Level.WARNING, "Couldn't get log file", e); 
    } 
    return result; 
}