在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,因为我认为它是最可靠的。