Logging Servlet for changing Log Level at Runtime - Log4j2

原创
2018/10/16 11:02
阅读数 155

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("&lt;");
                break;
            case '>':
                buf.append("&gt;");
                break;
            case '&':
                buf.append("&amp;");
                break;
            case '"':
                buf.append("&quot;");
                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("&amp;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>

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部