대충 만들어본 로그 클래스

Logger.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
public class Logger {
    
    public static final int NO = LoggerConfigLoader.NO_STATUS;
    public static final int INFO = LoggerConfigLoader.INFO_STATUS;
    public static final int DEBUG = LoggerConfigLoader.DEBUG_STATUS;
        
    private int status = Logger.NO;
    private String className = "";
        
    public Logger(){};    
    
    public Logger(int status){
        this.status = status;
    }
    
    public Logger(Class<?> clazz, int status){
        this.className = clazz.getCanonicalName();
        this.status = status;
    }
    
    public void info(String text){ infoPrint(text); }
    public void info(Object text){ infoPrint(text.toString()); }
    public void info(boolean text){ infoPrint(String.valueOf(text)); }
    public void info(double text){ infoPrint(String.valueOf(text)); }
    public void info(short text){ infoPrint(String.valueOf(text)); }
    public void info(float text){ infoPrint(String.valueOf(text)); }
    public void info(long text){ infoPrint(String.valueOf(text)); }
    public void info(char text){ infoPrint(String.valueOf(text)); }
    public void info(byte text){ infoPrint(String.valueOf(text)); }
    public void info(int text){ infoPrint(String.valueOf(text)); }
    
    public void debug(String text){ debugPrint(text); }
    public void debug(Object text){ debugPrint(text.toString()); }
    public void debug(boolean text){ debugPrint(String.valueOf(text)); }
    public void debug(double text){ debugPrint(String.valueOf(text)); }
    public void debug(short text){ debugPrint(String.valueOf(text)); }
    public void debug(float text){ debugPrint(String.valueOf(text)); }
    public void debug(long text){ debugPrint(String.valueOf(text)); }
    public void debug(char text){ debugPrint(String.valueOf(text)); }
    public void debug(byte text){ debugPrint(String.valueOf(text)); }
    public void debug(int text){ debugPrint(String.valueOf(text)); }
    
    private void infoPrint(String text){
        if(((status & Logger.INFO) == Logger.INFO) || (status >= Logger.INFO)){
            printText(Logger.INFO, text);
        }
    }
    
    private void debugPrint(String text){
        if((status & Logger.DEBUG) == Logger.DEBUG){
            printText(Logger.DEBUG, text);
        }
    }
    
    private void printText(int status, String text){
        String statusString = "";
        
        switch(status){
        case Logger.INFO:
            statusString = "[info]";
            break;
        case Logger.DEBUG:
            statusString = "[debug]";
            break;
        }
        
        System.out.println(statusString + ((status >= 2)?this.className + " - " : "") + text); 
        
    }
 
}
 

 

- LoggerFactory.java(LoggerConfig.class, Wk5LoggerConfigLoadException.class 포함)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
package com.wakeup.module.commons.log;
 
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
 
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
 
public class LoggerFactory {
    private LoggerFactory(){}
    
    public static Logger getLogger(Class<?> clazz){
        
        LoggerConfigLoader l = LoggerConfigLoader.getAndLoadLoggerConfig();
        
        return new Logger(clazz, l.getLogStatus());
    }
}
 
class LoggerConfigLoader{
    /* 설정 파일 값들 */
    /* 값 */
    protected static final int NO_STATUS = 0b00000000;
    protected static final int INFO_STATUS = 0b00000001;
    protected static final int DEBUG_STATUS = 0b00000010;
    
    /* 이름 */
    private final String NO_STATUS_NAME = "no";
    private final String INFO_STATUS_NAME = "info";
    private final String DEBUG_STATUS_NAME = "debug";
    
    /* 설정파일 이름 */
    private final String LOGGER_XML_CONFIG_NAME = "wk5logger.xml";
 
    
    /* 싱글턴을 위함. */
    private static LoggerConfigLoader instance = null;
    
    /* 설정 상태 값. */
    private int logStatus = NO_STATUS;
    
    /* 내부 작동을 위한 변수들 */
    private List<String> statusNameList = 
                Arrays.asList(new String[]{NO_STATUS_NAME, INFO_STATUS_NAME, DEBUG_STATUS_NAME});
    private List<Integer> statusValueList = 
                Arrays.asList(new Integer[]{NO_STATUS, INFO_STATUS, DEBUG_STATUS});
    private final Map<String, Integer> statusMap = new HashMap<String, Integer>();
    
    /* 생성자 */
    private LoggerConfigLoader(){
        /* 상태값을 맵에 넣음 */
        for(int i = 0; i < statusNameList.size(); i++){
            statusMap.put(statusNameList.get(i), statusValueList.get(i));
        }
        
        loadConfig();
    }
    
    /* 싱글턴을 위함. */
    protected static LoggerConfigLoader getAndLoadLoggerConfig(){
        
        synchronized (LoggerConfigLoader.class) {
            
            if(instance == null){
                instance = new LoggerConfigLoader();
            }
            
        }
        
        return instance;
    }
    
    /* xml설정파일을 로드하여 설정된 값을 logStatus에 넣음. */
    private void loadConfig(){
 
        try {
            
            File xmlConfigFile = getXmlConfigFile(LOGGER_XML_CONFIG_NAME);
                 //Wk5LoggerConfigLoadFailedException
            
            String getLogStatusString = getStatusAtConfigXmlfile(xmlConfigFile);
            
            if(statusNameList.contains(getLogStatusString)){
                logStatus = statusMap.get(getLogStatusString).intValue();
            }else{
                logStatus = NO_STATUS;
            }
            
        } catch (Wk5LoggerConfigLoadException e) {
            
            System.out.println(e.getMessage());
            logStatus = NO_STATUS;
        }
    }
    
    private File getXmlConfigFile(String xmlFileName) throws Wk5LoggerConfigLoadException{
        
        URL configPath = this.getClass().getClassLoader().getResource(xmlFileName);
            
        if(configPath == nullthrow new Wk5LoggerConfigLoadException();
        
        File xmlFile = new File(configPath.getFile());
        
        return xmlFile;
    }
    
    private String getStatusAtConfigXmlfile(File xmlConfigFile){
        
        try {
            DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance()
                      .newDocumentBuilder();
            Document xmlConfig = documentBuilder.parse(xmlConfigFile);
            
            xmlConfig.getDocumentElement().normalize();
            
            Node rootNode = xmlConfig.getFirstChild();
            
            String LogStatusString = rootNode.getOwnerDocument()
                      .getElementsByTagName("status").item(0).getTextContent();
            
            return LogStatusString;
            
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
            return NO_STATUS_NAME;
        } catch (SAXException e) {
            e.printStackTrace();
            return NO_STATUS_NAME;
        } catch (IOException e) {
            e.printStackTrace();
            return NO_STATUS_NAME;
        }
        
    }
 
    public int getLogStatus() {
        return logStatus;
    }
    
}
 
class Wk5LoggerConfigLoadException extends Exception{
    private static final long serialVersionUID = 1L;
 
    public Wk5LoggerConfigLoadException(){
        super("wk5logger error! - "
                + "Set the log file does not exist or the file location is incorrect. "
                + "Set file at top-level source directory.");
    }
    
    public Wk5LoggerConfigLoadException(String messege){
        super(messege);
    }
    
}
 

-wk5logger.xml

1
2
3
4
<?xml version="1.0" encoding="UTF-8"?>
<logger>
    <status>debug</status>        
</logger>

  -Main.java

1
2
3
4
5
6
7
8
9
10
11
public class Main{
   Logger log = new Logger(Main.class);
//Logger log = new Logger(Logger.INFO);
//Logger log = new Logger();
 
   public static void main(String arg[]) {
      log.info("인포 로그입니다");
      log.debug("디버그 로그입니다");
   }
}
 

 

-출력

 [info] - 인포 로그입니다

[debug] Main - 디버그 로그입니다

 

- 클래스 이름을 생략 할 수도 있고, 인포로그만 혹은 출력안하게 할 수도 있다.

 

- 5. 17수정 인포로그는 클래스 이름 표시 안하도록 수정, 카운터 없앰

- 5. 31수정 외부 xml 설정파일를 통해 인포, 디버그 표시를 설정하도록 수정...

 

소스 파일을 볼 수 있도록 깃허브에 올려놓음.. https://github.com/wakeup5/module_git

댓글()