log4j注意事项

   1.不应该大范围,跨多线程共用loger对象。

代码1-1public void callAppenders(LoggingEvent event)
{
     int writes = 0;

     for (Category c = this; c != null; c = parent)
     {
         synchronized (c) {
             if (aai != null) {
                 writes += aai.appendLoopOnAppenders(event);
             }
             if (!additive) {
                 break;
             }
         }
     }

     if (writes == 0) {
          repository.emitNoAppenderWarning(this);
     }
}
代码1-1截取自Logger对象的父类Category类。可以看到其使用logger对象作为锁,如果大范围跨线程使用相同logger对象会造成大范围阻塞。

2.如果使用同步日志也不应该大范围跨线程使用相同appender对象。

出于outputstream的write方法的锁的使用。
3.如果使用异步日志也不应该大范围跨线程使用相同的AsyncAppender对象。

代码1-2public void append(final LoggingEvent event) {
    //
    //   if dispatcher thread has died then
    //      append subsequent events synchronously
    //   See bug 23021
    if ((dispatcher == null) || !dispatcher.isAlive() || (bufferSize <= 0)) {
      synchronized (appenders) {
        appenders.appendLoopOnAppenders(event);
      }

      return;
    }

    // Set the NDC and thread name for the calling thread as these
    // LoggingEvent fields were not set at event creation time.
    event.getNDC();
    event.getThreadName();
    // Get a copy of this thread‘s MDC.
    event.getMDCCopy();
    if (locationInfo) {
      event.getLocationInformation();
    }

    synchronized (buffer) {
      while (true) {
        int previousSize = buffer.size();

        if (previousSize < bufferSize) {
          buffer.add(event);

          //
          //   if buffer had been empty
          //       signal all threads waiting on buffer
          //       to check their conditions.
          //
          if (previousSize == 0) {
            buffer.notifyAll();
          }

          break;
        }

        //
        //   Following code is only reachable if buffer is full
        //
        //
        //   if blocking and thread is not already interrupted
        //      and not the dispatcher then
        //      wait for a buffer notification
        boolean discard = true;
        if (blocking
                && !Thread.interrupted()
                && Thread.currentThread() != dispatcher) {
          try {
            buffer.wait();
            discard = false;
          } catch (InterruptedException e) {
            //
            //  reset interrupt status so
            //    calling code can see interrupt on
            //    their next wait or sleep.
            Thread.currentThread().interrupt();
          }
        }

        //
        //   if blocking is false or thread has been interrupted
        //   add event to discard map.
        //
        if (discard) {
          String loggerName = event.getLoggerName();
          DiscardSummary summary = (DiscardSummary) discardMap.get(loggerName);

          if (summary == null) {
            summary = new DiscardSummary(event);
            discardMap.put(loggerName, summary);
          } else {
            summary.add(event);
          }

          break;
        }
      }
    }
  }

代码1-2取自AsyncAppender,可以看到使用AsyncAppender对象的buffer作为锁。

 
 
时间: 2024-08-11 08:56:45

log4j注意事项的相关文章

大数据精英实战项目班-Hadoop-Spark-真实企业项目

2018最新最全大数据技术视频,项目视频.整套视频,非那种杂七杂八自己拼凑的,内容如下,需要的联系QQ:3164282908(加Q注明大数据) 更有海量大数据技术视频.大数据项目视频,机器学习深度学习技术视频.项目视频.Python编程视频.Oracle数据库视频.Java培训视频高级架构师视频等等等. ├----------01-大数据Java基础------------- │├java第01天 ││├java第01天-01.类型转换.avi ││├java第01天-02.归档分析与实现.av

《深入理解mybatis原理》 MyBatis的一级缓存实现详解 及使用注意事项

0.写在前面 MyBatis是一个简单,小巧但功能非常强大的ORM开源框架,它的功能强大也体现在它的缓存机制上.MyBatis提供了一级缓存.二级缓存 这两个缓存机制,能够很好地处理和维护缓存,以提高系统的性能.本文的目的则是向读者详细介绍MyBatis的一级缓存,深入源码,解析MyBatis一级缓存的实现原理,并且针对一级缓存的特点提出了在实际使用过程中应该注意的事项. 读完本文,你将会学到: 1.什么是一级缓存?为什么使用一级缓存? 2.MyBatis的一级缓存是怎样组织的?(即SqlSes

服务器程序注意事项

1. 在服务器程序时,很容易出现内存泄露.以及内存溢出等问题. 出现这些问题往往会导致程序无法正常运行,比如异常退出.阻塞.然而,在发生这些错误的时候往往会令人很困惑,因为这些错误很难被发现.解决这些问题往往会耗费大量的时间.因而保持良好的代码习惯对一个程序的健壮性具有重要的意义,也是一个优秀的程序员所应该具备的素质. 2. 服务端程序往往是部署在Unix等服务器之上的,并且需要长久的运行. 在这种情况下,很多时候对程序的调试都是比较不方便的.所以,保留日志等将为我们的后期的Debug提供很大的

如何正确使用log4j

如何正确使用log4j? 关键字: 如何正确使用log4j? Java Web开发的过程中,通过会采用输出log的方式来进行调试,产品上线之后,也通常使用log来记录系统的运行状态.最简单的输出log的方式就是使用System.out.println(String msg)和System.err.println(String msg),然而这种方式的弊端是显而易见的,例如: 1. 调试期输出log的代码,在上线运行前需要注释掉,否则可能会影响系统性能或者造成日志文件过于庞大.当出现问题需要跟踪的

java中开源日志记录工具log4j

日志:除了能记录异常信息,还可以记录程序正常运行时的关键信息. 使用log4j来进行日志文件记录经典步骤: 001.在项目中创建一个lib文件夹,然后将下载好的jar包copy到该文件夹下 002.对已经copy过来的jar包,点击右键,然后执行下图操作, 项目中就会多出一个引入外部Library的项目 003.在src目录下创建一个名称为log4j.properties文件 004.编写,粘贴已经写好的配置文件内容,编码方式可以做下修正.对配置文件点击右键→属性→other→utf-8,然后应

开源日志技术log4j

老师的总结: 日志:除了能记录异常信息,还可以记录程序正常运行时的关键信息. 使用log4j来进行日志文件记录经典步骤: 001.在项目中创建一个lib文件夹,然后将下载好的jar包copy到该文件夹下 002.对已经copy过来的jar包,点击右键,然后执行下图操作, 项目中就会多出一个引入外部Library的项目 003.在src目录下创建一个名称为log4j.properties文件 004.编写,粘贴已经写好的配置文件内容,编码方式可以做下修正.对配置文件点击右键→属性→other→ut

java项目测试log4j

.literal { background-color: #f2f2f2; border: 1px solid #cccccc; padding: 1px 3px 0; white-space: nowrap; color: #6d180b; font-family: Consolas, "Liberation Mono", Courier, monospace; font-size: 16px } 一.基础入门 1.1 下载安装 下载相应的log4j-1.2.15.jar(也可以下载

Log4j 2 介绍

本文为转载学习 英文原文:Apache.org,编译:ImportNew -滕开选 译文连接:http://www.importnew.com/3046.html 关于Log4j 2  Log4j 2 是Log4j的升级版,与之前的版本Log4j 1.x相比.有重大的改进,在修正了Logback固有的架构问题的同时,改进了许多Logback所具有的功能.Log4j 2的特性以及改进有: API分离:Log4j将API与实现分离开来.开发人员现在可以很清楚地知道能够使用哪些没有兼容问题的类和方法,

log4j 入门和详解

log4j  入门. 详解 转自雪飘寒的文章 1. Log4j  简介 在应用程序中添加日志记录总的来说基于三 个目的:    监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作:    跟踪代码运行时轨迹,作为日后审计的依据:    担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息.    最普通的做法就是在代码中嵌入许多的打印语句,这些打印语句可以输出到控制台或文件中,比较好的做法就    是构造一个日志操作类来封装此类操作,而不是让一系列的打印语句充