본문 바로가기

Programming/Java

Java simple logger using apache log4j (Java Simple Logger 만들기)

Logger 를 사용하고 싶을때, 보통 아파치에서 제공하는 log4j 라는 것을 사용하는데,

이것은 몇몇 설정을 해주어야 하기 때문에, 간단하게 자바에서 제공하는 logging 기능을

사용하여 Logger 를 만들 수 있다.


아래의 예제는 간단한 로그 기능만을 구현한 클래스 이므로, encoding 이라든지,

기타 여러가지 설정을 바꾸고 싶을때는, 좀더 customize 해야 한다.


// JRE 1.5 이상에서만 실행가능, JDK 1.5 이상에서 컴파일 가능

// Generic Programming을 사용하였음.


import java.io.File;

import java.io.IOException;

import java.util.HashMap;

import java.util.logging.FileHandler;

import java.util.logging.Level;

import java.util.logging.Logger;

import java.util.logging.SimpleFormatter;



public class SimpleLogger {

    public static final int LOGGER_LEVEL_SEVERE = 0;

    public static final int LOGGER_LEVEL_WARNING = 1;

    public static final int LOGGER_LEVEL_INFO = 2;

    public static final int LOGGER_LEVEL_CONFIG = 3;

    public static final int LOGGER_LEVEL_FINE = 4;

    public static final int LOGGER_LEVEL_FINER = 5;

    public static final int LOGGER_LEVEL_FINEST = 6;


    private Logger logger;

    private static final String LOGGER_NAME = "SIMPLE_LOG";

    private String logDir;

    private String logFileName;

    private FileHandler logFileHandler;


    private HashMap<Integer, Level> loggerLevel; // Logger Level 들을 가지고 있는 HashMap


    public SimpleLogger(String logDir, String logFileName){

        this.logDir = logDir;

        this.logFileName = logFileName;

        logger = Logger.getLogger(LOGGER_NAME);

        loggerLevel = new HashMap<Integer, Level>();

        initLogger();

    }


    public void info(String msg){

        logger.info(msg);

    }

    public void log(String msg){

        logger.info(msg);

    }

    public void log(Level level, String msg){

        logger.log(level, msg);

    }

    // 보통 레벨은 Level object 을 만들지 않고 바로 사용자가 정의한 어떤 Integer 형 상수로

    // 정의하고 싶을 때가 많다. 이렇게 하기위해서 HashMap 에 정의한 level 에 따른 Level Object

    // 를 얻어와서 로거 Level을 설정해 주면 사용하기 간편하다.

    public void log(int level, String msg){

        logger.log(getLevel(level), msg);

    }


    public void initLogger(){

        loggerLevel.put(new Integer(LOGGER_LEVEL_SEVERE), Level.SEVERE);

        loggerLevel.put(new Integer(LOGGER_LEVEL_WARNING), Level.WARNING);

        loggerLevel.put(new Integer(LOGGER_LEVEL_INFO), Level.INFO);

        loggerLevel.put(new Integer(LOGGER_LEVEL_CONFIG), Level.CONFIG);

        loggerLevel.put(new Integer(LOGGER_LEVEL_FINE), Level.FINE);

        loggerLevel.put(new Integer(LOGGER_LEVEL_FINER), Level.FINER);

        loggerLevel.put(new Integer(LOGGER_LEVEL_FINEST), Level.FINEST);


        try{

            // 해당 디렉토리가 존재하지 않은면 생성

            boolean isDirCreated = (new File(logDir).mkdirs());

            if(isDirCreated){ 

                logger.info(logDir + " is created.");

            }

            logFileHandler = new FileHandler(logDir + File.separator + logFileName, true);

            logger.addHandler(logFileHandler);

            logger.setLevel(Level.ALL);

            // SimpleFormatter를 이용하면 encoding 이라든지, 각종 설정들을 할 수 있다.

            // javadoc 를 참조해서 customize 해서 사용하면 됨.

            SimpleFormatter formatter = new SimpleFormatter();

            logFileHandler.setFormatter(formatter);

        }

        catch (SecurityException e) {

            e.printStackTrace();

          } catch (IOException e) {

            e.printStackTrace();

          }

    }

    public Level getLevel(int level){

        Integer levelKey = new Integer(level);

        return loggerLevel.containsKey(levelKey)? loggerLevel.get(levelKey): Level.INFO;

    }

    public static void main(String [] args){ // 테스트

        SimpleLogger logger = new SimpleLogger("c:\\log", "simple.log");

        logger.log("this is a test.");

    }

}