Last active
May 3, 2023 05:04
-
-
Save iamkristian/943918 to your computer and use it in GitHub Desktop.
Change log4j log levels runtime from a jsp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<%@ 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> |
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 ?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
No worries 😄 I'm just glad you found the code you needed 👍