當前位置:
首頁 > 知識 > Logging Servlet for changing Log Level at Runtime-Log4j2

Logging Servlet for changing Log Level at Runtime-Log4j2

import java.io.IOException;

import java.io.PrintWriter;

import java.net.URLEncoder;

import java.util.ArrayList;

import java.util.Collection;

import java.util.Collections;

import java.util.HashSet;

import java.util.Set;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.logging.log4j.Level;

import org.apache.logging.log4j.LogManager;

import org.apache.logging.log4j.core.LoggerContext;

import org.apache.logging.log4j.core.config.Configurator;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

public class LoggingV2 extends HttpServlet{

private static final long serialVersionUID = 1L;

private static final Logger logger = LoggerFactory.getLogger(LoggingV2.class);

private static final LoggerContext LOGGER_CONTEXT = (LoggerContext) LogManager.getContext(LoggingV2.class.getClassLoader() , false);

StringBuilder sBuilder = new StringBuilder();

public String REQ_PARAM_ACTION = "action";

public String REQ_PARAM_CATEGORY = "cat";

public String REQ_PARAM_PRIORITY = "priority";

public String REQ_ACTION_EDIT = "edit";

public String REQ_ACTION_LIST = "list";

public String REQ_ACTION_SET = "set";

public void doGet(HttpServletRequest request , HttpServletResponse response)

throws ServletException, IOException{

response.setContentType("text/html");

PrintWriter writer = response.getWriter();

StringBuilder stringBuilder = new StringBuilder(200);

renderHead(stringBuilder);

String action = request.getParameter(REQ_PARAM_ACTION);

if (action == null)

action = "";

action = action.trim().toLowerCase();

stringBuilder.append("<!-- REQ_ACTION: " + REQ_ACTION_SET + " -->");

stringBuilder.append("<!-- ACTION: " + action + " -->");

String REQ_PARAM_CATEGORY_VAL = request.getParameter(REQ_PARAM_CATEGORY);

String REQ_PARAM_PRIORITY_VAL = request.getParameter(REQ_PARAM_PRIORITY);

stringBuilder.append("<!-- CATEGORY: " + REQ_PARAM_CATEGORY_VAL + " -->");

stringBuilder.append("<!-- PRIORITY: " + REQ_PARAM_PRIORITY_VAL + " -->");

if (action.equals(REQ_ACTION_SET)) {

setPriority(request, stringBuilder);

renderCategoryList(request, stringBuilder);

} else if (action.equals(REQ_ACTION_EDIT)) {

renderEditForm(request, stringBuilder);

} else {

renderCategoryList(request, stringBuilder);

}

renderFoot(stringBuilder);

writer.write(stringBuilder.toString());

}

public String simpleEncode(String string) {

if (string == null)

return null;

int len = string.length();

if (len == 0)

return string;

StringBuilder buf = new StringBuilder((int) (len * 1.25f));

for (int i = 0; i < len; ++i) {

char c = string.charAt(i);

switch (c) {

case "<":

buf.append("<");

break;

case ">":

buf.append(">");

break;

case "&":

buf.append("&");

break;

case """:

buf.append(""");

break;

default:

buf.append(c);

break;

}

}

return buf.toString();

}

public boolean isBlank(String s) {

if (s == null)

return true;

if (s.trim().equals(""))

return true;

return false;

}

public void setPriority(HttpServletRequest r, StringBuilder builder) {

String scat = r.getParameter(REQ_PARAM_CATEGORY);

String spri = r.getParameter(REQ_PARAM_PRIORITY);

if (scat != null)

scat = scat.trim();

Logger log = null;

Level pri = null;

if (!isBlank(spri)) {

pri = Level.toLevel(spri, null);

}

builder.append("<!-- pri=" + pri + " -->");

if (!isBlank(scat) && !scat.equals("root")) {

Configurator.setLevel(scat, pri);

logger.info(String.format("Setting "%s" to level [%s]", scat, pri));

} else {

if (pri != null) {

Configurator.setRootLevel(pri);

logger.info(String.format("Setting "%s" to level [%s]", scat, pri));

}

}

}

public void renderCategoryList(HttpServletRequest r, StringBuilder stringBuilder) {

String scriptName = getScriptName(r);

stringBuilder.append("<form method=get action="");

stringBuilder.append(scriptName);

stringBuilder.append(""><table cellspacing=0 cellpadding=1>");

stringBuilder.append("<tr><td><b>Logger</b></td><td><b>Level</b></td></tr>");

stringBuilder.append("<tr><td><hr noshade size=1></td><td><hr noshade size=1></td></tr>");

stringBuilder.append("");

printCategory(getRootLogger(), scriptName, stringBuilder);

Collection<org.apache.logging.log4j.core.Logger> loggers = LOGGER_CONTEXT.getLoggers();

Set<String> a = new HashSet<>();

for(org.apache.logging.log4j.core.Logger log : loggers) {

if(log != getRootLogger())

a.add(log.getName());

}

ArrayList<String> list = new ArrayList<>(a.size());

list.addAll(a);

Collections.sort(list);

for (String logName : list) {

printCategory(LOGGER_CONTEXT.getLogger(logName), scriptName, stringBuilder);

}

stringBuilder.append("<tr><td><hr noshade size=1></td><td><hr noshade size=1></td></tr>");

stringBuilder.append("</table>");

stringBuilder.append("<input type=submit name=action value="Reload">");

stringBuilder.append("<input type=submit name=action value=" Edit "></form>");

}

/**

* Render a single category row within a category list.

*/

public void printCategory(org.apache.logging.log4j.core.Logger log, String scriptName, StringBuilder builder) {

boolean isInherited = log.getLevel() == null;

String catName = (log == LogManager.getRootLogger() ? "root" : log.getName());

builder.append("<tr><td><b><tt><a href="");

builder.append(scriptName);

builder.append("?action=");

builder.append(REQ_ACTION_EDIT);

builder.append("&cat=");

try {

builder.append(URLEncoder.encode(catName, "UTF-8"));

} catch (java.io.UnsupportedEncodingException uee) {

// should not get here

}

builder.append("">");

builder.append(simpleEncode(catName));

builder.append("</a>");

builder.append("</tt></b></td><td>");

if (isInherited) {

builder.append("<i>");

} else {

builder.append("<b>");

}

builder.append(log.getLevel().name());

if (isInherited) {

builder.append("<i>");

} else {

builder.append("<b>");

}

builder.append("</td></tr>");

}

/**

* Render category edit form.

*/

public void renderEditForm(HttpServletRequest r, StringBuilder builder){

String scriptName = getScriptName(r);

builder.append("<form method=get action="");

builder.append(scriptName);

builder.append("">");

org.apache.logging.log4j.core.Logger log = getCategory(r.getParameter(REQ_PARAM_CATEGORY));

Level pri = log.getLevel();

String spri = null;

if (pri == null) {

pri = LOGGER_CONTEXT.getLogger(this.getClass().getName()).getLevel();

spri = "";

} else {

spri = pri.toString();

}

builder.append("<table border=0>");

builder.append("<tr valign=top>");

builder.append("<td align=right><b>Category:</b></td>");

builder.append("<td align=left>");

builder.append("<input type=text size=50 name=cat value="");

if(log == getRootLogger()) {

builder.append(simpleEncode("root"));

}else {

builder.append(simpleEncode(log.getName()));

}

builder.append(""></td></tr>");

builder.append("<tr valign=top>");

builder.append("<td align=right><b>Level:</b></td>");

builder.append("<td align=left><select name=priority>");

printPriorityOption(builder, "OFF", "OFF", spri);

printPriorityOption(builder, "FATAL", "FATAL", spri);

printPriorityOption(builder, "ERROR", "ERROR", spri);

printPriorityOption(builder, "WARN", "WARN", spri);

printPriorityOption(builder, "INFO", "INFO", spri);

printPriorityOption(builder, "DEBUG", "DEBUG", spri);

printPriorityOption(builder, "TRACE", "TRACE", spri);

printPriorityOption(builder, "ALL", "ALL", spri);

builder.append("</select></td></tr>");

builder.append("</table>");

builder.append("<input type=submit name=action value=" Set ">");

builder.append("<input type=submit name=action value="Cancel">");

builder.append("</form>");

}

public void printPriorityOption(StringBuilder builder, String label, String value, String curValue) {

builder.append("<option value="");

builder.append(value);

builder.append(""");

if (curValue != null && curValue.equals(value)) {

builder.append(" selected");

}

builder.append(">");

builder.append(label);

builder.append("</option>");

}

public void renderHead(StringBuilder builder) {

builder.append("<html><body>");

}

public void renderFoot(StringBuilder builder) {

builder.append("</body></html>


Logging Servlet for changing Log Level at Runtime-Log4j2

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

獲取一個字元串值在指定字元串第n次出現的位置

TAG:程序員小新人學習 |