美文网首页
Log4j在Java Web(Dynamic Web、Servl

Log4j在Java Web(Dynamic Web、Servl

作者: fnbj | 来源:发表于2019-03-14 22:29 被阅读0次

最近在做的一个项目是Servlet + Tomcat搭建的Dynamic Web,代码老旧,日志混乱,这里就记录一下如何在Dynamic Web中增加Log4j记录日志。

1 添加依赖包

首先,添加如下依赖包:
log4j-1.2.15.jar
slf4j-api-1.7.25.jar
slf4j-log4j12-1.7.25.jar
下载地址:https://pan.baidu.com/s/1Tkpv5XvUIWQf1Vb-Xr__Sg
提取密码:j9us

2 添加配置文件

/WEB-INF 文件夹下添加 log4j.properties文件,文件内容如下:

#注意rootLogger的级别
log4j.rootLogger=INFO,stdout,infofile
#控制台日志
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%d{ISO8601}][%p]%l: %m%n

#INFO级别日志
#每天形成一个日志
log4j.appender.infofile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.infofile.Append=true
#当前时间以前的日志为cmri_2019-03-08.log
log4j.appender.infofile.DatePattern='_'yyyy-MM-dd'.log'
#当前时间日志为cmri.log
log4j.appender.infofile.File=${catalina.home}/logs/cmri/cmri.log
log4j.appender.infofile.Threshold=INFO
log4j.appender.infofile.Encoding=UTF-8
log4j.appender.infofile.layout=org.apache.log4j.PatternLayout
#日志输出的格式,该格式为[时间][java类]代码行数:日志
log4j.appender.infofile.layout.ConversionPattern=[%d{ISO8601}][%p]%l: %m%n
 
#ERROR级别的日志
#log4j.appender.errorfile=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.errorfile.Append=true
#log4j.appender.errorfile.DatePattern='_'yyyy-MM-dd-HH-mm'.log'
#log4j.appender.errorfile.File=${catalina.base}/logs/cmri/error/cmri_error.log
#log4j.appender.errorfile.Threshold=ERROR
#log4j.appender.errorfile.Encoding=UTF-8
#log4j.appender.errorfile.layout=org.apache.log4j.PatternLayout
#log4j.appender.errorfile.layout.ConversionPattern=[%d{ISO8601}][%p]%l: %m%n

#DEBUG级别的日志
#log4j.appender.debugfile=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.debugfile.Append=true
#log4j.appender.debugfile.DatePattern='_'yyyy-MM-dd-HH-mm'.log'
#log4j.appender.debugfile.File=${catalina.base}/logs/cmri/debug/cmri_debug.log
#log4j.appender.debugfile.Threshold=DEBUG
#log4j.appender.debugfile.Encoding=UTF-8
#log4j.appender.debugfile.layout=org.apache.log4j.PatternLayout
#log4j.appender.debugfile.layout.ConversionPattern=[%d{ISO8601}][%p]%l: %m%n

可以设置多种级别的日志,分别记录到不同的日志文件中去。
Log4j根据日志信息的重要程度,分为不同的级别:OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL。官方建议实际使用时只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG。
上面我们指定INFO后DEBUG级别的日志就不再输出了。
这样可以对日志进行分级输出,例如:在测试环境中输出DEBUG级别的日志,在正式环境中不再输出DEBUG级别日志,只记录必要的信息。

3 添加log4j启动类

写一个log4j的启动类,代码如下:

package cm.kcloud.servlet;

import java.io.File;  
import java.io.IOException;  
 
import javax.servlet.ServletConfig;  
import javax.servlet.ServletContext;  
import javax.servlet.ServletException;  
import javax.servlet.annotation.WebServlet;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
 
import org.apache.log4j.BasicConfigurator;  
import org.apache.log4j.PropertyConfigurator;  

@WebServlet("/Log4JInitServlet") 
public class Log4JInitServlet extends HttpServlet {
    
    private static final long serialVersionUID = 1L;  
     
    /** 
     * @see HttpServlet#HttpServlet() 
     */  
    public Log4JInitServlet() {  
        super();  
        // TODO Auto-generated constructor stub  
    }  
 
    /** 
     * @see Servlet#init(ServletConfig) 
     */  
    public void init(ServletConfig config) throws ServletException {  
        System.out.println("Log4JInitServlet 正在初始化 log4j日志设置信息");  
        String log4jLocation = config.getInitParameter("log4j-properties-location");  
 
        ServletContext sc = config.getServletContext();  
 
        if (log4jLocation == null) {  
            System.err.println("*** 没有 log4j-properties-location 初始化的文件, 所以使用 BasicConfigurator初始化");  
            BasicConfigurator.configure();  
        } else {  
            String webAppPath = sc.getRealPath("/");  
            String log4jProp = webAppPath + log4jLocation;  
            File yoMamaYesThisSaysYoMama = new File(log4jProp);  
            if (yoMamaYesThisSaysYoMama.exists()) {  
                System.out.println("使用: " + log4jProp+"初始化日志设置信息");  
                PropertyConfigurator.configure(log4jProp);  
            } else {  
                System.err.println("*** " + log4jProp + " 文件没有找到, 所以使用 BasicConfigurator初始化");  
                BasicConfigurator.configure();  
            }  
        }  
        super.init(config);  
    }  
 
    /** 
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
     */  
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
        // TODO Auto-generated method stub  
    }  
 
    /** 
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
     */  
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
        // TODO Auto-generated method stub  
    }  

}

4 配置web.xml

/WEB_INF/web.xml文件中添加如下配置:

<!--用来启动 log4jConfigLocation的servlet -->  
<servlet>  
    <servlet-name>Log4JInitServlet</servlet-name>  
        <servlet-class>cm.kcloud.servlet.Log4JInitServlet</servlet-class>  
        <init-param>  
            <param-name>log4j-properties-location</param-name>  
            <param-value>/WEB-INF/log4j.properties</param-value>  
        </init-param>  
    <load-on-startup>0</load-on-startup>  
</servlet>

其中,<load-on-startup></load-on-startup>标签表示启动加载的顺序,0表示最先加载。

5 添加测试类

5.1 添加测试类,以测试log4j是否启用,代码如下:

package cm.kcloud.servlet;

import java.io.IOException;  
 
import javax.servlet.ServletConfig;  
import javax.servlet.ServletException;  
import javax.servlet.annotation.WebServlet;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
 
import org.apache.log4j.Logger; 

@WebServlet("/Log4JTestServlet")
public class Log4JTestServlet extends HttpServlet{
    private static final long serialVersionUID = 1L;  
    private static final Logger logger = Logger.getLogger(Log4JTestServlet.class);    
 
    /** 
     * @see HttpServlet#HttpServlet() 
     */  
    public Log4JTestServlet() {  
        super();  
        // TODO Auto-generated constructor stub  
    }  
 
    /** 
     * @see Servlet#init(ServletConfig) 
     */  
    public void init(ServletConfig config) throws ServletException {  
        // TODO Auto-generated method stub  
    }  
 
    /** 
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
     */  
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
        // 记录debug级别的信息    
        logger.debug("This is debug message.");    
        // 记录info级别的信息    
        logger.info("这是 info message.");    
        // 记录error级别的信息    
        logger.error("This is error message.");    
    }  
 
    /** 
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
     */  
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
        doGet(request,response);  
    }  

}

5.2 配置web.xml

将测试Servlet也配置到web.xml文件中,代码如下:

<servlet>  
    <servlet-name>Log4JTestServlet</servlet-name>  
    <servlet-class>cm.kcloud.servlet.Log4JTestServlet</servlet-class>
</servlet> 
<servlet-mapping>  
    <servlet-name>Log4JTestServlet</servlet-name>  
    <url-pattern>/log4j</url-pattern>  
</servlet-mapping>

6 测试

启动项目后,在浏览器访问测试Servlet设置的url地址,如:http://localhost:8080/CMRI/log4j看日志是否被记录到相应的日志文件中。这里就不放截图了。

相关文章

网友评论

      本文标题:Log4j在Java Web(Dynamic Web、Servl

      本文链接:https://www.haomeiwen.com/subject/zvyhmqtx.html