1
2
3
4
5
6
7
8
9
10
11
12
13
14 package uk.nhs.interoperability.util;
15
16 import java.text.SimpleDateFormat;
17 import java.util.Calendar;
18
19
20
21
22
23
24
25
26
27 public class Logger {
28
29
30 private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
31
32
33 public static final int TRACE = 0;
34
35
36 public static final int DEBUG = 10;
37
38
39 public static final int INFO = 20;
40
41
42 public static final int WARN = 30;
43
44
45 public static final int ERROR = 40;
46
47
48 public static final int FATAL = 50;
49
50
51 private static int logLevel = INFO;
52
53 static {
54 logLevel = parseLogLevel(ITKApplicationProperties.getProperty("uk.nhs.interoperability.util.Logger.logLevel"));
55 }
56
57
58
59
60
61
62
63
64
65 private static final void log(int level, String message, Throwable t) {
66 if (level >= logLevel) {
67 Calendar CAL = Calendar.getInstance();
68 String dateTime = DATE_FORMAT.format(CAL.getTime());
69 String threadId = Thread.currentThread().getName();
70 String logMessage = dateTime + " [" + threadId + "] " + " [" + logLevelStr(level) + "] " + getCallerInfo() + message;
71 if (t == null) {
72 System.out.println(logMessage);
73 } else {
74 System.out.println(logMessage + ", " + t.getLocalizedMessage());
75 t.printStackTrace(System.out);
76 }
77 }
78 }
79
80
81
82
83
84
85
86 private static final int parseLogLevel(String logLevelStr) {
87 if (logLevelStr != null) {
88 if (logLevelStr.equalsIgnoreCase("TRACE")) {
89 return TRACE;
90 } else if (logLevelStr.equalsIgnoreCase("DEBUG")) {
91 return DEBUG;
92 } else if (logLevelStr.equalsIgnoreCase("INFO")) {
93 return INFO;
94 } else if (logLevelStr.equalsIgnoreCase("WARN")) {
95 return WARN;
96 } else if (logLevelStr.equalsIgnoreCase("ERROR")) {
97 return ERROR;
98 } else if (logLevelStr.equalsIgnoreCase("FATAL")) {
99 return FATAL;
100 }
101 }
102
103 return INFO;
104 }
105
106
107
108
109
110
111
112 private static final String logLevelStr(int level) {
113 switch (level) {
114 case TRACE:
115 return "TRACE";
116 case DEBUG:
117 return "DEBUG";
118 case INFO:
119 return "INFO";
120 case WARN:
121 return "WARN";
122 case ERROR:
123 return "ERROR";
124 case FATAL:
125 return "FATAL";
126 default:
127 return null;
128 }
129 }
130
131
132
133
134
135
136 public static final void trace(String message) {
137 log(TRACE, message, null);
138 }
139
140
141
142
143
144
145 public static final void debug(String message) {
146 log(DEBUG, message, null);
147 }
148
149
150
151
152
153
154 public static final void info(String message) {
155 log(INFO, message, null);
156 }
157
158
159
160
161
162
163 public static final void warn(String message) {
164 log(WARN, message, null);
165 }
166
167
168
169
170
171
172
173 public static final void warn(String message, Throwable t) {
174 log(WARN, message, t);
175 }
176
177
178
179
180
181
182
183 public static final void error(String message, Throwable t) {
184 log(ERROR, message, t);
185 }
186
187
188
189
190
191
192
193 public static final void fatal(String message, Throwable t) {
194 log(FATAL, message, t);
195 }
196
197
198
199
200
201
202 private static String getCallerInfo() {
203 return getClassAndMethod(Thread.currentThread().getStackTrace()[4]);
204 }
205
206
207
208
209
210
211
212 private static String getClassAndMethod(StackTraceElement ste) {
213 String className = ste.getClassName().substring(ste.getClassName().lastIndexOf(".") + 1);
214 return className + "." + ste.getMethodName() + "(l:" + ste.getLineNumber() + ") ";
215 }
216
217 }