Main Page | Class Hierarchy | Alphabetical List | Class List | 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         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         Servlet to allow modification of Logger details
00034 
00035 *******************************************************************************/
00036 
00037 class AdminServlet : Servlet
00038 {
00039         // our logging instance
00040         private static Logger log;
00041 
00042         /***********************************************************************
00043 
00044                 Set up the logger for this servlet
00045         
00046         ***********************************************************************/
00047 
00048         static this()
00049         {
00050                 log = Logger.getLogger ("mango.admin.AdminServlet");
00051         }
00052 
00053         /***********************************************************************
00054 
00055                 Instantiate a new logger, if one does not already exist.
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                 Set the level of a given logger, where logger name is in the 
00072                 request parameter 'logger'.
00073         
00074         ***********************************************************************/
00075   
00076         void setLoggerLevel(IServletRequest request, IServletResponse response, Logger.Level level)
00077         {
00078                 //set the given logger's level
00079                 char[] loggerName = request.getParameters.get("logger");
00080                 
00081                 // get the logger
00082                 Logger loggerToChange;
00083                 if (loggerName.length)
00084                     loggerToChange = Manager.getLogger(loggerName);
00085                 else
00086                    loggerToChange = Manager.getRootLogger();
00087 
00088                 //set the level on the logger
00089                 log.info("Setting logger " ~ loggerName ~ 
00090                          " to level " ~ Logger.LevelNames[level]);
00091                 loggerToChange.setLevel(level);
00092         }
00093 
00094 
00095         /***********************************************************************
00096 
00097                 Handle all the different request methods ...
00098         
00099         ***********************************************************************/
00100   
00101         void service (IServletRequest request, IServletResponse response)
00102         {   
00103                 // determine the action to take   
00104                 char[] action = request.getParameters().get("action");
00105                 
00106                 // if the action is null, then we are doing the default - list
00107                 if (action is null)
00108                     action = "L";
00109                 
00110                 switch (action[0])
00111                        {
00112                        // Add a logger
00113                        case 'A':
00114                             addLogger (request, response);
00115                             break;
00116 
00117                        // Set the logger level to TRACE
00118                        case 'T':
00119                             setLoggerLevel (request, response, Logger.Level.Trace);
00120                             break;
00121 
00122                        // Set the logger level to INFO
00123                        case 'I':
00124                             setLoggerLevel (request, response, Logger.Level.Info);
00125                             break;
00126 
00127                        // Set the logger level to WARN
00128                        case 'W':
00129                             setLoggerLevel (request, response, Logger.Level.Warn);
00130                             break;
00131 
00132                        // Set the logger level to ERROR
00133                        case 'E':
00134                             setLoggerLevel (request, response, Logger.Level.Error);
00135                             break;
00136 
00137                        // Set the logger level to FATAL
00138                        case 'F':
00139                             setLoggerLevel (request, response, Logger.Level.Fatal);
00140                             break;
00141 
00142                        // Set the logger level to NONE
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                    // now list the loggers for the next go round
00157                    log.trace ("request to logadmin with uri: " ~ uri.toString());
00158 
00159                 // say we're writing html
00160                 response.setContentType ("text/html");
00161 
00162                 IWriter writer = response.getWriter();
00163 
00164                 // write HTML preamble ...
00165                 writer.put ("<html><head><title>LogAdmin</title></head><body>");
00166 
00167                 //List out the currently defined Loggers
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                 //print a table row for each logger
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>&nbsp;</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                 // write HTML closure
00235                 writer.put ("</body></html>");
00236         }
00237 }
00238 
00239 
00240 
00241 /*******************************************************************************
00242 
00243         ServletContext prebuilt to include the AdminServlet.  Convenience class
00244         allowing a developer to drop this prebuilt context into an existing
00245         servlet engine.  Create a context with a name ("/admin', for example),
00246         and AdminContext will provide a "/logger" handler for modifying
00247         logging details.
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         Given an InternetAddress to bind to, a full admin server is built and
00269         deployed. Logging can then be configured at http://address/admin/logger
00270 
00271 *******************************************************************************/
00272 
00273 class AdminServer
00274 {
00275 
00276 }

Generated on Sun Nov 7 19:06:49 2004 for Mango by doxygen 1.3.6