1. 程式人生 > 實用技巧 >webpack效能優化策略集錦

webpack效能優化策略集錦

技術標籤:javalinux

轉載至:https://www.cnblogs.com/fanblogs/p/13501978.html

目的:

區分每個請求使用者,更好的跟蹤分析問題(使用者登入之後加上userId更佳)

在進行多執行緒程式設計時,經常會在除錯資訊中看到執行緒的處理流程,需要在日誌中體現當前執行緒資訊。因Java中的執行緒名稱採用了預設的“Thread-1”等字串,定位不方便。

分析:

在JDK1.5開始對Thread類加入了getId()方法,即每個執行緒都有一個唯一的數字來代替。

在記錄日誌時,是否可以通過記錄執行緒ID來提升日誌執行緒資訊的清晰度?

解決:

Log4j預設只提供了對執行緒名稱的現實,即使用佔位符%t來顯示名稱。

如果需要顯示執行緒ID,需要拓展log4j。

1.拓展Log4j的PatternParser

程式碼:

複製程式碼
package org.apache.log4j;

import org.apache.log4j.helpers.FormattingInfo;
import org.apache.log4j.helpers.PatternConverter;
import org.apache.log4j.helpers.PatternParser;
import org.apache.log4j.spi.LoggingEvent;

public class ExPatternParser extends PatternParser {

 public ExPatternParser(String pattern) {
   super(pattern);
  }
 
 /**
   * 重寫finalizeConverter,對特定的佔位符進行處理,T表示執行緒ID佔位符
   */
  @Override
  protected void finalizeConverter(char c) {
   if (c == 'T') {
    this.addConverter(new ExPatternConverter(this.formattingInfo));
   } else {
    super.finalizeConverter(c);
   }
  }
 
 private static class ExPatternConverter extends PatternConverter {
 
  public ExPatternConverter(FormattingInfo fi) {
    super(fi);
   }
 
  /**
    * 當需要顯示執行緒ID的時候,返回當前呼叫執行緒的ID
    */
   @Override
   protected String convert(LoggingEvent event) {
    return String.valueOf(Thread.currentThread().getId());
   }
}

}
複製程式碼

2.拓展PatternLayout類,使用拓展的ExPatternParser類

程式碼:

複製程式碼
package org.apache.log4j;

import org.apache.log4j.PatternLayout;
import org.apache.log4j.helpers.PatternParser;

public class ExPatternLayout extends PatternLayout {

 public ExPatternLayout(String pattern) {
   super(pattern);
  }
 
 public ExPatternLayout() {
   super();
  }
  
  /**
   * 重寫createPatternParser方法,返回PatternParser的子類
   */
  @Override
  protected PatternParser createPatternParser(String pattern) {
   return new ExPatternParser(pattern);
  }
 }

複製程式碼
3.修改Log4j的配置檔案,將輸出樣式修改為拓展類ExPatternLayout

#設定輸出樣式
log4j.appender.appender1.layout=org.apache.log4j.ExPatternLayout
到此已經擴充套件完成,將以上內容編譯後(可以打成jar包)和log4j.jar一同使用(使用同一個類裝載器裝載),然後配置log4j.properties類,修改

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout


log4j.appender.stdout.layout=ex.log4j.ExPatternLayout

在輸出格式中增加%T(log4j定義%t表示執行緒名稱,%T沒有定義,所以這裡使用%T表示執行緒ID),

log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %T %c %5p - %m%n

下面就按照平常的習慣使用log4j即可,再輸出的日誌中就會包含執行緒ID,例如:

2009-03-29 10:43:58 1 test.log.Log4jTest INFO - ok

時間後面的’1’就表示執行緒id,當在多執行緒環境下,例如web環境,用這種方式就能很容易區分出一次web請求過程中打印出的日誌資訊,而不會和其他web請求打印出的日誌資訊混淆。這樣即增加的日誌的可讀性,也不會輸出太多的無用資訊。

例子:

log4j.appender.console.layout.ConversionPattern=[%d{HH:mm:ss.SSS}] [%-3p] %x %c{1}: %m%n

[11:03:36.656] [INFO] [<T=U0Lg2h5HdGqMpvaS,U=9709677>] CommonWebFilter: >>>>>>> Completed request[/omm/http/pss/text][360.86ms].