1. Java 버젼별 히스토리

http://en.wikipedia.org/wiki/Java_version_history

- Java5 (2004~2009)

- Java6 (2006~2013)

- Java7 (2011~ )

- Java8 (2014~ )

- Java9 (2016예정)

- Java10 (2018예정)



2. Java 버젼별 주요 기능
2.1 Java5 (Tiger)
- Generics
- Enhanced for Loop (foreach)
- Autoboxing/Unboxing
- Type-safe Enums
- Varargs
- Static Import
- Annotions (Metadata)
- Formatted IO
- Concurrent API (java.util.concurrent)
- Thread Priority Changes
- Garbage collection ergonomics
- StringBuilder class
- StringBuilder is almost always faster than StringBuffer
- StringBuffer unsynchronized version



2.2 Java6 (Mustang)
- JAX-WS (Web Services Client)
- javax.swing.GroupLayout
- Password prompting
- Free disk-space API
- Classpath wildcards
- Annotation processing done by javac
- Solaris Dynamic Tracing (DTrace) Support)
- jhat QQL (Jmap for heap dump)
- JConsole plugin API
- Monitoring and Management for the Java Platform
- OOME Handling
- Script Langauge Support
- JDBC 4.0 API


2.3 Java7 (Dolphin)
- Garbage-First Collector
- Java Programming Language
- Binary Literals
- Strings in switch Statements
- The try-with-resource Statement
- Catching Multiple Exception Types and Rethrowing Exceptions with Improved Type Checking
- Underscores in Numeric Literals
- Type Inference For Generic Instance Creation
- Improved Compiler Warnings and Errors When Using Non-Reifiable Formal Parameters with Varargs Methods
- NIO 2.0
- Fork-Join
- Dynamic Language Support
- JDBC 4.1 API


2.4 Java8 
- Remove the Permanent Generation
Small VM
Define a standard API for Base64 encoding and decoding
Provide stronger Password-Based-Encryption (PBE) algorithm implementations in the SunJCE provider
Parallel array sorting
Interface improvements (static method, defender methods)
Functional interfaces
Lambdas
Stream
New date/time
Generic type inference improvements
Nashorn JavaScript Engine


3. Java 버젼별 성능비교

http://geeknizer.com/java-7-whats-new-performance-benchmark-1-5-1-6-1-7/#ixzz1ezWIHUc8

- Java5 -> Java6 : 18% 성능향상

- Java6 -> Java7 : 46% 성능향상

- 낮을 수록 좋은 성능




http://www.optaplanner.org/blog/2014/03/20/HowMuchFasterIsJava8.html

- Java6 -> Java7 : 평균 16% 성능향상

- Java7 -> Java8 : 평균 1% 성능향상








Java8 Reference


저작자 표시 비영리 변경 금지
신고

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글이 없습니다.
secret

CountDownLatch 을 사용하면 멀티 쓰레드 사용시 모든 쓰레드 종료 시점을 알 수 있다.


간단한 예제 코드


private static AtomicInteger _nextInc = new AtomicInteger(

(new java.util.Random()).nextInt());



final List<Integer> list = Collections.synchronizedList(new ArrayList<Integer>());

final CountDownLatch latch = new CountDownLatch(10000);


for(int i = 0 ; i < 10000 ; i++) {

Thread thread = new Thread() {

public void run() {

list.add(_nextInc.getAndIncrement() & 0xFF);

latch.countDown();

}

};

thread.start();

}

try {

latch.await();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

Collections.sort(list);

for(int n : list) {

System.out.println(n);

}


 


저작자 표시 비영리 변경 금지
신고

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글이 없습니다.
secret

다운로드 주소

 

http://visualvm.java.net/download.html

 

 

저작자 표시
신고

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글이 없습니다.
secret

WEB Socket

프로그래밍/JAVA 2013.01.05 17:41
 
Ajax 가 비동기 방식으로 클라이언트 -> 서버 를 가능하게 하지만
서버 -> 클라이언트 즉, Poll방식은 구현이 쉽지 않았습니다.

 

예를들어 서버로 요청을 보내놓고 서버에서 이벤트가 있을때 응답을 주는
Ajax Long Polling이 하나의 방법이었습니다. 이런 방식을 통틀어 COMET이라고도 합니다.

 

소켓을 통해 웹에서 양방향 통신이 가능한 WebSocket이 HTML5 의 표준에 포함이 되었습니다.
하지만 현재 브라우저에서 지원되는 HTML5 웹소켓은 IE를 제외한 Chrome, Safari, Firefox,
Opera등에서 작동이 되고 있으며, 보안 이슈등이 있어서 아직은 시기상조라는 의견이 있으며,
대신에 최근에는 Socket.io (http://socket.io/) 란 자바스크립트 라이브러리를 통해
브라우저에 따라 Comet이나 Websocket 기술 중 가장 적합한 것을 사용하도록 할 수 있습니다.

 

아래에 좀 더 자세한 내용을 포함한 링크들 첨부합니다.

 

- WebSocket과 Socket.io
- Socket.IO 예제
추가로
트위터에 사용되는 Netty 라이브러리(https://netty.io/)를 사용하여 웹소켓을 구현한 서버와
HTML5 웹소켓방식의 클라이언트 html 페이지 샘플을 첨부합니다.
*WEB에서 영문 문자열을 서버로 보내면 대문자로 바꿔서 웹으로 전송하는 예제입니다.

 

WebSocketSample.zip

 

저작자 표시
신고

'프로그래밍 > JAVA' 카테고리의 다른 글

자바 리소스 모니터링 툴 (VisualVM)  (0) 2013.03.09
WEB Socket  (0) 2013.01.05
JAVA NIO 방식으로 File 읽기  (0) 2013.01.04
Tika 소개 - 유용한 Parser 라이브러리  (1) 2012.12.14

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글이 없습니다.
secret

import java.io.FileInputStream;
import java.io.IOException;
import java.nio.CharBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.util.Scanner;

public class NIOFileReaderTest
{
 @SuppressWarnings("resource")
 public static void main(String[] args)
 {
  String fileName = "input.txt";
  
  FileChannel channel = null;
  MappedByteBuffer byteBuffer = null;
  Scanner scanner = null;
  
  try
  {
   channel = new FileInputStream(fileName).getChannel();
   byteBuffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
   CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder();
   CharBuffer charBuffer = decoder.decode(byteBuffer);
   scanner = new Scanner(charBuffer).useDelimiter("\n");
   
   while(scanner.hasNext())
   {
    System.out.println(scanner.next());
   }
  }
  catch(IOException e)
  {
   e.printStackTrace();
  }
  finally
  {
   try
   {
    if(scanner != null) scanner.close();
    if(channel != null) channel.close();
   }
   catch(IOException e)
   {
    e.printStackTrace();
   }
  }
 }
}

저작자 표시
신고

'프로그래밍 > JAVA' 카테고리의 다른 글

WEB Socket  (0) 2013.01.05
JAVA NIO 방식으로 File 읽기  (0) 2013.01.04
Tika 소개 - 유용한 Parser 라이브러리  (1) 2012.12.14
정보보호 진흥원 SEED 암호화/ SEED 알고리즘  (0) 2012.12.04

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

트랙백이 하나이고 , 댓글이 없습니다.
secret

 

XML 파서에 대해 검색하다가

괜찮은 라이브러리를 하나 발견했다.

 

라이브러리의 시작은 어떤 파일이든 포함된 컨텐츠를 추출해내는 것이 목표였다고 한다.

현재는 루씬 검색엔진 에서 파일 필터로 쓰이고 있는듯..

 

 

http://tika.apache.org/

 

 

기본 파싱방법은 (파일스트림, 핸들러, 메타데이터, 컨텍스트 객체) 이 4가지를 넣고 parse 를 돌리는 식이다.

 

 

아래는 HTML 을 파싱하는 간단한 예제이다.

 

package tikatest;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.html.HtmlParser;
import org.apache.tika.sax.BodyContentHandler;
import org.apache.tika.sax.LinkContentHandler;
import org.apache.tika.sax.TeeContentHandler;
import org.apache.tika.sax.ToHTMLContentHandler;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;

/**
 *
 * @author revfactory
 */
public class TikaTest {

    public static void main(String[] args) throws FileNotFoundException, SAXException, IOException, TikaException {
        URL url = new URL("http://www.naver.com/");
         InputStream input = url.openStream();
         LinkContentHandler linkHandler = new LinkContentHandler();
         ContentHandler textHandler = new BodyContentHandler();
         ToHTMLContentHandler toHTMLHandler = new ToHTMLContentHandler();
         TeeContentHandler teeHandler = new TeeContentHandler(linkHandler, textHandler, toHTMLHandler);
         Metadata metadata = new Metadata();
         ParseContext parseContext = new ParseContext();
         HtmlParser parser = new HtmlParser();
         parser.parse(input, teeHandler, metadata, parseContext);
         System.out.println("title:\n" + metadata.get("title"));
         System.out.println("links:\n" + linkHandler.getLinks());
         System.out.println("text:\n" + textHandler.toString());
         System.out.println("html:\n" + toHTMLHandler.toString());
    }
}

 

 

저작자 표시
신고

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글 하나 달렸습니다.
  1. 감사합니다
secret

정보보호 진흥원에서 제공하는 SEED 암호화를 아래와 같이 쓸 수 있도록 하였다.

- byte배열 <-> String 간 변환을 손쉽게 할 수 있도록 구성

- 16바이트를 맞추기 위해 쓰는 Padding 방식은 PKCS5Padding 을 사용한다.

- CBC 운영모드를 적용한다.

 

 

 

public static void main(String[] args) throws UnsupportedEncodingException
{
    PropertiesReader.init();
    String password = "010-222-2222";
    String key = PropertiesReader.getProperties("public_key");

    // Encrypt
    byte[] pbCipher = Seedx.Encrypt(key, password, "euc-kr");

    // Decrypt
    String data = Seedx.Decrypt(key, pbCipher, "euc-kr");
    System.out.println(data);
}

 

// 암호화
public static byte[] Encrypt(final String pbKey, final String plainText, String charset)
{
  byte[] byteIV = {
   (byte)0x26, (byte)0x8D, (byte)0x66, (byte)0xA7, (byte)0x35, (byte)0xA8, (byte)0x1A, (byte)0x81,
   (byte)0x6F, (byte)0xBA, (byte)0xD9, (byte)0xFA, (byte)0x36, (byte)0x16, (byte)0x25, (byte)0x01
  };
  byte[] pbUserKey = HexUtil.byteLengthPadding(pbKey.getBytes(Charset.forName(charset)), NoRounds);
  byte[] pbPlain = HexUtil.addPadding(plainText.getBytes(Charset.forName(charset)), SeedBlockSize);
  byte[] pbCipher   = new byte[pbPlain.length];
  
  int[] pdwRoundKey =getSeedRoundKey(pbUserKey);
  
  int rt = pbPlain.length / SeedBlockSize;
  for (int j = 0; j < rt; j++) {
   byte[] sSource = new byte[SeedBlockSize];
   byte[] sTarget = new byte[SeedBlockSize];

   
      
   System.arraycopy(pbPlain, (j * SeedBlockSize), sSource, 0, SeedBlockSize);
   
   // CBC 운영모드
   exclusiveOR(sSource, byteIV);
   SeedEncrypt(sSource, pdwRoundKey, sTarget);
   byteIV = sTarget;
   
   System.arraycopy(sTarget, 0, pbCipher, (j * SeedBlockSize), sTarget.length);
   
   
  }
  
//  System.out.println("KEY : " + HexUtil.byteArrayToHex(pbUserKey));
//  System.out.println("TEXT : " + HexUtil.byteArrayToHex(pbPlain));
//  System.out.println("ENC : " +  HexUtil.byteArrayToHex(pbCipher));
  
  return pbCipher;
 }
 
 public static String Decrypt(String pbKey, byte[] encryptBytes, String charset)
 {
  byte[] byteIV = {
   (byte)0x26, (byte)0x8D, (byte)0x66, (byte)0xA7, (byte)0x35, (byte)0xA8, (byte)0x1A, (byte)0x81,
   (byte)0x6F, (byte)0xBA, (byte)0xD9, (byte)0xFA, (byte)0x36, (byte)0x16, (byte)0x25, (byte)0x01
  };
  byte pbUserKey[] = HexUtil.addPadding(pbKey.getBytes(Charset.forName(charset)), SeedBlockSize);
  byte decryptBytes[]    = new byte[encryptBytes.length];
  
  int[] pdwRoundKey =getSeedRoundKey(pbUserKey);
  
  int rt = encryptBytes.length / SeedBlockSize;

  byte sSource[] = new byte[SeedBlockSize];
  byte sTarget[] = new byte[SeedBlockSize];
  for (int j = 0; j < rt; j++) {
   System.arraycopy(encryptBytes, (j * SeedBlockSize), sSource, 0, SeedBlockSize);
   
   SeedDecrypt(sSource, pdwRoundKey, sTarget);
   
   // CBC 운영모드
   exclusiveOR(sTarget, byteIV);
   byteIV = sSource;
   
   System.arraycopy(sTarget, 0, decryptBytes, (j * SeedBlockSize), SeedBlockSize);
   
   
  }
  decryptBytes = HexUtil.removePadding(decryptBytes, SeedBlockSize);
  return new String(decryptBytes, Charset.forName(charset));
 }
 
 /**
  * 암/복호화에 사용할 key값을 생성
  * @param keyStr - 생성할 key값의 string 값
  * @return
  * @throws Exception
  */
 public static int[] getSeedRoundKey(byte[] keyStr){
  int[] seedKey = new int[NoRoundKeys];
  SeedRoundKey(seedKey, keyStr);
  return seedKey;
 }
 
 /**
  * CBC 운영모드를 사용하기 위한 XOR 연산 메서드
  * value1과 value2를 XOR 연산 후 그 결과를 value1에 담는다.
  * 128bit 확정형
  * @param value1 - 변수1
  * @param value2 - 변수2
  */
 private static void exclusiveOR(byte[] value1, byte[] value2)
 {
  for(int i = 0; i < SeedBlockSize; i++)
  {
   value1[i] = Integer.valueOf(value1[i] ^ value2[i]).byteValue();
  }
 }
 
 

 

 

 

Seedx.java

 

 

 

아래는 HexUtil 클래스 메서드

 

   /**
     * 패킷내 정의된 필드의 길이가 남을때 0x00으로 채운다
     *
     * @param b : 대상 바이트 배열
     * @param length : 필드 길이
     */
    public static byte[] byteLengthPadding(byte[] b, int length)
    {
        int size = b.length;
        byte[] data = null;
        if (size == length)
        {
            data = b;
        }
        else if (size < length)
        {
            data = new byte[length];
            System.arraycopy(b, 0, data, 0, size);
            for (int i = size; i < length; i++)
            {
                data[ i] = (byte) 0x00;
            }
        }
        else if (size > length)
        {
            data = new byte[length];
            System.arraycopy(b, 0, data, 0, length);
        }
        return data;
    }
   
    /**
     * 패킷내 정의된 필드의 길이가 남을때 패딩개수로 채운다
     * PKCSPadding
     *
     * @param b : 대상 바이트 배열
     * @param blockSize : 블럭 길이
     */
    public static byte[] addPadding(byte[] source, int blockSize)
    {
     int paddingCnt = source.length % blockSize;
  byte[] paddingResult = null;
  
  if(paddingCnt != 0)
  {
   paddingResult = new byte[source.length + (blockSize - paddingCnt)];
   
   System.arraycopy(source, 0, paddingResult, 0, source.length);
   
   // 패딩해야 할 갯수 - 1 (마지막을 제외)까지 0x00 값을 추가한다.
   int addPaddingCnt = blockSize - paddingCnt;
   for(int i=0;i<addPaddingCnt;i++)
   {
    paddingResult[source.length + i] = (byte)addPaddingCnt;
   } 
  }
  else
  {
   paddingResult = source;
  }

  return paddingResult;
    }
   
    /**
     * 패킷내 패딩된 0x00을 제거한다.
     * ANSI-X.923-Padding
     * @param source
     * @param blockSize
     * @return
     */
    public static byte[] removePadding(byte[] source, int blockSize)
    {
     byte PADDING_VALUE = 0x00;
     
  byte[] paddingResult = null;
  boolean isPadding = false;
  
  // 패딩 된 count를 찾는다.
  int lastValue = source[source.length - 1];
  if(lastValue < (blockSize - 1)) {
   int zeroPaddingCount = lastValue - 1;
   
   for(int i=2;i<(zeroPaddingCount + 2);i++) {
    if(source[source.length - i] != PADDING_VALUE) {
     isPadding = false;
     break;
    }
   }
   
   isPadding = true;
  } else {
   // 마지막 값이 block size 보다 클 경우 패딩 된것이 없음.
   isPadding = false;
  }
  
  if(isPadding) {
   paddingResult = new byte[source.length - lastValue];
   System.arraycopy(source, 0, paddingResult, 0, paddingResult.length);
  } else {
   paddingResult = source;
  }  
  
  return paddingResult;
 }

 

저작자 표시
신고

'프로그래밍 > JAVA' 카테고리의 다른 글

Tika 소개 - 유용한 Parser 라이브러리  (1) 2012.12.14
정보보호 진흥원 SEED 암호화/ SEED 알고리즘  (0) 2012.12.04
Java Tip static Import  (0) 2012.11.20
jackson 라이브러리  (0) 2012.10.23

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글이 없습니다.
secret

오픈소스를 보다가 알게 된 자바의 스태틱 import 기능

 

예를 들어 TimeUtil 이란 클래스에 getCurrentTimeStr() Static메서드가 있다고 하자.

 

일반적으로는 소스상에 아래와 같이 쓴다.

 

String timeStr = TimeUtil.getCurrentTimeStr();

 

 

하지만 TimeUtil 클래스를 소스 상단에 import 할때 스태틱으로 아래처럼 지정해두면 메서드명만 호출 하면 된다.

 

import static {패키지명}.TimeUtil.*;

 

class Test

{

public static void main(String[] args)

{

String timeStr = getCurrentTimeStr();

 

System.out.println(timeStr);

}

}

 

 

저작자 표시
신고

'프로그래밍 > JAVA' 카테고리의 다른 글

정보보호 진흥원 SEED 암호화/ SEED 알고리즘  (0) 2012.12.04
Java Tip static Import  (0) 2012.11.20
jackson 라이브러리  (0) 2012.10.23
Log4j XML 설정  (0) 2012.09.17

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글이 없습니다.
secret

메이븐 추가

 

<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.6.4</version>
</dependency>



controller 에서 @ResponseBody 사용하면 알아서 json 형식으로 내려준다

public @ResponseBody MyClass getMyClass {
...
}

 

저작자 표시
신고

'프로그래밍 > JAVA' 카테고리의 다른 글

Java Tip static Import  (0) 2012.11.20
jackson 라이브러리  (0) 2012.10.23
Log4j XML 설정  (0) 2012.09.17
HTTPS 로그인 기반 웹수집 샘플 코드  (1) 2012.08.01

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

트랙백이 하나이고 , 댓글이 없습니다.
secret

#log4j.rootLogger=DEBUG,console,INFO, web
#log4j.rootLogger = INFO, stdout
#핸들러의 로깅레벨  : SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST, ALL

 

log4j.rootLogger=CONSOL , DEBUG , ERROR , SYSTEM , WARN , WEB
log4j.appender.CONSOL=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOL.Append=true
log4j.appender.CONSOL.ImmediateFlush=true
log4j.appender.CONSOL.Threshold=INFO
log4j.appender.CONSOL.DatePattern='.'yyyy-MM-dd
log4j.appender.CONSOL.MaxFileSize=20MB
log4j.appender.CONSOL.MaxBackupIndex=10

 

 

#Layout 형식 : TTCCLayout, HTMLLayout, XMLLayout, PatternLayout, SimpleLayout
#PatternLayout, SimpleLayout - 자바의 Throwable 에러들과 예외를 무시한다
log4j.appender.CONSOL.layout=org.apache.log4j.PatternLayout

#소스코드의 위치정보를 출력한다. %C. %M(%F:%L) 의 축약형이다 / %d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n
log4j.appender.CONSOL.layout.ConversionPattern=[%-5p] %d{HH:mm:ss} [%c] [time: %r] - %m%n

 

 

# 로그파일 경로.
log4j.appender.CONSOL.File=${catalina.home}/logs/tomcat.consol.log

 

#[%d{yyyy-MM-dd}형식은 프로그램의 실행속도를 느리게 함으로 SimpleDateFormat 형식지정한다
log4j.appender.CONSOL.layout.DateFormat=ISO8601

 

#[YYYY-MM-DD HH:MM:SS, mm] 형식을 뜻한다.
log4j.appender.CONSOL.layout.TimeZoneID=GMT-8:00


#매일 자정에 로그파일을 교체하며 기존파일은 xx.log_2004.07.12 org.apache.log4j.ConsoleAppender , DailyRollingFileAppender
log4j.appender.SYSTEM=org.apache.log4j.RollingFileAppender
log4j.appender.SYSTEM.Append=true
log4j.appender.SYSTEM.DatePattern='.'yyyy-MM-dd
log4j.appender.SYSTEM.Threshold=INFO
log4j.appender.SYSTEM.ImmediateFlush=true
log4j.appender.SYSTEM.MaxFileSize=20MB
log4j.appender.SYSTEM.MaxBackupIndex=10

 

 

#자바의 Throwable 에러들과 예외를 포함하기 위해 HTMLLayout을 사용한다.
log4j.appender.SYSTEM.layout=org.apache.log4j.PatternLayout

 

 

#[%d{yyyy-MM-dd}형식은 프로그램의 실행속도를 느리게 함으로 SimpleDateFormat 형식지정한다
log4j.appender.SYSTEM.layout.DateFormat=ISO8601

 

 

#[YYYY-MM-DD HH:MM:SS, mm] 형식을 뜻한다.
log4j.appender.SYSTEM.layout.TimeZoneID=GMT-8:00

 

 

#소스코드의 위치정보를 출력한다. %C. %M(%F:%L) 의 축약형이다 / %d{HH:mm:ss} %5p (%C{2} - %M:%L) - %m%n
log4j.appender.SYSTEM.layout.ConversionPattern=%d{dd-MM-yy HH:mm:ss:SSS} - {%p} %c{2} Thread [%t]; %x %m%n

 

 

# 로그파일 경로.
log4j.appender.SYSTEM.File=${catalina.home}/logs/tomcat.stdout.log

log4j.appender.WEB=org.apache.log4j.RollingFileAppender
log4j.appender.WEB.File=${catalina.home}/logs/tomcat.web.log
log4j.appender.WEB.MaxFileSize=20MB
log4j.appender.WEB.MaxBackupIndex=10
log4j.appender.WEB.layout=org.apache.log4j.PatternLayout
log4j.appender.WEB.layout.ConversionPattern=%p %t %c - %m%n
#log4j.appender.WEB.layout.ConversionPattern=[%-5p] %d{HH:mm:ss} [%c] [time: %r] - %m%n
#log4j.logger.org.apache.catalina=DEBUG, R

log4j.logger.org.apache.catalina.core=INFO
log4j.logger.org.apache.catalina.session=INFO
log4j.logger.org.apache.jasper.compiler=INFO

 

 

 

# 로그 포멧 정리

로그자체를 어떤 포맷으로 남길지 결정합니다.
layout에는 HTMLLayout, PatternLayout, SimpleLayout, XMLLayout등이 있으며 PatternLayout이 일반적으로 가장 많이 쓰입니다.

형식 설명
%p debug, info, warn, error, fatal 등의 priority 가 출력된다.
%m 로그내용이 출력됩니다
%d 로깅 이벤트가 발생한 시간을 기록합니다.
포맷은 %d{HH:mm:ss, SSS}, %d{yyyy MMM dd HH:mm:ss, SSS}같은 형태로 사용하며 SimpleDateFormat에 따른 포맷팅을 하면 된다
%t 로그이벤트가 발생된 쓰레드의 이름을 출력합니다.
%% % 표시를 출력하기 위해 사용한다.
%n 플랫폼 종속적인 개행문자가 출력된다. \r\n 또는 \n 일것이다.
%c 카테고리를 표시합니다
예) 카테고리가 a.b.c 처럼 되어있다면 %c{2}는 b.c가 출력됩니다.
%C 클래스명을 포시합니다.
예) 클래스구조가 org.apache.xyz.SomeClass 처럼 되어있다면 %C{2}는 xyz.SomeClass 가 출력됩니다
%F 로깅이 발생한 프로그램 파일명을 나타냅니다.
%l 로깅이 발생한 caller의 정보를 나타냅니다
%L 로깅이 발생한 caller의 라인수를 나타냅니다
%M 로깅이 발생한 method 이름을 나타냅니다.
%r 어플리케이션 시작 이후 부터 로깅이 발생한 시점의 시간(milliseconds)
%x 로깅이 발생한 thread와 관련된 NDC(nested diagnostic context)를 출력합니다.
%X 로깅이 발생한 thread와 관련된 MDC(mapped diagnostic context)를 출력합니다.

예시) (같은 색끼리 보시면 됩니다)

위의 test.jsp를 다음 포맷으로 출력해본다면

[%c] [%C] [%d] [%F] [%l] [%L] [%m] [%M] [%n] [%p] [%r] [%t] [%x] [%X]는 다음과 같다

[test.jsp] [org.apache.jsp.test_jsp] [2005-03-10 12:37:23,561] [test_jsp.java] [org.apache.jsp.test_jsp._jspService(test_jsp.java:64)] [64] [fatal!!] [_jspService] [개행] [FATAL] [765567] [http-8080-Processor25] [] []

 

저작자 표시
신고

'프로그래밍 > JAVA' 카테고리의 다른 글

jackson 라이브러리  (0) 2012.10.23
Log4j XML 설정  (0) 2012.09.17
HTTPS 로그인 기반 웹수집 샘플 코드  (1) 2012.08.01
JAVA 7 기능  (0) 2012.04.20

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글이 없습니다.
secret