`
duan10jun
  • 浏览: 22366 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

log4j记录登陆用户相关操作

    博客分类:
  • java
 
阅读更多

1、web.xml中添加过滤器

	<!-- LoggerMDCFilter,存放在MDC中的数据,log4j可以直接引用并作为日志信息打印出来. -->
	<filter>
		<filter-name>LoggerMDCFilter</filter-name>
		<filter-class>javacommon.filter.LoggerMDCFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>LoggerMDCFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

 2、编写过滤器类

package javacommon.filter;

import java.io.IOException;
import java.util.Map;
import java.util.UUID;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.MDC;
import org.springframework.web.filter.OncePerRequestFilter;

import com.winksi.mis.util.Const;

import sun.reflect.ReflectionFactory.GetReflectionFactoryAction;
/**
 * 存放在MDC中的数据,log4j可以直接引用并作为日志信息打印出来.
 * 
 * <pre>
 * 示例使用:
 * log4j.appender.stdout.layout.conversionPattern=%d [%X{loginUserId}/%X{req.remoteAddr}/%X{req.id} - %X{req.requestURI}?%X{req.queryString}] %-5p %c{2} - %m%n
 * </pre>
 * @author badqiu
 */
public class LoggerMDCFilter extends OncePerRequestFilter implements Filter{
    
    protected void doFilterInternal(HttpServletRequest request,HttpServletResponse response, FilterChain chain)throws ServletException,IOException {
        try {
            //示例为一个固定的登陆用户,请直接修改代码
        	if(request.getSession(false) != null){
//        		String loginUserName = (String)request.getSession(false).getAttribute(Const.SESSION_LOGIN_NAME);
        		String loginUserId = (String)request.getSession(false).getAttribute(Const.SESSION_LOGIN_ID);
        		if(loginUserId != null)
        			MDC.put("loginUserId", loginUserId);
        		else
        			MDC.put("loginUserId", "nouser");
        	}
            
            MDC.put("req.requestURI", StringUtils.defaultString(request.getRequestURI()));
            MDC.put("req.queryString", StringUtils.defaultString(request.getQueryString()));
            MDC.put("req.requestURIWithQueryString", request.getRequestURI() + (request.getQueryString() == null ? "" : "?"+request.getQueryString()));
            MDC.put("req.remoteAddr", StringUtils.defaultString(request.getRemoteAddr()));
            
            //为每一个请求创建一个ID,方便查找日志时可以根据ID查找出一个http请求所有相关日志
            MDC.put("req.id", StringUtils.remove(UUID.randomUUID().toString(),"-")); 
            chain.doFilter(request, response);
        }finally {
            clearMDC();
        }
    }

    private void clearMDC() {
        Map map = MDC.getContext();
        if(map != null) {
            map.clear();
        }
    }
}

 

2-1编辑log4j.properties

# This is the configuring for logging displayed in the Application Server
#log4j.rootCategory=INFO, stdout,project-dao,project-web,project-service
log4j.rootLogger=INFO, common-all, stdout
log4j.logger.custmis=INFO, project-dao
#log4j.rootCategory=DEBUG,INFO, stdout,common-all,common-warn,common-error
################################
# common appenders
################################
#stdout configure
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#log4j.appender.stdout.layout.conversionPattern= %d [%X{loginUserId}/%X{req.remoteAddr}/%X{req.id} - %X{entranceMethod} - %X{req.requestURIWithQueryString}] %-5p %c - %m%n
log4j.appender.stdout.layout.conversionPattern= %d [%X{loginUserId} - %X{entranceMethod} - %X{req.requestURIWithQueryString}] %-5p %c - %m%n

#common-all file appender
log4j.appender.common-all=org.apache.log4j.DailyRollingFileAppender
log4j.appender.common-all.file=${user.home}/logs/damon_common-all.log
log4j.appender.common-all.layout=org.apache.log4j.PatternLayout
log4j.appender.common-all.layout.conversionPattern= %d [%X{loginUserId}/%X{req.remoteAddr}/%X{req.id} - %X{entranceMethod} - %X{req.requestURIWithQueryString}] %-5p %c - %m%n

#common-warn file appender
log4j.appender.common-warn=org.apache.log4j.DailyRollingFileAppender
log4j.appender.common-warn.file=${user.home}/logs/common-warn.log
log4j.appender.common-warn.layout=org.apache.log4j.PatternLayout
log4j.appender.common-warn.threshold=WARN
log4j.appender.common-warn.layout.conversionPattern= %d [%X{loginUserId}/%X{req.remoteAddr}/%X{req.id} - %X{entranceMethod} - %X{req.requestURIWithQueryString}] %-5p %c - %m%n

 

3、输出到数据库

????

 

 

4、参考资料

如何使用log4j记录操作员的登录ID

在记录日志的时候,我们可能有这种需求,对于每个记录除了知道日志信息外,也要当前登录用户的信息。
可以这样解决:使用log4j的MDC

在web.xml加入 Filter:
<filter>
  <filter-name>set log4j MDC for log2userId</filter-name>
  <filter-class>UserFilter</filter-class>
  </filter>
  <filter-mapping>
  <filter-name>set log4j MDC for log2userId</filter-name>
  <url-pattern>/*</url-pattern>
  </filter-mapping>
UserFilter的代码如下:
import org.apache.log4j.Logger;

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 javax.servlet.http.HttpSession;

import org.apache.log4j.MDC;
import org.springside.bookstore.domain.Customer;

/**
 * 记录当前使用者的信息到log4j.MDC
 * @author frank
 * 
 */
public class UserFilter implements Filter {
    /**
     * Logger for this class
     */
    private static final Logger logger = Logger.getLogger(UserFilter.class);

    private final static String DEFAULT_USERID="anonymous";
 
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req=(HttpServletRequest)request;
        HttpSession session= req.getSession();
        if (session==null){
            MDC.put("userId",DEFAULT_USERID);  
        }
        else{
            Customer customer=(Customer)session.getAttribute("customer");
            if (customer==null){
                MDC.put("userId",DEFAULT_USERID);
            }
            else
            {
                MDC.put("userId",customer.getLoginid());
            }
        }
        logger.info("test for MDC.");
        
        chain.doFilter(request,response);
    }

    public void init(FilterConfig fc) throws ServletException {
        
        // do nothing
        
    }

    public void destroy() {
//         do nothing
    }
}
在log4j.properties中加入新配置,示例使用jdbc存储

log4j.appender.db=org.apache.log4j.jdbc.JDBCAppender
#log4j.appender.db.BufferSize=100
log4j.appender.db.URL=jdbc:ulr
log4j.appender.db.driver=org.hsqldb.jdbcDriver
log4j.appender.db.user=sa
log4j.appender.db.password=
log4j.appender.db.sql=INSERT INTO LOG4J_MSG (LOGINID,PRIORITY,LOGDATE,CLASS,METHOD,MSG) VALUES(‘%X{userId}’,’%p’,'%d{yyyy-MM-dd HH:mm:ss}’,'%C’,'%M’,'%m’)


%X{userId}:就是取出MDC的代码了

 

 

分享到:
评论

相关推荐

    log4net配置,日志纪录log4j的.NET版

    Log4net是Apache软件基金会开发的一个强大的日志框架,它是log4j(Java版本)在.NET平台上的移植,提供了一套全面的日志记录解决方案。本文将深入探讨log4net的配置及其在.NET应用中的使用。 **1. log4net简介** ...

    若依框架使用的log4j2.16.0,修复log4j漏洞log4j2下载最新log4j2.16.0下载

    在提供的压缩包文件列表中,"log4j2.16.0"可能包含了Log4j2库的更新JAR文件或其他相关资源。用户应当解压这个文件,然后根据项目的具体依赖管理方式,将新的JAR添加到若依框架的类路径中,或者更新Maven或Gradle的...

    老生常谈Log4j和Log4j2的区别(推荐)

    Log4j和Log4j2的区别 Log4j和Log4j2是两个常用的日志记录工具,它们都来自Apache开源项目。虽然它们都是日志记录工具,但是它们之间有很多区别。下面我们将从配置文件类型、核心JAR包、文件渲染和Log调用四个方面来...

    Log4j2简介及与Log4j效率对比

    10. **优化的并发支持**:Log4j2利用Java 5提供的并发特性,能够在较低级别上执行锁定操作,有效避免了Log4j 1.x中出现的死锁问题。 ### Log4j2与Log4j效率对比 #### 测试环境与方法 为了准确评估Log4j2与Log4j...

    logging-log4j2-log4j-2.15.0-rc2.zip maven 资源库

    针对Log4j 2 远程代码执行漏洞,需要用到的升级资源包,适用于maven资源库,包括log4j,log4j-core,log4j-api,log4j-1.2-api,log4j-jpa等全套2.15.0 maven资源库jar包。如果是maven本地仓库使用,需要将zip包解压...

    log4j.jar各个版本

    apache-log4j-1.2.15.jar, apache-log4j-extras-1.0.jar, apache-log4j-extras-1.1.jar, apache-log4j.jar, log4j-1.2-api-2.0.2-javadoc.jar, log4j-1.2-api-2.0.2-sources.jar, log4j-1.2-api-2.0.2.jar, log4j-...

    log4j-2.18.0

    然而,这次的2.0及以上版本的log4j2中发现的安全漏洞,使得恶意用户能够通过精心构造的输入,触发JNDI(Java Naming and Directory Interface)查找,进而执行任意远程代码。 Log4Shell漏洞的核心在于log4j2的...

    log4z的使用

    除了基础功能,`log4z`还提供了插件系统,允许用户自定义日志处理器,比如添加对云存储的支持,或者实现特殊格式的转换。 ### 结语 `log4z`是一个强大的C++日志库,它的灵活性和易用性使得它在各种项目中都能发挥...

    [简单]log4jdbc-log4j2配置简记

    log4jdbc是一个开源项目,它允许开发者通过日志系统来追踪数据库操作,而log4j2是log4j的升级版,提供了更强大的日志管理和性能优化功能。这篇简记可能是关于如何整合这两个工具以实现对数据库活动的透明化监控。 ...

    Log4j2学习用到的jar包及apache-log4j-2.19.0-bin.zip

    分别有disruptor-3.3.4.jar(Log4j2异步日志的底层实现)、log4j-api-2.19.0.jar(log4j门面)、log4j-core-2.19.0.jar(log4j实现)、log4j-slf4j-impl-2.19.0.jar(SLF4J与Log4j绑定)、slf4j-api-1.7.30.jar(SLF...

    使用Log4j进行日志操作

    ### 使用Log4j进行日志操作 #### 一、Log4j简介与核心特性 Log4j是一款由Apache开发的开源日志框架,它为Java应用程序提供了强大的日志记录功能。借助于Log4j,开发者可以轻松控制日志信息的流向(如控制台、文件...

    Log4j2、Fastjson、Log4j的BurpSuite插件亲测有效

    在进行安全测试时,首先要理解Log4j和Log4j2的配置以及它们如何处理用户输入。例如,Log4j2的Lookup功能如果未正确配置,可能会导致恶意输入触发远程代码执行。对于Fastjson,需要注意其反序列化过程中的安全问题,...

    log4net-2.0.8-src_log4net源代码_log4net_

    - 插件架构:log4net的输出目标(Appenders)和布局(Layouts)都是可扩展的,用户可以根据需求定制自己的实现。 2. **主要组件** - **Logger**:这是log4net的核心类,负责接收和记录日志事件。每个Logger可以有...

    log4j + slf4j-api + slf4j-log4j12

    在给定的标题和描述中,我们看到了两个关键的日志框架——`log4j`和`SLF4J(Simple Logging Facade for Java)`,以及它们之间的桥接器`slf4j-log4j12`。这些组件是Java日志处理的常用工具,让我们详细了解一下它们...

    log4j-api-2.12.4.ja和log4j-core-2.12.4.jar

    Log4j是Java编程语言中最常用的日志记录框架之一,由Apache软件基金会开发。它提供了灵活的日志记录功能,使得开发者能够轻松地控制日志信息的输出格式、输出位置以及输出级别。此次提及的`log4j-api-2.12.4.jar`和`...

    C++ Log4z日志打印库

    3. **性能优化**: Log4z提供了缓冲机制,当大量日志短时间内生成时,可以减少磁盘I/O操作,提高性能。 4. **异步模式**: 可以开启异步模式,将日志写入操作放到后台线程执行,避免阻塞主线程。 5. **插件扩展**: ...

    log4j所依赖jar包

    Log4j提供了一个丰富的API,允许用户定制日志记录行为,从而满足不同项目的需求。 标题"Log4j所依赖jar包"指的是这个压缩文件包含了一系列Log4j运行所需的Java类库(JAR文件)。这些JAR文件通常包含了Log4j的核心...

    log4j-API-最新稳定版本log4j-1.2.17

    9. **性能**:Log4j API设计得非常高效,只有在日志级别匹配时才会执行实际的日志记录操作,避免了不必要的计算和I/O操作。 10. **可扩展性**:Log4j API允许开发者通过插件机制轻松添加新的appender、filter和...

    WPF调用log4.net示例

    在.NET框架下,Windows Presentation Foundation(WPF)是一种强大的用户界面开发平台,它允许开发者创建美观且功能丰富的桌面应用程序。而log4net是Apache软件基金会的一个开源项目,它为.NET应用程序提供了一种...

    使用log4net进行操作记录

    Log4net是.NET Framework下的一款强大、灵活的日志记录工具,类似于Java中的log4j,它提供了丰富的配置选项和多种输出方式,使得在C#等.NET语言中实现操作记录变得极其便利。 首先,我们需要理解log4net的核心概念...

Global site tag (gtag.js) - Google Analytics