1 /*
2 * Copyright 1999-2005 The Apache Software Foundation.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 // Contributors: Kitching Simon <Simon.Kitching@orange.ch>
18 // Nicholas Wolff
19
20 package org.apache.log4j;
21 import java.io.IOException;
22 import java.io.ObjectInputStream;
23 import java.io.ObjectOutputStream;
24 import java.io.ObjectStreamException;
25 import java.io.Serializable;
26
27 /**
28 Defines the minimum set of levels recognized by the system, that is
29 <code>OFF</code>, <code>FATAL</code>, <code>ERROR</code>,
30 <code>WARN</code>, <code>INFO</code>, <code>DEBUG</code> and
31 <code>ALL</code>.
32
33 <p>The <code>Level</code> class may be subclassed to define a larger
34 level set.
35
36 @author Ceki Gülcü
37
38 */
39 public class Level extends Priority implements Serializable {
40
41 /**
42 * TRACE level integer value.
43 * @since 1.2.12
44 */
45 public static final int TRACE_INT = 5000;
46
47 /**
48 The <code>OFF</code> has the highest possible rank and is
49 intended to turn off logging. */
50 final static public Level OFF = new Level(OFF_INT, "OFF", 0);
51
52 /**
53 The <code>FATAL</code> level designates very severe error
54 events that will presumably lead the application to abort.
55 */
56 final static public Level FATAL = new Level(FATAL_INT, "FATAL", 0);
57
58 /**
59 The <code>ERROR</code> level designates error events that
60 might still allow the application to continue running. */
61 final static public Level ERROR = new Level(ERROR_INT, "ERROR", 3);
62
63 /**
64 The <code>WARN</code> level designates potentially harmful situations.
65 */
66 final static public Level WARN = new Level(WARN_INT, "WARN", 4);
67
68 /**
69 The <code>INFO</code> level designates informational messages
70 that highlight the progress of the application at coarse-grained
71 level. */
72 final static public Level INFO = new Level(INFO_INT, "INFO", 6);
73
74 /**
75 The <code>DEBUG</code> Level designates fine-grained
76 informational events that are most useful to debug an
77 application. */
78 final static public Level DEBUG = new Level(DEBUG_INT, "DEBUG", 7);
79
80 /**
81 * The <code>TRACE</code> Level designates finer-grained
82 * informational events than the <code>DEBUG</code level.
83 * @since 1.2.12
84 */
85 public static final Level TRACE = new Level(TRACE_INT, "TRACE", 7);
86
87
88 /**
89 The <code>ALL</code> has the lowest possible rank and is intended to
90 turn on all logging. */
91 final static public Level ALL = new Level(ALL_INT, "ALL", 7);
92
93 /**
94 * Serialization version id.
95 */
96 static final long serialVersionUID = 3491141966387921974L;
97
98 /**
99 Instantiate a Level object.
100 */
101 protected
102 Level(int level, String levelStr, int syslogEquivalent) {
103 super(level, levelStr, syslogEquivalent);
104 }
105
106
107 /**
108 Convert the string passed as argument to a level. If the
109 conversion fails, then this method returns {@link #DEBUG}.
110 */
111 public
112 static
113 Level toLevel(String sArg) {
114 return (Level) toLevel(sArg, Level.DEBUG);
115 }
116
117 /**
118 Convert an integer passed as argument to a level. If the
119 conversion fails, then this method returns {@link #DEBUG}.
120
121 */
122 public
123 static
124 Level toLevel(int val) {
125 return (Level) toLevel(val, Level.DEBUG);
126 }
127
128 /**
129 Convert an integer passed as argument to a level. If the
130 conversion fails, then this method returns the specified default.
131 */
132 public
133 static
134 Level toLevel(int val, Level defaultLevel) {
135 switch(val) {
136 case ALL_INT: return ALL;
137 case DEBUG_INT: return Level.DEBUG;
138 case INFO_INT: return Level.INFO;
139 case WARN_INT: return Level.WARN;
140 case ERROR_INT: return Level.ERROR;
141 case FATAL_INT: return Level.FATAL;
142 case OFF_INT: return OFF;
143 case TRACE_INT: return Level.TRACE;
144 default: return defaultLevel;
145 }
146 }
147
148 /**
149 Convert the string passed as argument to a level. If the
150 conversion fails, then this method returns the value of
151 <code>defaultLevel</code>.
152 */
153 public
154 static
155 Level toLevel(String sArg, Level defaultLevel) {
156 if(sArg == null)
157 return defaultLevel;
158
159 String s = sArg.toUpperCase();
160
161 if(s.equals("ALL")) return Level.ALL;
162 if(s.equals("DEBUG")) return Level.DEBUG;
163 if(s.equals("INFO")) return Level.INFO;
164 if(s.equals("WARN")) return Level.WARN;
165 if(s.equals("ERROR")) return Level.ERROR;
166 if(s.equals("FATAL")) return Level.FATAL;
167 if(s.equals("OFF")) return Level.OFF;
168 if(s.equals("TRACE")) return Level.TRACE;
169 return defaultLevel;
170 }
171
172 /**
173 * Custom deserialization of Level.
174 * @param s serialization stream.
175 * @throws IOException if IO exception.
176 * @throws ClassNotFoundException if class not found.
177 */
178 private void readObject(final ObjectInputStream s) throws IOException, ClassNotFoundException {
179 s.defaultReadObject();
180 level = s.readInt();
181 syslogEquivalent = s.readInt();
182 levelStr = s.readUTF();
183 if (levelStr == null) {
184 levelStr = "";
185 }
186 }
187
188 /**
189 * Serialize level.
190 * @param s serialization stream.
191 * @throws IOException if exception during serialization.
192 */
193 private void writeObject(final ObjectOutputStream s) throws IOException {
194 s.defaultWriteObject();
195 s.writeInt(level);
196 s.writeInt(syslogEquivalent);
197 s.writeUTF(levelStr);
198 }
199
200 /**
201 * Resolved deserialized level to one of the stock instances.
202 * May be overriden in classes derived from Level.
203 * @return resolved object.
204 * @throws ObjectStreamException if exception during resolution.
205 */
206 private Object readResolve() throws ObjectStreamException {
207 //
208 // if the deserizalized object is exactly an instance of Level
209 //
210 if (getClass() == Level.class) {
211 return toLevel(level);
212 }
213 //
214 // extension of Level can't substitute stock item
215 //
216 return this;
217 }
218 }