-
-
Save iamkristian/943918 to your computer and use it in GitHub Desktop.
| <%@ page language="java" contentType="text/html;charset=UTF-8" %> | |
| <%@ page import="org.apache.log4j.Level" %> | |
| <%@ page import="org.apache.log4j.LogManager" %> | |
| <%@ page import="org.apache.log4j.Logger" %> | |
| <%@ page import="java.util.HashMap" %> | |
| <%@ page import="java.util.Enumeration" %> | |
| <%@ page import="java.util.Set" %> | |
| <%@ page import="java.util.Arrays" %> | |
| <% | |
| /* This was originally suggested by Nelz on http://nelz.net/2008/04/08/log4j-runtime-configuration | |
| and maybe also in this zip as suggested in the comments | |
| https://web.archive.org/web/20051016184059/http://ftpna2.bea.com/pub/downloads/Log4jAdmin.zip | |
| This post is ancient - and if you believe System.currentTimeMillis() is proprietary or otherwise copies your work bad luck | |
| I don't have any example for log4j2 - don't use it and haven't used JSP for at least 13 years | |
| */ | |
| long beginPageLoadTime = System.currentTimeMillis();%> | |
| <html> | |
| <head> | |
| <title>Log4J Administration</title> | |
| <style type="text/css"> | |
| <!-- | |
| #content { | |
| margin: 0px; | |
| padding: 0px; | |
| text-align: center; | |
| background-color: #ccc; | |
| border: 1px solid #000; | |
| width: 100%; | |
| } | |
| body { | |
| position: relative; | |
| margin: 10px; | |
| padding: 0px; | |
| color: #333; | |
| } | |
| h1 { | |
| margin-top: 20px; | |
| font: 1.5em Verdana, Arial, Helvetica sans-serif; | |
| } | |
| h2 { | |
| margin-top: 10px; | |
| font: 0.75em Verdana, Arial, Helvetica sans-serif; | |
| text-align: left; | |
| } | |
| a, a:link, a:visited, a:active { | |
| color: red; | |
| text-decoration: none; | |
| text-transform: uppercase; | |
| } | |
| table { | |
| width: 100%; | |
| background-color: #000; | |
| padding: 3px; | |
| border: 0px; | |
| } | |
| th { | |
| font-size: 0.75em; | |
| background-color: #ccc; | |
| color: #000; | |
| padding-left: 5px; | |
| text-align: center; | |
| border: 1px solid #ccc; | |
| white-space: nowrap; | |
| } | |
| td { | |
| font-size: 0.75em; | |
| background-color: #fff; | |
| white-space: nowrap; | |
| } | |
| td.center { | |
| font-size: 0.75em; | |
| background-color: #fff; | |
| text-align: center; | |
| white-space: nowrap; | |
| } | |
| .filterForm { | |
| font-size: 0.9em; | |
| background-color: #000; | |
| color: #fff; | |
| padding-left: 5px; | |
| text-align: left; | |
| border: 1px solid #000; | |
| white-space: nowrap; | |
| } | |
| .filterText { | |
| font-size: 0.75em; | |
| background-color: #fff; | |
| color: #000; | |
| text-align: left; | |
| border: 1px solid #ccc; | |
| white-space: nowrap; | |
| } | |
| .filterButton { | |
| font-size: 0.75em; | |
| background-color: #000; | |
| color: #fff; | |
| padding-left: 5px; | |
| padding-right: 5px; | |
| text-align: center; | |
| border: 1px solid #ccc; | |
| width: 100px; | |
| white-space: nowrap; | |
| } | |
| --> | |
| </style> | |
| </head> | |
| <body onLoad="javascript:document.logFilterForm.logNameFilter.focus();"> | |
| <% | |
| String containsFilter = "Contains"; | |
| String beginsWithFilter = "Begins With"; | |
| String[] logLevels = {"debug", "info", "warn", "error", "fatal", "off"}; | |
| String targetOperation = (String) request.getParameter("operation"); | |
| String targetLogger = (String) request.getParameter("logger"); | |
| String targetLogLevel = (String) request.getParameter("newLogLevel"); | |
| String logNameFilter = (String) request.getParameter("logNameFilter"); | |
| String logNameFilterType = (String) request.getParameter("logNameFilterType"); | |
| %> | |
| <div id="content"> | |
| <h1>Log4J Administration</h1> | |
| <div class="filterForm"> | |
| <form action="log4jAdmin.jsp" name="logFilterForm">Filter Loggers: | |
| <input name="logNameFilter" type="text" size="50" value="<%=(logNameFilter == null ? "":logNameFilter)%>" | |
| class="filterText"/> | |
| <input name="logNameFilterType" type="submit" value="<%=beginsWithFilter%>" class="filterButton"/> | |
| <input name="logNameFilterType" type="submit" value="<%=containsFilter%>" class="filterButton"/> | |
| <input name="logNameClear" type="button" value="Clear" class="filterButton" | |
| onmousedown='javascript:document.logFilterForm.logNameFilter.value="";'/> | |
| <input name="logNameReset" type="reset" value="Reset" class="filterButton"/> | |
| <param name="operation" value="changeLogLevel"/> | |
| </form> | |
| </div> | |
| <table cellspacing="1"> | |
| <tr> | |
| <th width="25%">Logger</th> | |
| <th width="25%">Parent Logger</th> | |
| <th width="15%">Effective Level</th> | |
| <th width="35%">Change Log Level To</th> | |
| </tr> | |
| <% | |
| Enumeration loggers = LogManager.getCurrentLoggers(); | |
| HashMap loggersMap = new HashMap(128); | |
| Logger rootLogger = LogManager.getRootLogger(); | |
| if (!loggersMap.containsKey(rootLogger.getName())) { | |
| loggersMap.put(rootLogger.getName(), rootLogger); | |
| } | |
| while (loggers.hasMoreElements()) { | |
| Logger logger = (Logger) loggers.nextElement(); | |
| if (logNameFilter == null || logNameFilter.trim().length() == 0) { | |
| loggersMap.put(logger.getName(), logger); | |
| } else if (containsFilter.equals(logNameFilterType)) { | |
| if (logger.getName().toUpperCase().indexOf(logNameFilter.toUpperCase()) >= 0) { | |
| loggersMap.put(logger.getName(), logger); | |
| } | |
| } else { | |
| // Either was no filter in IF, contains filter in ELSE IF, or begins with in ELSE | |
| if (logger.getName().startsWith(logNameFilter)) { | |
| loggersMap.put(logger.getName(), logger); | |
| } | |
| } | |
| } | |
| Set loggerKeys = loggersMap.keySet(); | |
| String[] keys = new String[loggerKeys.size()]; | |
| keys = (String[]) loggerKeys.toArray(keys); | |
| Arrays.sort(keys, String.CASE_INSENSITIVE_ORDER); | |
| for (int i = 0; i < keys.length; i++) { | |
| Logger logger = (Logger) loggersMap.get(keys[i]); | |
| // MUST CHANGE THE LOG LEVEL ON LOGGER BEFORE GENERATING THE LINKS AND THE | |
| // CURRENT LOG LEVEL OR DISABLED LINK WON'T MATCH THE NEWLY CHANGED VALUES | |
| if ("changeLogLevel".equals(targetOperation) && targetLogger.equals(logger.getName())) { | |
| Logger selectedLogger = (Logger) loggersMap.get(targetLogger); | |
| selectedLogger.setLevel(Level.toLevel(targetLogLevel)); | |
| } | |
| String loggerName = null; | |
| String loggerEffectiveLevel = null; | |
| String loggerParent = null; | |
| if (logger != null) { | |
| loggerName = logger.getName(); | |
| loggerEffectiveLevel = String.valueOf(logger.getEffectiveLevel()); | |
| loggerParent = (logger.getParent() == null ? null : logger.getParent().getName()); | |
| } | |
| %> | |
| <tr> | |
| <td><%=loggerName%> | |
| </td> | |
| <td><%=loggerParent%> | |
| </td> | |
| <td><%=loggerEffectiveLevel%> | |
| </td> | |
| <td class="center"> | |
| <% | |
| for (int cnt = 0; cnt < logLevels.length; cnt++) { | |
| String url = "log4jAdmin.jsp?operation=changeLogLevel&logger=" + loggerName + "&newLogLevel=" + logLevels[cnt] + "&logNameFilter=" + (logNameFilter != null ? logNameFilter : "") + "&logNameFilterType=" + (logNameFilterType != null ? logNameFilterType : ""); | |
| if (logger.getLevel() == Level.toLevel(logLevels[cnt]) || logger.getEffectiveLevel() == Level.toLevel(logLevels[cnt])) { | |
| %> | |
| [<%=logLevels[cnt].toUpperCase()%>] | |
| <% | |
| } else { | |
| %> | |
| <a href='<%=url%>'>[<%=logLevels[cnt]%>]</a> | |
| <% | |
| } | |
| } | |
| %> | |
| </td> | |
| </tr> | |
| <% | |
| } | |
| %> | |
| </table> | |
| <h2> | |
| Revision: 1.0<br/> | |
| Page Load Time (Millis): <%=(System.currentTimeMillis() - beginPageLoadTime)%> | |
| </h2> | |
| </div> | |
| </body> | |
| </html> |
Which I thought I already did in my blog post, where this gist is used. I believe Nelz was first with a post on it in 2008.
OK, I am sorry. Google has found this gist and not your blog. Nice piece of code, thanks.
No worries ๐ I'm just glad you found the code you needed ๐
Thank you! I have created for logback https://gist.github.com/iaveryanov/792aa692de6f9f62294c
Hi, do we have same example for Log4j2 ? I tried doing by my own but seems the architecture has been changed a lot.
Give honor to whom (I suppose) it is due.
https://web.archive.org/web/20051016184059/http://ftpna2.bea.com/pub/downloads/Log4jAdmin.zip
Original JSP page with documentation from defunct BEA Systems site.
Last lines from original JSP page:
<h2>
Mike Amend<br />
BEA Systems<br />
Email: <a href="mailto:[email protected]">[email protected]</a><br />
Revision: 1.0<br />
Page Load Time (Millis): <%=(System.currentTimeMillis() - beginPageLoadTime)%>
</h2>Hi, do we have same example for Log4j2 ?
Looks like it's copied from http://ananthkannan.blogspot.cz/2009/10/how-to-change-log-levels-on-fly-using.html If so, it would be nice to mention the original source.