00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 module mango.log.Admin;
00019
00020 private import mango.io.Uri;
00021
00022 private import mango.io.model.IWriter;
00023
00024 import mango.log.Logger,
00025 mango.log.Manager;
00026
00027 private import mango.servlet.Servlet,
00028 mango.servlet.ServletContext,
00029 mango.servlet.ServletProvider;
00030
00031
00032
00033
00034
00035
00036
00037 class AdminServlet : Servlet
00038 {
00039
00040 private static Logger log;
00041
00042
00043
00044
00045
00046
00047
00048 static this()
00049 {
00050 log = Logger.getLogger ("mango.admin.AdminServlet");
00051 }
00052
00053
00054
00055
00056
00057
00058
00059 void addLogger(IServletRequest request, IServletResponse response)
00060 {
00061 char[] loggerName = request.getParameters.get("logger");
00062 Logger.Level level = cast(Logger.Level) request.getParameters.getInt("level");
00063
00064 Logger loggerToChange = Manager.getLogger(loggerName);
00065 loggerToChange.setLevel(level);
00066 }
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 void setLoggerLevel(IServletRequest request, IServletResponse response, Logger.Level level)
00077 {
00078
00079 char[] loggerName = request.getParameters.get("logger");
00080
00081
00082 Logger loggerToChange;
00083 if (loggerName.length)
00084 loggerToChange = Manager.getLogger(loggerName);
00085 else
00086 loggerToChange = Manager.getRootLogger();
00087
00088
00089 log.info("Setting logger " ~ loggerName ~
00090 " to level " ~ Logger.LevelNames[level]);
00091 loggerToChange.setLevel(level);
00092 }
00093
00094
00095
00096
00097
00098
00099
00100
00101 void service (IServletRequest request, IServletResponse response)
00102 {
00103
00104 char[] action = request.getParameters().get("action");
00105
00106
00107 if (action is null)
00108 action = "L";
00109
00110 switch (action[0])
00111 {
00112
00113 case 'A':
00114 addLogger (request, response);
00115 break;
00116
00117
00118 case 'T':
00119 setLoggerLevel (request, response, Logger.Level.Trace);
00120 break;
00121
00122
00123 case 'I':
00124 setLoggerLevel (request, response, Logger.Level.Info);
00125 break;
00126
00127
00128 case 'W':
00129 setLoggerLevel (request, response, Logger.Level.Warn);
00130 break;
00131
00132
00133 case 'E':
00134 setLoggerLevel (request, response, Logger.Level.Error);
00135 break;
00136
00137
00138 case 'F':
00139 setLoggerLevel (request, response, Logger.Level.Fatal);
00140 break;
00141
00142
00143 case 'N':
00144 setLoggerLevel (request, response, Logger.Level.None);
00145 break;
00146
00147 default:
00148 break;
00149 }
00150
00151 Uri uri = request.getUri();
00152
00153 if (action != "L")
00154 response.sendRedirect("/admin/logger");
00155 else
00156
00157 log.trace ("request to logadmin with uri: " ~ uri.toString());
00158
00159
00160 response.setContentType ("text/html");
00161
00162 IWriter writer = response.getWriter();
00163
00164
00165 writer.put ("<html><head><title>LogAdmin</title></head><body>");
00166
00167
00168 writer.put("<h1>Mango Server Console - Logger Administrator</h1>"
00169 "<h2>Existing Loggers</h2><table border='1' cellpadding='3'>")
00170 .cr()
00171 .put("<tr><td>Logger Name</td>"
00172 "<td>Logger Level</td>"
00173 "<td colspan=\"6\">Change Level to:</td></tr>")
00174 .cr();
00175
00176
00177 foreach (Logger l; Manager.getHierarchy())
00178 {
00179 char[] name = l.getName();
00180 char[] label = name;
00181 if (label.length == 0)
00182 label = "ROOT";
00183
00184 int level = l.getLevel();
00185 writer.put("<tr><td><b>" ~ label ~ "</b> </td><td>" ~
00186 Logger.LevelNames[level] ~ "</td>");
00187
00188 for (int i = Logger.Level.min; i < Logger.Level.max + 1; i++)
00189 {
00190 writer.put("<td>");
00191 if (i == level)
00192 writer.put("<b>" ~ Logger.LevelNames[i] ~ "</b>");
00193 else
00194 writer.put("<a href=\"logger?action=" ~ Logger.LevelNames[i] ~
00195 "&logger=" ~ name ~
00196 "\">" ~ Logger.LevelNames[i] ~ "</a>");
00197 writer.put("</td>");
00198 }
00199
00200 writer.put("</tr>")
00201 .cr();
00202 }
00203
00204 writer.put("</table>")
00205 .cr()
00206 .put("<h2>Add a new logger</h2>")
00207 .cr()
00208 .put("<form method=\"get\" action=\"logger\">")
00209 .cr()
00210 .put("<input type=\"hidden\" name=\"action\" value=\"ADD\" />")
00211 .cr()
00212 .put("<table><tr><td>Logger Name:</td>" ~
00213 "<td>Level</td></tr><tr>" ~
00214 "<td><input type=\"text\" name=\"logger\" />")
00215 .cr()
00216 .put("</td><td><select name=\"level\">")
00217 .cr();
00218
00219 for (int i = Logger.Level.min; i < Logger.Level.max + 1; i++)
00220 {
00221 char[] levelStr = Logger.LevelNames[i];
00222 writer.put("<option value=\"");
00223 writer.put(i);
00224 writer.put("\">" ~ levelStr ~ "</option>")
00225 .cr();
00226 }
00227
00228 writer.put("</select></td></tr></table>"
00229 "<input type=\"submit\" name=\"submit\" value=\"Add Level\" />")
00230 .cr()
00231 .put("</form>")
00232 .cr();
00233
00234
00235 writer.put ("</body></html>");
00236 }
00237 }
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251 class AdminContext : ServletContext
00252 {
00253
00254 this (ServletProvider provider, char[] name)
00255 {
00256 super (name);
00257 provider.addContext (this);
00258 IRegisteredServlet logger = provider.addServlet (new AdminServlet(), "logger", this);
00259 provider.addMapping ("/logger", logger);
00260 }
00261
00262 }
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273 class AdminServer
00274 {
00275
00276 }