001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 package org.apache.hadoop.log; 019 020 import java.io.*; 021 import java.net.*; 022 import java.util.regex.Pattern; 023 024 import javax.servlet.*; 025 import javax.servlet.http.*; 026 027 import org.apache.commons.logging.*; 028 import org.apache.commons.logging.impl.*; 029 import org.apache.hadoop.classification.InterfaceAudience; 030 import org.apache.hadoop.classification.InterfaceStability; 031 import org.apache.hadoop.http.HttpServer; 032 import org.apache.hadoop.util.ServletUtil; 033 034 /** 035 * Change log level in runtime. 036 */ 037 @InterfaceStability.Evolving 038 public class LogLevel { 039 public static final String USAGES = "\nUSAGES:\n" 040 + "java " + LogLevel.class.getName() 041 + " -getlevel <host:port> <name>\n" 042 + "java " + LogLevel.class.getName() 043 + " -setlevel <host:port> <name> <level>\n"; 044 045 /** 046 * A command line implementation 047 */ 048 public static void main(String[] args) { 049 if (args.length == 3 && "-getlevel".equals(args[0])) { 050 process("http://" + args[1] + "/logLevel?log=" + args[2]); 051 return; 052 } 053 else if (args.length == 4 && "-setlevel".equals(args[0])) { 054 process("http://" + args[1] + "/logLevel?log=" + args[2] 055 + "&level=" + args[3]); 056 return; 057 } 058 059 System.err.println(USAGES); 060 System.exit(-1); 061 } 062 063 private static void process(String urlstring) { 064 try { 065 URL url = new URL(urlstring); 066 System.out.println("Connecting to " + url); 067 URLConnection connection = url.openConnection(); 068 connection.connect(); 069 070 BufferedReader in = new BufferedReader(new InputStreamReader( 071 connection.getInputStream())); 072 for(String line; (line = in.readLine()) != null; ) 073 if (line.startsWith(MARKER)) { 074 System.out.println(TAG.matcher(line).replaceAll("")); 075 } 076 in.close(); 077 } catch (IOException ioe) { 078 System.err.println("" + ioe); 079 } 080 } 081 082 static final String MARKER = "<!-- OUTPUT -->"; 083 static final Pattern TAG = Pattern.compile("<[^>]*>"); 084 085 /** 086 * A servlet implementation 087 */ 088 @InterfaceAudience.LimitedPrivate({"HDFS", "MapReduce"}) 089 @InterfaceStability.Unstable 090 public static class Servlet extends HttpServlet { 091 private static final long serialVersionUID = 1L; 092 093 public void doGet(HttpServletRequest request, HttpServletResponse response 094 ) throws ServletException, IOException { 095 096 // Do the authorization 097 if (!HttpServer.hasAdministratorAccess(getServletContext(), request, 098 response)) { 099 return; 100 } 101 102 PrintWriter out = ServletUtil.initHTML(response, "Log Level"); 103 String logName = ServletUtil.getParameter(request, "log"); 104 String level = ServletUtil.getParameter(request, "level"); 105 106 if (logName != null) { 107 out.println("<br /><hr /><h3>Results</h3>"); 108 out.println(MARKER 109 + "Submitted Log Name: <b>" + logName + "</b><br />"); 110 111 Log log = LogFactory.getLog(logName); 112 out.println(MARKER 113 + "Log Class: <b>" + log.getClass().getName() +"</b><br />"); 114 if (level != null) { 115 out.println(MARKER + "Submitted Level: <b>" + level + "</b><br />"); 116 } 117 118 if (log instanceof Log4JLogger) { 119 process(((Log4JLogger)log).getLogger(), level, out); 120 } 121 else if (log instanceof Jdk14Logger) { 122 process(((Jdk14Logger)log).getLogger(), level, out); 123 } 124 else { 125 out.println("Sorry, " + log.getClass() + " not supported.<br />"); 126 } 127 } 128 129 out.println(FORMS); 130 out.println(ServletUtil.HTML_TAIL); 131 } 132 133 static final String FORMS = "\n<br /><hr /><h3>Get / Set</h3>" 134 + "\n<form>Log: <input type='text' size='50' name='log' /> " 135 + "<input type='submit' value='Get Log Level' />" 136 + "</form>" 137 + "\n<form>Log: <input type='text' size='50' name='log' /> " 138 + "Level: <input type='text' name='level' /> " 139 + "<input type='submit' value='Set Log Level' />" 140 + "</form>"; 141 142 private static void process(org.apache.log4j.Logger log, String level, 143 PrintWriter out) throws IOException { 144 if (level != null) { 145 if (!level.equals(org.apache.log4j.Level.toLevel(level).toString())) { 146 out.println(MARKER + "Bad level : <b>" + level + "</b><br />"); 147 } else { 148 log.setLevel(org.apache.log4j.Level.toLevel(level)); 149 out.println(MARKER + "Setting Level to " + level + " ...<br />"); 150 } 151 } 152 out.println(MARKER 153 + "Effective level: <b>" + log.getEffectiveLevel() + "</b><br />"); 154 } 155 156 private static void process(java.util.logging.Logger log, String level, 157 PrintWriter out) throws IOException { 158 if (level != null) { 159 log.setLevel(java.util.logging.Level.parse(level)); 160 out.println(MARKER + "Setting Level to " + level + " ...<br />"); 161 } 162 163 java.util.logging.Level lev; 164 for(; (lev = log.getLevel()) == null; log = log.getParent()); 165 out.println(MARKER + "Effective level: <b>" + lev + "</b><br />"); 166 } 167 } 168 }