Java 在jsp页面中使用log4j的正确方法是什么
我的意思是,我想让记录器名称反映source.jsp文件,不管它是包含在另一个文件中还是编译成类或其他什么。所有配置文件的位置和配置与在Servlet或其他类中的使用方式相同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
<%@ 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()。