2010-07-01 40 views
11

Tôi mới sử dụng các thùng chứa Servlet và đã tạo một ứng dụng web bằng Tomcat 6.0.26. Tôi có 'TODO: log' nằm rải rác trong suốt mã của tôi. Tôi thấy có tồn tại:.Ghi nhật ký servcat của Tomcat

myServlet.getServletContext() log()

mà dường như viết vào một tập tin bắt đầu bằng 'localhost' trong Tomcat thư mục '/ logs'. Tôi không cần bất kỳ khả năng ghi nhật ký nâng cao nào, nhưng tôi muốn có ngày, thời gian, tin nhắn và theo dõi ngăn xếp ở mức tối thiểu. Ngoài ra, tôi đã tạo ra một số lớp được sử dụng bởi các servlet khác nhau của tôi cũng cần khả năng ghi nhật ký. Tôi có cần phải tiêm một SevletContext vào các lớp này để họ có thể đăng nhập không?

Có vẻ như log4j từ Apache là một gói ghi nhật ký phổ biến, nhưng tôi không chắc liệu nó có đáng để gặp sự cố khi thiết lập nó hay không.

Cách ghi nhật ký được đề xuất cho nhu cầu của tôi là gì?

Trả lời

8

Ngoài tất cả các BalusC thứ đã đề cập ở trên, trong mã java của bạn (servlets/đậu/bất cứ điều gì) chỉ nhập khẩu và khởi tạo Logger

package my.app; 

import org.apache.log4j.Logger; 

private static Logger logger = Logger.getLogger("classname"); 
// use any string you want 

Sau đó, tại bất kỳ điểm khai thác gỗ quý vị có thể đăng nhập ở các cấp độ khác nhau như

if (logger.isDebugEnabled()) { 
      logger.debug("Some log at this point"); 
     } 

... 

logger.info("Some info message here"); 

này sẽ xuất hiện trong các bản ghi phụ thuộc vào việc bạn thiết lập DEBUG hoặc INFO trong log4j.propeties

Hãy xem các ví dụ trên http://www.java2s.com/Code/Java/Language-Basics/Examplelog4jConfigurationFile.htm và tất cả các ví dụ có liên quan trong cùng một bài viết

+1

Cảm ơn sự giúp đỡ. Tôi dường như không thể tìm thấy đoạn kết nối này của câu đố. Ngoài ra, có lý do nào mà cơ sở ghi nhật ký được xây dựng trong JDK không được sử dụng thường xuyên hơn không? – Wilson

+0

@Wilson - thêm vào cuộc tranh luận đó http://stackoverflow.com/questions/31840/java-logging-vs-log4j và http://stackoverflow.com/questions/582428/java-util-logging-logger-and- log4j – JoseK

+0

@JoseK - Có cách nào đơn giản để ghi nhật ký hoạt động servlet vào một tệp không có log4j hoặc bàn điều khiển không? Tôi đã đăng một câu hỏi cho điều này. Hãy giúp tôi tại - https://stackoverflow.com/questions/23858552/simple-way-to-log-servlet-in-tomcat –

10

Bạn không muốn kết hợp tất cả mã doanh nghiệp và mã truy cập dữ liệu với ServletContext (Tất nhiên tôi giả định rằng mã doanh nghiệp và DB của bạn không được kết hợp chặt chẽ bên trong lớp servlet, nhưng chỉ sống trong lớp riêng của chúng các lớp học, không có bất kỳ tham chiếu nào javax.servlet). Vì vậy, tôi sẽ không khuyên bạn nên sử dụng ServletContext#log(). Nó cũng rất hiếm khi được sử dụng trong thế giới thực.

Bạn nói đúng rằng log4j là phổ biến, mặc dù nó đã được thành công bởi logback. Thiết lập log4j không cần phải phiền phức. Tôi đề nghị bắt đầu với một tệp thuộc tính khó hiểu hơn một tệp XML. Bạn luôn có thể nâng cấp lên một tệp XML khi bạn hiểu những gì đang xảy ra trong cấu hình log4j.

Tạo tệp có tên log4j.properties, đặt nó ở đâu đó trong thư mục gốc của đường dẫn lớp, ví dụ: /WEB-INF/classes (hoặc nếu bạn đang sử dụng một IDE, thư mục gốc của thư mục src, nó cuối cùng sẽ đến đúng nơi). Bạn cũng có thể giữ nó bên ngoài webapp và thêm đường dẫn của nó vào đường dẫn lớp thời gian chạy của máy chủ bằng cách chỉ định đường dẫn của nó trong thuộc tính shared.loader của Tomcat/conf/catalina.properties. Cuối cùng, hãy điền vào như sau:

# Set root logger level and appender name. 
log4j.rootLogger = TRACE, console 

# Specify appenders. 
log4j.appender.console = org.apache.log4j.ConsoleAppender 
log4j.appender.file = org.apache.log4j.DailyRollingFileAppender 

# Configure console appender. 
log4j.appender.console.layout = org.apache.log4j.PatternLayout 
log4j.appender.console.layout.ConversionPattern = %d{ABSOLUTE} [%t] %-5p %m%n 

# Configure file appender. 
log4j.appender.file.File = /webapp/logs/web.log 
log4j.appender.file.DatePattern = '.'yyyy-MM-dd 
log4j.appender.file.layout = org.apache.log4j.PatternLayout 
log4j.appender.file.layout.ConversionPattern = %d{ABSOLUTE} [%t] %-5p %m%n 

Ví dụ khởi động này theo mặc định ghi ở mức TRACE. Bạn có thể thay đổi nó để DEBUG hoặc INFO như vậy:

# Set root logger level and appender name. 
log4j.rootLogger = INFO, console 

này ví dụ cũng theo mặc định sử dụng giao diện điều khiển appender. Nó sẽ đăng nhập vào đầu ra tiêu chuẩn vì nó được cấu hình bởi Tomcat theo vùng đất mặc định trong tệp /logs/localhost.yyyy-MM-dd.log.

Bạn tuy nhiên có thể thay đổi nó để sử dụng các tập tin appender như vậy:

# Set root logger level and appender name. 
log4j.rootLogger = INFO, file 

Các thiết lập ConversionPattern có thể tìm thấy chi tiết trong PatternLayout javadoc.

Hy vọng điều này sẽ giúp bạn bắt đầu.

+0

Cảm ơn thông tin. Việc ngắt kết nối chính tôi có trong sự hiểu biết làm thế nào để sử dụng Log4j là làm thế nào để sử dụng nó từ mã. Làm thế nào để sử dụng nó trong Servlet, trong đậu, trong POJO? Tôi có cần phải tạo một thể hiện Log4j, sau đó tìm và phân tích cú pháp các thuộc tính hoặc tệp XML? – Wilson

+0

Chỉ cần sử dụng 'Logger # getLogger()' và sau đó 'debug()', 'info()', v.v. Bạn không cần phải tìm và phân tích nó mọi lúc. Nếu nó nằm trong classpath, log4j sẽ làm điều đó. Nó thực sự là một vấn đề phổ biến trong số những người mới bắt đầu bởi vì họ không hiểu "classpath". – BalusC

+1

Cho biết những gì BalusC đã nói, [SLF4J] (http://www.slf4j.org/) + [Logback] (http://logback.qos.ch/) là cách hiện đại hơn để ghi nhật ký. Được tạo bởi người phát minh ra log4j và có nghĩa là người kế nhiệm của log4j. Xem [câu trả lời của tôi] (http://stackoverflow.com/a/19947417/642706) để [một câu hỏi tương tự] (http://stackoverflow.com/questions/19933036/simplest-way-to-log-to-tomcat -catalina-out/19947417 # 19947417) để biết thêm thông tin. –

Các vấn đề liên quan