在jsp页面中使用log4j的正确方法是什么

我的意思是,我希望记录器名称能够反映source.jsp文件,无论它是包含在另一个文件中还是编译成类或其他任何文件。

出了什么问题:

Logger logger = Logger.getLogger( "source.jsp" ); 

当然,您可以使用更好的非模糊前缀作为前缀。 实际上, JSPS.source.jsp东西更好,因为您可以为JSPS记录器设置日志记录规则,稍后将应用于所有子记录器。

话虽如此,为什么需要直接从JSP登录?

首先,导入所需的包即ie

 <%@page import="org.apache.log4j.Logger"%> 

然后,

  <%! static Logger logger = Logger.getLogger(jsppagename_jsp.class); %> 

根据您使用的服务器, jsppagename_jsp可能会更改。 然后,在jsp里面的任何地方使用:

 <% logger.info("This is test."); %> 

IDE可能会在logger对象的声明中显示错误消息。 但是,不用担心,像tomcat这样的服务器会直接在tomcat中自动创建每个jsp页面的相应servlet类。

您可以编写一个工厂方法,该方法将当前请求作为参数,并根据JSP名称获取Logger,如下所示:

 public static Logger getLogger(HttpServletRequest request) { String requestUri = request.getRequestURI(); String jspName = requestUri.substring(requestUri.lastIndexOf('/')); return Logger.getLogger(jspName); } 

您可能需要使用它来使其工作(我还没有测试上面的代码),但这是它的要点。

这可以直接从JSP使用,也可以从JSP使用的bean或标记类中使用,只要它可以访问请求对象即可。

以下是代码。 所有配置文件的放置和配置都与Servlet或其他类中的配置相同。

 <%@ page import="org.apache.log4j.Logger" %>   Demonstration log4j usage in jsp   <% Logger log = Logger.getLogger("com.mobilefish.demo.test"); log.debug("Show DEBUG message"); log.info("Show INFO message"); log.warn("Show WARN message"); log.error("Show ERROR message"); log.fatal("Show FATAL message"); %> The log messages are shown in the Tomcat console and in the ${catalina.home}/logs/demo.log file.   

配置log4j时使用适当的ConversionPattern ,例如:

 %d [%C] %-5p %c - %m%n 

这里,%C在调用任何Logger类方法时输出完全限定的类名。

由于您可能希望在log4net中输出jsp-el-variables的内容,因此您可以使用此代码

 <%@page import="org.apache.log4j.Logger"%> <%-- output of the jsp-el variables "orderID" and "orderDate" in log4j --%>  <% Logger.getLogger("jsp.order.orderconfirmation").info( pageContext.getAttribute("Parameter4Log4J")); %> 

虽然这是一个老问题,但我想提供一些选择。 假设jsp filename = for_example.jsp:

1.直接使用文件名,但用下划线替换dot

 Logger log = Logger.getLogger("for_example_jsp"); 

(注意:不断的错误是直接使用’for_example.jsp’,它将被视为类名,然后当AP服务器,例如Tomcat,找不到这样的类路径时,它将在catalina.out中输出日志消息为“.. 。(jsp)….“

2.使用请求URI

 Logger log = Logger.getLogger(request.getRequestURI()); 

有人喜欢这个。 我不知道为什么,但我之前在某人的代码中看过这个。

3.使用class级名称

 Logger log = Logger.getLogger(this.getClass()); 

这通常会得到’for_example_jsp’,除非for_example.jsp包含在其他一些servlet中,比如’test_servlet’,它将’包括文件的日志名’+’一个有序数字’,例如test_servlet_include_005。

4.以编程方式获取jsp文件名

 String __jspName = this.getClass().getSimpleName(); // Get jsp program name Logger log = Logger.getLogger(__jspName); __jspName = __jspName.replaceAll("_","."); // get back true jsp file name 

但是,对于您正在使用的AP服务器和版本,这不一定是正确的。

我个人使用方法1,因为我认为它是最可靠的。