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

时间:2009-10-20 14:17:59

标签: java jsp log4j

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

7 个答案:

答案 0 :(得分:17)

首先,输入所需的包,即

<%@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类。

答案 1 :(得分:7)

出了什么问题:

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

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

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

答案 2 :(得分:5)

您可以编写一个工厂方法,该方法将当前请求作为参数,并根据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或标记类中使用,只要它可以访问请求对象。

答案 3 :(得分:4)

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

<%@ page import="org.apache.log4j.Logger" %>
<html>
    <head>
        <title>Demonstration log4j usage in jsp</title>
    </head>
    <body>
        <% 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"); %>
        <b>The log messages are shown in the Tomcat console and in the ${catalina.home}/logs/demo.log file.</b>
    </body>
</html>

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:1)

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

<强> 1。直接使用文件名,但用下划线替换点

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

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

<强> 2。使用请求URI

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

有人喜欢这个。我不知道为什么,但我之前已经在某些人的代码中看到了这一点。

第3。使用班级名称

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

这通常会得到&#39; for_example_jsp&#34;除非for_example.jsp包含在其他一些servlet中,比如说&#39; test_servlet&#39;,它将包括文件的日志名称&#39; +&#39;一个有序号码&#39;,例如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,因为我认为它是最可靠的。

答案 6 :(得分:0)

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

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

<%-- output of the jsp-el variables "orderID" and "orderDate" in log4j --%>
<c:set var="Parameter4Log4J" value="orderID=${orderID} orderDate=${orderDate}" />
<% Logger.getLogger("jsp.order.orderconfirmation").info(
               pageContext.getAttribute("Parameter4Log4J")); %>