Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在jsp页面中使用log4j的正确方法是什么_Java_Jsp_Log4j - Fatal编程技术网

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

Java 在jsp页面中使用log4j的正确方法是什么,java,jsp,log4j,Java,Jsp,Log4j,我的意思是,我想让记录器名称反映source.jsp文件,不管它是包含在另一个文件中还是编译成类或其他什么。所有配置文件的位置和配置与在Servlet或其他类中的使用方式相同 <%@ page import="org.apache.log4j.Logger" %> <html> <head> <title>Demonstration log4j usage in jsp</title> </head

我的意思是,我想让记录器名称反映source.jsp文件,不管它是包含在另一个文件中还是编译成类或其他什么。所有配置文件的位置和配置与在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>

演示log4j在jsp中的用法
日志消息显示在Tomcat控制台和${catalina.home}/logs/demo.log文件中。

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

public static Logger getLogger(HttpServletRequest request) {
    String requestUri = request.getRequestURI();
    String jspName = requestUri.substring(requestUri.lastIndexOf('/'));
    return Logger.getLogger(jspName);
}
您可能需要对它进行一些操作才能使其工作(我还没有测试上面的代码),但这就是它的要点

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

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

%d [%C] %-5p %c - %m%n
在这里,当您调用任何记录器类方法时,%C输出完全限定的类名。

有什么问题:

Logger logger = Logger.getLogger( "source.jsp" );
当然,您可以在它前面加一个更好的无歧义前缀。实际上,类似于
JSPS.source.jsp
的方法更好,因为您可以为
JSPS
logger设置日志规则,该规则稍后将应用于所有子记录器


既然如此,为什么您需要直接从JSP登录?

首先,导入所需的包,即

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

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

因为您可能希望在log4net中输出jsp el变量的内容,所以可以使用以下代码

<%@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")); %> 

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

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

Logger log = Logger.getLogger("for_example_jsp");
Logger log = Logger.getLogger(this.getClass());
String __jspName = this.getClass().getSimpleName(); // Get jsp program name
Logger log = Logger.getLogger(__jspName);
__jspName = __jspName.replaceAll("_","."); // get back true jsp file name
(注意:经常出现的错误是直接使用'for_example.jsp',它将被视为类名,然后当AP服务器(比如Tomcat)发现没有这样的类路径时,它将在catalina.out中输出日志消息作为“…(jsp)…”

2.使用请求URI

Logger log = Logger.getLogger(request.getRequestURI());
有人喜欢这样,我不知道为什么,但我以前在别人的密码里见过

3.使用类名

Logger log = Logger.getLogger("for_example_jsp");
Logger log = Logger.getLogger(this.getClass());
String __jspName = this.getClass().getSimpleName(); // Get jsp program name
Logger log = Logger.getLogger(__jspName);
__jspName = __jspName.replaceAll("_","."); // get back true jsp file name
这通常会得到“for_example_jsp”,除非for_example.jsp包含在其他servlet中,比如“test_servlet”,它将是“include file's log name”+“一个有序的数字”,例如test_servlet_include_005

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

Logger log = Logger.getLogger("for_example_jsp");
Logger log = Logger.getLogger(this.getClass());
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,因为我认为它是最可靠的。

这不是我想要的,因为请求url和.jsp页面之间的关系不是很紧密,特别是如果您使用spring mvc之类的框架,而不仅仅是。不,如果您正在执行jsp,那么请求的requestUri属性将由jsp的url而不是到达容器的原始URL。请记住,请求是从servlet转发到JSP的,这会产生一个新的请求。它是有效的,相信我,我自己也使用这种技术。应该是这样的:这非常有效。我想指出,类名的
\u JSP
部分对于查找类是必不可少的。我喜欢having JSP记录它们的类名!不使用Scriptlet如何?直接从JSP记录有什么问题?最好的做法是什么?在Tomcat中,上面的语句在日志文件中只输出'JSP',而不是'source.JSP'。您至少必须使用'source_JSP'或this.getClass()。