카테고리 보관물: My Project

sjava-logging 1.0 Level

sjava-logging library는 level에 따른 로깅 가능여부를 체크하고 있지는 않습니다.
아래의 Level은 로깅파일의 분류 및 파일의 내용에 기입을 하기 위한 클래스입니다.
그리고, Level에 대한 사용을 위해서는 LevelFactory를 사용하면 됩니다.

LevelFactory.java

package net.sjava.logging;

import java.util.Map;
import java.util.HashMap;

/**
 *
 * @author mcsong@gmail.com
 * @since 2009. 7. 1.
 */
public class LevelFactory {   
    /** map of levels     */
    private Map<String, Level> levelMap;

    /** singleton instance */
    private static LevelFactory instance = new LevelFactory();
   
    /** constructor */
    private LevelFactory() {
        this.levelMap = new HashMap<String, Level>();
       
        this.levelMap.put(“all”, new Level(0, “all”));
        this.levelMap.put(“fatal”, new Level(1, “fatal”));
        this.levelMap.put(“error”, new Level(2, “error”));
        this.levelMap.put(“warn”, new Level(3, “warn”));
        this.levelMap.put(“info”, new Level(4, “info”));
        this.levelMap.put(“debug”, new Level(5, “debug”));
        this.levelMap.put(“trace”, new Level(6, “trace”));
        this.levelMap.put(“system”, new Level(7, “system”));
    }
   
    /**
     *
     * @return
     */
    public static LevelFactory getInstance() {
        return instance;
    }
   
    /**
     *
     * @param level
     * @return
     */
    public Level getLevel(int level) {
        switch (level) {
        case 1:
            return this.getLevel(“fatal”);
        case 2:
            return this.getLevel(“error”);
        case 3:
            return this.getLevel(“warn”);
        case 4:
            return this.getLevel(“info”);
        case 5:
            return this.getLevel(“debug”);
        case 6:
            return this.getLevel(“trace”);
        case 7:
            return this.getLevel(“system”);
           
        default:
            return this.getLevel(“all”);
        }
    }
   
    /**
     *
     * @param name
     * @return
     */
    public Level getLevel(String name) {
        if (name == null)
            return null;
       
        if(!this.levelMap.containsKey(name.toLowerCase()))
            return (Level)this.levelMap.get(“all”);
       
        return (Level)this.levelMap.get(name.toLowerCase());
    }
}

Level.java

package net.sjava.logging;

/**
 *
 * @author mcsong@gmail.com
 * @since 2009. 6. 19.
 */

public class Level {

    /** level number */
    public int level;
   
    /** level name */
    public String name;

    /**
     * Constructor
     *
     * @param level
     * @param name
     */
    public Level(int level, String name) {
        this.level = level;
        this.name = name;
    }
   
    /**
     * @return the level
     */
    public int getLevel() {
        return level;
    }

    /**
     * @param level the level to set
     */
    public void setLevel(int level) {
        this.level = level;
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return “name is ” + this.name + “, level is ” + this.level;
    }
}

sjava-logging 1.0

java logging library 입니다.
file에 write 하는 BufferedWriter의 성능을 높이기 위한 tip이 적용되어 있습니다.
config 처리는 sjava-config 코드를 복사해서 패키지 이름만 바꿨습니다. ^^;;
아래 예제는 설정파일과 sjava-logging-1.0.jar를 클래스 패스가 잡힌 위치에 복사를 하시고 돌리시면 됩니다.

예제

package net.sjava.logging.test;

import net.sjava.logging.Logger;

import java.util.Date;
import java.text.SimpleDateFormat;

public class LoggingTest {

    private static SimpleDateFormat format = new SimpleDateFormat(“yyyy.MM.dd HH:mm:ss SSS”);
   
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //load();

        // add shutdown hook
        Runtime.getRuntime().addShutdownHook(new Thread() {
            public void run() {
                net.sjava.logging.util.BufferedWriterCacheUtility.shutdown();
            }
        });
       
        System.out.println(“s – ” + format.format(new Date()));
       
        for(int i=0; i < 1000000; i++) {
            Logger.getInstance().log(“aaaaaaaaaaaaaaa”);
            Logger.getInstance().log(“aaaaaaaaaaaaccccccccccccccccccaaa”);
           
            Logger.getInstance().log(“metoo”, “푸푸푸푸푸박.. “);
           
            Logger.getInstance().log(“abcded”, “abcde”, “aaaa b aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”);
        }
   
        System.out.println(“e – ” + format.format(new Date()));
    }
}

설정파일

<?xml version=”1.0″ encoding=”utf-8″?>
<sjava-logging>
    <!– array variable delimeter is “,” –>
    <!– do not delete  –>
    <sjava-service name=”config”>
        <key name=”watch” value=”false” /> <!– true, false –>
        <key name=”period” value=”60″ /> <!– 60 seconds –>
    </sjava-service>
   
    <!– 로그서버 설정 –>
    <sjava-service name=”logging”>
        <key name=”baseDir” value=”d:\sjava-logging” />
        <key name=”serviceDir” value=”default” />
        <key name=”fileName” value=”default” />
        <key name=”fileExt” value=”log” />
        <key name=”bufferSize” value=”1024″ />
        <!– dayily(1), hourly(2), minutes(3) –>
        <key name=”strategy” value=”2″ />
    </sjava-service>
   
</sjava-logging>

바이너리 & 소스
cfile21.uf.175436194A55461107BB1D.zipcfile1.uf.17538C194A55461100FD89.zip

sjava-config 1.1

config 파일을 모니터링하는 부분의 코드가 변경이 되었습니다.
기존의 net.sjava.config.util.Watcher 클래스를 Timer를 이용하는 TimerTask로 변경을 하였습니다.
사용법은 http://www.sjava.net/121를 참고하시면 됩니다.

바이너리


sjava-config 1.0

설정파일을 저장하고 가져오는 라이브러리입니다.
sjava-config는 http://www.jconfig.org/jconfig를 보고 필요한 형태(xml만 지원)로만 개발했습니다.
여러형태의 설정파일을 읽어올 수 있도록 common한 기능은 추상 클래스로 빼고 설정을 읽는 코드는 하위 클래스에서 구현을 합니다.

설정파일의 형태는 아래와 같습니다.
sjava-config.xml

<?xml version=”1.0″ encoding=”utf-8″?>
<sjava-config>
    <!– array variable delimeter is “,” –>
    <!– sjava-config 설정, 아래 설정은 지우지 마세요 –>
    <sjava-service name=”config”>
        <key name=”watch” value=”true” /> <!– true, false –>
        <key name=”interval” value=”60″ /> <!– 60 seconds –>
    </sjava-service>
   
    <!– 로그서버 설정 –>
    <sjava-service name=”log”>
        <key name=”host” value=”111.111.111.111,222.222.222.222″ />
        <key name=”port” value=”20003″ />
    </sjava-service>
</sjava-config>

그리고 위 파일(sjava-config.xml)은 classpath에 위치를 해야 읽을 수 있습니다.

ConfigTest.java

package net.sjava.config.demo;

import net.sjava.config.ConfigHandler;

/**
 * Code Coverage Test Class using EclEmma
 * @author mcsong@gmail.com
 * @since 2009. 6. 29.
 */
public class ConfigTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
       
        ConfigHandler configHandler = ConfigHandler.getInstance();
        System.out.println(configHandler.isLoading() ? “loading true” : “loading fail”);
       
        System.out.println(“- get vlaue test —“);
        System.out.println(configHandler.getValue(“config”, “watch”));
        System.out.println(configHandler.getValue(“config”, “interval”));
        System.out.println(configHandler.getValue(“log”, “host”));
        System.out.println(configHandler.getValue(“log”, “port”));
        System.out.println(configHandler.getValue(“auth”, “host”));
        System.out.println(configHandler.getValue(“auth”, “port”));
       
        System.out.println(“- default value test —“);
        System.out.println(configHandler.getValue(“config”, “watch”, “false”));
        System.out.println(configHandler.getValue(“config”, “interval”, “11”));
        System.out.println(configHandler.getValue(“log”, “host”, “222.222.222.222”));
        System.out.println(configHandler.getValue(“log”, “port”, “20003”));
        System.out.println(configHandler.getValue(“auth”, “host”, “222.222.222.222”));
       
        System.out.println(“- array value test —“);
        for(int i = 0; i < configHandler.getValues(“log”, “host”).length; i++) {
            System.out.println(configHandler.getValues(“log”, “host”)[i].toString());
        }
       
        for(int i = 0; i < configHandler.getValues(“auth”, “host”).length; i++) {
            System.out.println(configHandler.getValues(“auth”, “host”)[i].toString());
        }
       
        System.out.println(“- add value —“);
        configHandler.addValue(“test”, “host”, “1.1.1.1”);
        System.out.println(configHandler.getValue(“test”, “host”));
       
        System.out.println(“- modify value —“);
        configHandler.setValue(“test”, “host”, “2.2.2.2”);
        System.out.println(configHandler.getValue(“test”, “host”));
       
        System.out.println(“- modify values —“);
        String[] values = {“2.2.2.2”, “3.3.3.3”};
        configHandler.setValues(“test”, “host”, values);
       
        for(int i = 0; i < configHandler.getValues(“test”, “host”).length; i++) {
            System.out.println(configHandler.getValues(“test”, “host”)[i].toString());
        }
    }

}

바이너리

cfile22.uf.192608224A496BF83C2426.zip소스
cfile24.uf.182D46214A496C836B36DA.zip