Log4j简单配置

Log4j是一组强大的日志组件,在项目中时常需要用它提供一些信息,这两天学习了一下它的简单配置。

第一步,我们需要导入log4j-1.2.14.jar到lib目录下

第二步,在src下建立log4j.properties文件。添加如下内容

log4j.properties
log4j.rootLogger =INFO,stdout
log4j.logger.sedion=INFO,db
log4j.logger.W=WARN,W
log4j.logger.E=ERROR,E

#输出到控制台
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{ABSOLUTE} %5p %c{1}:%L - %m%n

#输出WARN级别日志
log4j.appender.W =org.apache.log4j.RollingFileAppender
log4j.appender.W.File =${catalina.home}/logs/Test/Test_W.log
log4j.appender.W.Append =true
log4j.appender.W.Threshold =WARN
log4j.appender.W.layout = org.apache.log4j.PatternLayout
log4j.appender.W.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

#输出ERROR级别日志
log4j.appender.E = org.apache.log4j.RollingFileAppender
log4j.appender.E.File = ${catalina.home}/logs/Test/Test_E.log
log4j.appender.E.Append = true
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern =%-d{yyyy-MM-dd HH\:mm\:ss}  [ %t\:%r ] - [ %p ]  %m%n
 
#######################
 
# JDBC Appender 
 
#######################
log4j.appender.db=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.db.BufferSize=1
log4j.appender.db.driver=com.mysql.jdbc.Driver
log4j.appender.db.URL=jdbc:mysql://localhost:3306/test
log4j.appender.db.user=root
log4j.appender.db.password=123
log4j.appender.db.sql=insert into operate_log(class,method,createtime,loglevel,logmsg,username) values ("%C","%M","%d{yyyy-MM-dd HH\:mm\:ss}","%p","%m","%X{username}")
log4j.appender.db.layout=org.apache.log4j.PatternLayout

新建一个数据库test和一张日志表operate_log。


 
可以看到数据库中有个username动态字段,所以我们要写个过滤器

package config.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.MDC;


public class Log4jFilter implements Filter
{
    private final static int DEDAULT_USERID = 0;
    public void destroy()
    {
       
    }

    public void doFilter(ServletRequest req, ServletResponse rep,
            FilterChain chain) throws IOException, ServletException
    {
        HttpServletRequest request = (HttpServletRequest)req;
        String username = request.getParameter("username");
       
        if(username == null)
        {
            MDC.put("username", DEDAULT_USERID);
        }
        else
        {                   
                System.out.println("登陆名--"+username);
                MDC.put("username", username);           
        }
       
       
        chain.doFilter(req, rep);
    }

    public void init(FilterConfig arg0) throws ServletException
    {
       
    }


}

然后需要在web.xml中进行log4j.properties和过滤器的配置.


复制代码
<!-- log4j配置 -->
    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>classpath:log4j.properties</param-value>
    </context-param>
 
    <listener>
      <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>
    <!-- 过滤器配置 -->
    <filter>
        <filter-name>LogResFilter</filter-name>
        <filter-class>config.filter.Log4jFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>LogResFilter</filter-name>
        <url-pattern>*.do</url-pattern>
    </filter-mapping>

第三步,至此我们配置已经全部完成,简单写个登陆来验证一下。

jsp页面很简单,代码便不列出来了.

写个登陆实现类.

package sedion.zhr.controller;

import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import sedion.zhr.beans.UserBean;
import sedion.zhr.service.iml.UserServiceIml;

@Controller
@RequestMapping("/action")
public class LoginController
{
   
    private static final Logger log_w= Logger.getLogger("W");
    private static final Logger log_e = Logger.getLogger("E");
    private Log logger = LogFactory.getLog(this.getClass()); 
   
    @Resource(name = "UserService")
    private UserServiceIml serviceIml;
 
    @RequestMapping("/login.do")
    public String login(UserBean bean,HttpServletRequest request,HttpServletResponse response) throws Exception
    {
       
        List<UserBean> beans = this.serviceIml.finduser(new String[]{bean.getUsername(),bean.getPassword()});
   
        if(!beans.isEmpty())
        {           
            log_w.warn("登陆成功--");
            logger.info("登陆成功");

            return "/index";
        }
        else
        {
            log_e.error("登陆失败--");           
            logger.error("登陆失败");
            return "/login";
        }
     
    }

}

将项目配置到tomcat上,启动项目.

可以看到在安装tomcat文件夹下的logs文件夹里面出现个Test文件夹,里面有两个文本,初始大小都是0kb.

然后我们各登陆成功,登陆失败一次。观察到控制台上输出



然后发现先前两个文本大小变为1kb,里面各有成功失败的信息。

打开数据库表里面多了两条数据。

测试成功。

最后记录一下log4j配置中相关属性

log4j日志常见输出级别有4级,由高到低依次是ERROR、WARN、INFO、DEBUG。

日志输出目的地

  •   org.apache.log4j.HTMLLayout(以HTML表格形式布局),
  • org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
  • org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
  • org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

打印参数

  •         %m  输出代码中指定的消息
  •   %p  输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL 
  •   %r  输出自应用启动到输出该log信息耗费的毫秒数 
  •   %c  输出所属的类目,通常就是所在类的全名 
  •   %t  输出产生该日志事件的线程名 
  •   %n   输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n” 
  •   %d  输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式
  •   %l   输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。

Log4j 的详细介绍请点这里
Log4j 的下载地址请点这里

猜你喜欢

转载自www.linuxidc.com/Linux/2016-05/131399.htm