精华内容
下载资源
问答
  • LOG4J2 mdc配置

    2014-12-17 17:13:27
    LOG4J2的生产环境配置配置案例: 4.日志滚动,避免单个日志过大,可以按小时进行日志分割. <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{MM-dd-yyyy}.log.gz" ignoreExceptions=...
  • LOG4J2MDC应用 MDC的概念:Manufacturing Data Collection 生产数据实时采集和分析。 有时实际开发过程没有发现的BUG在生产环境才出现,需要到生产环境去分析实时日志来进行BUG跟踪; LOG4J2提供了MDC功能可以将...
  • log4jMDC

    2014-07-28 10:17:05
    org.apache.log4j  ...java.lang.Object org.apache.log4j.MDC public class MDC extends java.lang.Object The MDC class is similar to the NDC class except that it is based on a map inste

    org.apache.log4j 
    Class MDC

    java.lang.Object  extended by org.apache.log4j.MDC

    public class MDC
    extends java.lang.Object

    The MDC class is similar to the NDC class except that it is based on a map instead of a stack. It provides mapped diagnostic contexts. A Mapped Diagnostic Context, or MDC in short, is an instrument for distinguishing interleaved log output from different sources. Log output is typically interleaved when a server handles multiple clients near-simultaneously.

    The MDC is managed on a per thread basis. A child thread automatically inherits a copy of the mapped diagnostic context of its parent.

    The MDC class requires JDK 1.2 or above. Under JDK 1.1 the MDC will always return empty values but otherwise will not affect or harm your application.

     

     

    Since:
    1.2



    NDC和MDC

    NDC(Nested Diagnostic Context)和MDC(Mapped Diagnostic Context)是log4j种非常有用的两个类,它们用于存储应用程序的上下文信息(context infomation),从而便于在log中使用这些上下文信息。

     

    NDC采用了一个类似栈的机制来push和pop上下文信息,每一个线程都独立地储存上下文信息。比如说一个servlet就可以针对每一个request创建对应的NDC,储存客户端地址等等信息。

    当使用的时候,我们要尽可能确保在进入一个context的时候,把相关的信息使用NDC.push(message);在离开这个context的时候使用NDC.pop()将信息删除。另外由于设计上的一些问题,还需要保证在当前thread结束的时候使用NDC.remove()清除内存,否则会产生内存泄漏的问题。

    存储了上下文信息之后,我们就可以在log的时候将信息输出。在相应的PatternLayout中使用”%x”来输出存储的上下文信息,下面是一个PatternLayout的例子:

    %r [%t] %-5p %c{2} %x - %m%n

    使用NDC最重要的好处就是,当我们想输出一些上下文的信息的时候,不需要让logger去寻找这些信息,而只需要在适当的位置进行存储,然后再配置文件中修改PatternLayout。在最新的log4j 1.3版本中增加了一个org.apache.log4j.filters.NDCMatchFilter,用来

    根据NDC中存储的信息接受或拒绝一条log信息。

     

    MDC和NDC非常相似,所不同的是MDC内部使用了类似map的机制来存储信息,上下文信息也是每个线程独立地储存,所不同的是信息都是以它们的key值存储在”map”中。相对应的方法,MDC.put(key, value); MDC.remove(key); MDC.get(key); 在配置PatternLayout的时候使用:%x{key}来输出对应的value。同样地,MDC也有一个org.apache.log4j.filters.MDCMatchFilter。这里需要注意的一点,MDC是线程独立的,但是一个子线程会自动获得一个父线程MDC的copy。

    至于选择NDC还是MDC要看需要存储的上下文信息是堆栈式的还是key/value形式的。

     

    动态修改日志配置

    在开发过程中,我们经常会遇到修改log4j配置的情况,在这种情况下,频繁重启应用显然是不可接受的。幸好log4j提供了自动重新加载配置文件的能力,在配置文件修改后,便会自己重新加载配置。在1.2及以前的版本中DOMConfigurator和PropertyConfigurator都提供了configureAndWatch方法,对指定的配置文件进行监控,并且可以设置检查的间隔时间。


    展开全文
  • log4jMDC用法

    千次阅读 2018-10-11 17:43:14
    如何使用log4j记录操作员的登录ID 在记录日志的时候,我们可能有这种需求,对于每个记录除了知道日志信息外,也要当前登录用户的信息。...set log4j MDC for log2userId&lt;/filter-name&gt;  &lt...

    如何使用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>

     

    public class UserFilter implements Filter {
        
        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的代码了

    展开全文
  • spring boot 集成 log4j2MDC如何设置

    千次阅读 2019-07-09 10:19:10
    MDC改用ThreadContext,原文:org.apache.log4j.MDC and org.apache.log4j.NDC have been replaced by the Thread Context. import org.apache.commons.lang.StringUtils; import org.apache.logging.log4j....

    MDC改用ThreadContext,原文:org.apache.log4j.MDC and org.apache.log4j.NDC have been replaced by the Thread
    Context.

    
    import org.apache.commons.lang.StringUtils;
    import org.apache.logging.log4j.ThreadContext;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.context.event.*;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationEvent;
    import org.springframework.context.event.ContextClosedEvent;
    import org.springframework.context.event.GenericApplicationListener;
    import org.springframework.core.Ordered;
    import org.springframework.core.ResolvableType;
    import org.springframework.core.env.ConfigurableEnvironment;
    import org.springframework.core.env.MutablePropertySources;
    import org.springframework.core.env.PropertySource;
    
    /**
     * @author wsf 2019/7/9
     */
    public class ApplicationStartedEventListener implements GenericApplicationListener {
        private static final int DEFAULT_ORDER = Ordered.HIGHEST_PRECEDENCE + 10;
    
        private static Class<?>[] EVENT_TYPES = {ApplicationStartingEvent.class,
                ApplicationEnvironmentPreparedEvent.class, ApplicationPreparedEvent.class,
                ContextClosedEvent.class, ApplicationFailedEvent.class};
    
        private static Class<?>[] SOURCE_TYPES = {SpringApplication.class,
                ApplicationContext.class};
     
        @Override
        public void onApplicationEvent(ApplicationEvent event) {
            if (event instanceof ApplicationEnvironmentPreparedEvent) {
                ConfigurableEnvironment envi = ((ApplicationEnvironmentPreparedEvent) event).getEnvironment();
                MutablePropertySources mps = envi.getPropertySources();
    
                PropertySource<?> ps = mps.get("applicationConfig: [classpath:/application.yml]");
    
                if(ps != null && ps.containsProperty("spring.application.name")) {
                    String appName = (String) ps.getProperty("spring.application.name");
                    if (StringUtils.isNotBlank(appName)) {
                        ThreadContext.put("appName", appName);
                    }
                }
                String profile = envi.getActiveProfiles()[0];
                if (StringUtils.isNotBlank(profile)) {
                    ThreadContext.put("profile", profile);
                }
            }
        }
    
        @Override
        public int getOrder() {
            // 设置加载优先级,在日志之前加载
            return DEFAULT_ORDER;
        }
    
        @Override
        public boolean supportsEventType(ResolvableType resolvableType) {
            return isAssignableFrom(resolvableType.getRawClass(), EVENT_TYPES);
        }
    
        @Override
        public boolean supportsSourceType(Class<?> sourceType) {
            return isAssignableFrom(sourceType, SOURCE_TYPES);
        }
    
        private boolean isAssignableFrom(Class<?> type, Class<?>... supportedTypes) {
            if (type != null) {
                for (Class<?> supportedType : supportedTypes) {
                    if (supportedType.isAssignableFrom(type)) {
                        return true;
                    }
                }
            }
            return false;
        }
    }

     

    展开全文
  • Log4j NDC MDC

    2014-12-05 13:06:00
    NDC(Nested Diagnostic Context)和MDC(Mapped Diagnostic Context)是log4j种非常有用的两个类,它们用于存储应用程序的上下文信息(context infomation),从而便于在log中使用这些上下文信息。 NDC采用了一个...
          NDC(Nested Diagnostic Context)和MDC(Mapped Diagnostic Context)是log4j种非常有用的两个类,它们用于存储应用程序的上下文信息(context infomation),从而便于在log中使用这些上下文信息。
    NDC采用了一个类似栈的机制来push和pop上下文信息,每一个线程都独立地储存上下文信息。比如说一个servlet就可以针对每一个request创建对应的NDC,储存客户端地址等等信息。
          当使用的时候,我们要尽可能确保在进入一个context的时候,把相关的信息使用NDC.push(message);在离开这个context的时候使用NDC.pop()将信息删除。另外由于设计上的一些问题,还需要保证在当前thread结束的时候使用NDC.remove()清除内存,否则会产生内存泄漏的问题。
    存储了上下文信息之后,我们就可以在log的时候将信息输出。在相应的PatternLayout中使用”%x”来输出存储的上下文信息,下面是一个PatternLayout的例子:
          %r [%t] %-5p %c{2} %x - %m%n
    使用NDC最重要的好处就是,当我们想输出一些上下文的信息的时候,不需要让logger去寻找这些信息,而只需要在适当的位置进行存储,然后再配置文件中修改PatternLayout。在最新的log4j 1.3版本中增加了一个org.apache.log4j.filters.NDCMatchFilter,用来
    根据NDC中存储的信息接受或拒绝一条log信息。
          MDC和NDC非常相似,所不同的是MDC内部使用了类似map的机制来存储信息,上下文信息也是每个线程独立地储存,所不同的是信息都是以它们的key值存储在”map”中。相对应的方法,MDC.put(key, value); MDC.remove(key); MDC.get(key); 在配置PatternLayout的时候使用:%x{key}来输出对应的value。同样地,MDC也有一个org.apache.log4j.filters.MDCMatchFilter。这里需要注意的一点,MDC是线程独立的,但是一个子线程会自动获得一个父线程MDC的copy。
          至于选择NDC还是MDC要看需要存储的上下文信息是堆栈式的还是key/value形式的。
    动态修改日志配置
          在开发过程中,我们经常会遇到修改log4j配置的情况,在这种情况下,频繁重启应用显然是不可接受的。幸好log4j提供了自动重新加载配置文件的能力,在配置文件修改后,便会自己重新加载配置。在1.2及以前的版本中DOMConfigurator和PropertyConfigurator都提供了configureAndWatch方法,对指定的配置文件进行监控,并且可以设置检查的间隔时间。

    转载于:https://www.cnblogs.com/huangpeng1990/p/4364361.html

    展开全文
  • log4jMDC配合Spring-mvc进行日志追踪

    千次阅读 2018-08-17 10:42:01
    一个很简单的需求,上网查找资料考虑半天后,决定用log4jMDC进行请求追踪。(logback和slf4j也是支持MDC) 因为我们项目是Spring-mvc和mybatis搭建的,页面请求都是直接转发到我们的controller层,所以考虑使用...
  • 在分布式系统或者较为复杂的系统中,我们希望可以看到一个客户请求的处理过程所涉及到的所有子系统\模块的... slf4j/log4j支持MDC,可以实现同一请求的日志追踪功能。 基本思路是: 实现自定义Filter,在接...
  • log4j2中的MDC分析

    2021-07-30 10:12:59
    背景我们项目中使用的log4j2日志框架,在日志输出的时候,我们有个需求,需要将我们全局唯一的流程流水id打印到log4j的日志文件中。以前一直在用log4j2,也没有好好的了解下其中的原理,这次探索下。SLF4j我们都知道...
  • NDC(Nested Diagnostic Context)和MDC(Mapped Diagnostic Context)是log4j种非常有用的两个类,它们用于存储应用程序的上下文信息(context infomation),从而便于在log中使用这些上下文信息。NDC采用了一个...
  • MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 、logback及log4j2 提供的一种方便在多线程条件下记录日志的功能。MDC 可以看成是一个与当前线程绑定的哈希表,内部是基于threadLocal实现,可以往其中...
  • log4jMDC和NDC作用以及用途

    千次阅读 2018-04-09 15:57:58
    NDC和MDClog4j用于存储应用程序的上下文信息(context infomation),从而便于在log中使用这些上下文信息。NDC采用了一个类似栈的机制来push存储上下文信息,每一个线程都独立地储存上下文信息。比如说一个servlet...
  • org.apache.log4jMDC和NDC

    2012-06-04 14:42:50
    NDC(Nested Diagnostic Context)和MDC(Mapped Diagnostic Context)是log4j种非常有用的两个类,它们用于存储应用程序的上下文信息(context infomation),从而便于在log中使用这些上下文信息。 NDC采用...
  • 我们的主角,log4jMDC,NDC出来了   二、实现思路以及关键代码 1、用拦截器或者filter将所有代码的入口拦截住,且在拦截器的里面,业务方法执行之前,写如下代码:   Java
  • Log4jMDC和NDC用法

    2012-05-08 09:13:00
    NDC和MDCNDC(Nested Diagnostic Context)和MDC(Mapped Diagnostic Context)是log4j种非常有用的两个类,它们用于存储应用程序的上下文信息(context infomation),从而便于在log中使用这些上下文信息。...
  • log4j MDC NDC

    2015-11-22 14:31:46
    NDC(Nested Diagnostic Context)和MDC(Mapped Diagnostic Context)是log4j种非常有用的两个类,它们用于存储应用程序的上下文信息(context infomation),从而便于在log中使用这些上下文信息。NDC的实现是用...
  • Log4j MDC使用案例

    千次阅读 2017-08-29 11:23:38
    转自:... Log4j MDC使用案例   Java代码  import java.io.IOException;  import java.util.Map;  import java.util.UUID;  import javax.servlet.Filt
  • log4j2MDC应用配置

    万次阅读 2014-12-17 17:15:16
    MDC的概念:Manufacturing Data Collection 生产数据实时采集和...LOG4J2提供了MDC功能可以将特定用户的日志单独处理输出到特定的文件中。 配置关键字ThreadContext ,DynamicThresholdFilter  ,ThreadCon
  • LOG4JMDC、NDC(在log中输出参数信息)

    千次阅读 2014-09-23 17:25:25
    log4j用于存储上下文信息(context information)的两个重要的类NDC(Nested Diagnostic Context)和MDC(Mapped Diagnositc Context). NDC采用栈的机制push和pop上下文,每个进程有独立的上下文。 NDC.push(message); ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,908
精华内容 1,563
关键字:

log4j2mdc