Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members | Related Pages

Admin.d

Go to the documentation of this file.
00001 /******************************************************************************
00002 
00003         @file Admin.d
00004 
00005         Classes for administration of logging from a Servlet Engine.
00006 
00007         AdminServlet can be used to modify logging details.
00008       
00009         AdminContext is a pre-built ServletContext that includes AdminServlet
00010 
00011         AdminServer is a pre-built server that allows logging administration.
00012         Simply instantiate it with an InternetAddress to bind to.
00013         
00014         Scott Sanders, June 3, 2004
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 private import  mango.log.Logger,
00025                 mango.log.Event,
00026                 mango.log.Manager;
00027 
00028 private import  mango.servlet.Servlet,
00029                 mango.servlet.ServletContext,
00030                 mango.servlet.ServletProvider;
00031 
00032 /*******************************************************************************
00033 
00034         Servlet to allow modification of Logger details
00035 
00036 *******************************************************************************/
00037 
00038 class AdminServlet : Servlet
00039 {
00040         // our logging instance
00041         private Logger log;
00042 
00043         /***********************************************************************
00044 
00045                 Set up the logger for this servlet
00046         
00047         ***********************************************************************/
00048 
00049         this()
00050         {
00051                 log = Logger.getLogger ("mango.admin.AdminServlet");
00052         }
00053 
00054         /***********************************************************************
00055 
00056                 Instantiate a new logger, if one does not already exist.
00057         
00058         ***********************************************************************/
00059   
00060         void addLogger(IServletRequest request, IServletResponse response)
00061         {
00062                 char[] loggerName = request.getParameters.get("logger");
00063                 Logger.Level level = cast(Logger.Level) request.getParameters.getInt("level");
00064                 
00065                 Logger loggerToChange = Manager.getLogger(loggerName);
00066                 loggerToChange.setLevel(level);
00067         }
00068 
00069    
00070         /***********************************************************************
00071 
00072                 Set the level of a given logger, where logger name is in the 
00073                 request parameter 'logger'.
00074         
00075         ***********************************************************************/
00076   
00077         void setLoggerLevel(IServletRequest request, IServletResponse response, Logger.Level level)
00078         {
00079                 //set the given logger's level
00080                 char[] loggerName = request.getParameters.get("logger");
00081                 
00082                 // get the logger
00083                 Logger loggerToChange;
00084                 if (loggerName.length)
00085                     loggerToChange = Manager.getLogger(loggerName);
00086                 else
00087                    loggerToChange = Manager.getRootLogger();
00088 
00089                 //set the level on the logger
00090                 log.info("Setting logger " ~ loggerName ~ 
00091                          " to level " ~ Event.LevelNames[level]);
00092                 loggerToChange.setLevel(level);
00093         }
00094 
00095 
00096         /***********************************************************************
00097 
00098                 Handle all the different request methods ...
00099         
00100         ***********************************************************************/
00101   
00102         void service (IServletRequest request, IServletResponse response)
00103         {   
00104                 // determine the action to take   
00105                 char[] action = request.getParameters().get("action");
00106                 
00107                 // if the action is null, then we are doing the default - list
00108                 if (action is null)
00109                     action = "L";
00110                 
00111                 switch (action[0])
00112                        {
00113                        // Add a logger
00114                        case 'A':
00115                             addLogger (request, response);
00116                             break;
00117 
00118                        // Set the logger level to TRACE
00119                        case 'T':
00120                             setLoggerLevel (request, response, Logger.Level.Trace);
00121                             break;
00122 
00123                        // Set the logger level to INFO
00124                        case 'I':
00125                             setLoggerLevel (request, response, Logger.Level.Info);
00126                             break;
00127 
00128                        // Set the logger level to WARN
00129                        case 'W':
00130                             setLoggerLevel (request, response, Logger.Level.Warn);
00131                             break;
00132 
00133                        // Set the logger level to ERROR
00134                        case 'E':
00135                             setLoggerLevel (request, response, Logger.Level.Error);
00136                             break;
00137 
00138                        // Set the logger level to FATAL
00139                        case 'F':
00140                             setLoggerLevel (request, response, Logger.Level.Fatal);
00141                             break;
00142 
00143                        // Set the logger level to NONE
00144                        case 'N':
00145                             setLoggerLevel (request, response, Logger.Level.None);
00146                             break;
00147                        
00148                        default:
00149                             break;
00150                        }
00151                 
00152                 Uri uri = request.getUri();
00153 
00154                 if (action != "L")
00155                     response.sendRedirect("/admin/logger");
00156                 else
00157                    // now list the loggers for the next go round
00158                    log.trace ("request to logadmin with uri: " ~ uri.toString());
00159 
00160                 // say we're writing html
00161                 response.setContentType ("text/html");
00162 
00163                 IWriter writer = response.getWriter();
00164 
00165                 // write HTML preamble ...
00166                 writer.put ("<html><head><title>LogAdmin</title></head><body>");
00167 
00168                 //List out the currently defined Loggers
00169                 writer.put("<h1>Mango Server Console - Logger Administrator</h1>" 
00170                            "<h2>Existing Loggers</h2><table border='1' cellpadding='3'>")
00171                       .cr()
00172                       .put("<tr><td>Logger Name</td>" 
00173                            "<td>Logger Level</td>"  
00174                            "<td colspan=\"6\">Change Level to:</td></tr>")
00175                       .cr();
00176 
00177                 //print a table row for each logger
00178                 foreach (Logger l; Manager.getHierarchy())
00179                 {
00180                         char[] name = l.getName();
00181                         char[] label = name;
00182                         if (label.length == 0)
00183                            label = "ROOT";
00184 
00185                         int level = l.getLevel();
00186                         writer.put("<tr><td><b>" ~ label ~ "</b>&nbsp;</td><td>" ~ 
00187                                    Event.LevelNames[level] ~ "</td>");
00188 
00189                         for (int i = Logger.Level.min; i < Logger.Level.max + 1; i++)
00190                         {
00191                             writer.put("<td>");
00192                             if (i == level)
00193                                 writer.put("<b>" ~ Event.LevelNames[i] ~ "</b>");
00194                             else
00195                               writer.put("<a href=\"logger?action=" ~ Event.LevelNames[i] ~ 
00196                                          "&logger=" ~ name ~ 
00197                                          "\">" ~ Event.LevelNames[i] ~ "</a>");
00198                             writer.put("</td>");
00199                         }
00200                                    
00201                         writer.put("</tr>")
00202                               .cr();
00203                 }
00204 
00205                 writer.put("</table>")
00206                       .cr()
00207                       .put("<h2>Add a new logger</h2>")
00208                       .cr()
00209                       .put("<form method=\"get\" action=\"logger\">")
00210                       .cr()
00211                       .put("<input type=\"hidden\" name=\"action\" value=\"ADD\" />")
00212                       .cr()
00213                       .put("<table><tr><td>Logger Name:</td>" ~ 
00214                            "<td>Level</td></tr><tr>" ~ 
00215                            "<td><input type=\"text\" name=\"logger\" />")
00216                       .cr()
00217                       .put("</td><td><select name=\"level\">")
00218                       .cr();
00219 
00220                 for (int i = Logger.Level.min; i < Logger.Level.max + 1; i++)
00221                 {
00222                      char[] levelStr = Event.LevelNames[i];
00223                      writer.put("<option value=\"");
00224                      writer.put(i);
00225                      writer.put("\">" ~ levelStr ~ "</option>")
00226                            .cr();
00227                 }       
00228    
00229                 writer.put("</select></td></tr></table>" 
00230                            "<input type=\"submit\" name=\"submit\" value=\"Add Level\" />")
00231                       .cr()
00232                       .put("</form>")
00233                       .cr();
00234 
00235                 // write HTML closure
00236                 writer.put ("</body></html>");
00237         }
00238 }
00239 
00240 
00241 
00242 /*******************************************************************************
00243 
00244         ServletContext prebuilt to include the AdminServlet.  Convenience class
00245         allowing a developer to drop this prebuilt context into an existing
00246         servlet engine.  Create a context with a name ("/admin', for example),
00247         and AdminContext will provide a "/logger" handler for modifying
00248         logging details.
00249 
00250 *******************************************************************************/
00251 
00252 class AdminContext : ServletContext
00253 {
00254 
00255         this (ServletProvider provider, char[] name)
00256         {
00257                 super (name);
00258                 provider.addContext (this);
00259                 IRegisteredServlet logger = provider.addServlet (new AdminServlet(), "logger", this);
00260                 provider.addMapping ("/logger", logger);
00261         }
00262 
00263 }
00264 
00265 
00266 
00267 /*******************************************************************************
00268 
00269         Given an InternetAddress to bind to, a full admin server is built and
00270         deployed. Logging can then be configured at http://address/admin/logger
00271 
00272 *******************************************************************************/
00273 
00274 class AdminServer
00275 {
00276 
00277 }

Generated on Fri Nov 11 18:44:18 2005 for Mango by  doxygen 1.4.0