* configlogging.jsp:

- Add easy way to add an override
      - Make file size specifier more flexible
This commit is contained in:
zzz
2010-10-07 18:39:03 +00:00
parent 86a7d68f08
commit a23ea5e5f1
4 changed files with 118 additions and 27 deletions

View File

@ -17,6 +17,8 @@ public class ConfigLoggingHandler extends FormHandler {
private String _recordFormat;
private String _dateFormat;
private String _fileSize;
private String _newLogClass;
private String _newLogLevel = "WARN";
@Override
protected void processForm() {
@ -48,6 +50,18 @@ public class ConfigLoggingHandler extends FormHandler {
_fileSize = (size != null ? size.trim() : null);
}
/** @since 0.8.1 */
public void setNewlogclass(String s) {
if (s != null && s.length() > 0)
_newLogClass = s;
}
/** @since 0.8.1 */
public void setNewloglevel(String s) {
if (s != null)
_newLogLevel = s;
}
/**
* The user made changes to the config and wants to save them, so
* lets go ahead and do so.
@ -56,14 +70,18 @@ public class ConfigLoggingHandler extends FormHandler {
private void saveChanges() {
boolean shouldSave = false;
if (_levels != null) {
if (_levels != null || _newLogClass != null) {
try {
Properties props = new Properties();
if (_levels != null)
props.load(new ByteArrayInputStream(_levels.getBytes()));
if (_newLogClass != null)
props.setProperty(_newLogClass, _newLogLevel);
_context.logManager().setLimits(props);
shouldSave = true;
addFormNotice("Log limits updated");
addFormNotice(_("Log overrides updated"));
} catch (IOException ioe) {
// shouldn't ever happen (BAIS shouldnt cause an IOE)
_context.logManager().getLog(ConfigLoggingHandler.class).error("Error reading from the props?", ioe);
addFormError("Error updating the log limits - levels not valid");
}
@ -83,7 +101,7 @@ public class ConfigLoggingHandler extends FormHandler {
}
}
if (_dateFormat != null) {
if (_dateFormat != null && !_dateFormat.equals(_context.logManager().getDateFormatPattern())) {
boolean valid = _context.logManager().setDateFormat(_dateFormat);
if (valid) {
shouldSave = true;
@ -139,7 +157,7 @@ public class ConfigLoggingHandler extends FormHandler {
boolean saved = _context.logManager().saveConfig();
if (saved)
addFormNotice("Log configuration saved and applied successfully");
addFormNotice(_("Log configuration saved"));
else
addFormNotice("Error saving the configuration (applied but not saved) - please see the error logs");
}

View File

@ -1,9 +1,13 @@
package net.i2p.router.web;
import java.util.List;
import java.util.Iterator;
import java.util.Properties;
import java.util.Set;
import java.util.TreeSet;
import net.i2p.data.DataHelper;
import net.i2p.util.Log;
public class ConfigLoggingHelper extends HelperBase {
public ConfigLoggingHelper() {}
@ -19,18 +23,13 @@ public class ConfigLoggingHelper extends HelperBase {
}
public String getMaxFileSize() {
int bytes = _context.logManager().getFileSize();
if (bytes == 0) return "1m";
if (bytes > 1024*1024*1024)
return (bytes/(1024*1024*1024)) + "g";
else if (bytes > 1024*1024)
return (bytes/(1024*1024)) + "m";
else
return (bytes/(1024)) + "k";
if (bytes <= 0) return "1 MB";
return DataHelper.formatSize2(bytes) + 'B';
}
public String getLogLevelTable() {
StringBuilder buf = new StringBuilder(32*1024);
Properties limits = _context.logManager().getLimits();
TreeSet sortedLogs = new TreeSet();
TreeSet<String> sortedLogs = new TreeSet();
for (Iterator iter = limits.keySet().iterator(); iter.hasNext(); ) {
String prefix = (String)iter.next();
sortedLogs.add(prefix);
@ -46,6 +45,20 @@ public class ConfigLoggingHelper extends HelperBase {
buf.append("<i>" + _("Add additional logging statements above. Example: net.i2p.router.tunnel=WARN") + "</i><br>");
buf.append("<i>" + _("Or put entries in the logger.config file. Example: logger.record.net.i2p.router.tunnel=WARN") + "</i><br>");
buf.append("<i>" + _("Valid levels are DEBUG, INFO, WARN, ERROR, CRIT") + "</i>\n");
/****
// this is too big and ugly
if (limits.size() <= 0)
return "";
buf.append("<table>");
for (String prefix : sortedLogs) {
buf.append("<tr><td>").append(prefix).append("</td><td>");
String level = limits.getProperty(prefix);
buf.append(getLogLevelBox("level-" + prefix, level, true)).append("</td></tr>");
}
buf.append("</table>");
****/
return buf.toString();
}
@ -53,18 +66,69 @@ public class ConfigLoggingHelper extends HelperBase {
public String getDefaultLogLevelBox() {
String cur = _context.logManager().getDefaultLimit();
return getLogLevelBox("defaultloglevel", cur, false);
}
private String getLogLevelBox(String name, String cur, boolean showRemove) {
StringBuilder buf = new StringBuilder(128);
buf.append("<select name=\"defaultloglevel\">\n");
buf.append("<select name=\"").append(name).append("\">\n");
for (int i = 0; i < levels.length; i++) {
String l = levels[i];
buf.append("<option value=\"").append(l).append("\" ");
buf.append("<option value=\"").append(l).append('\"');
if (l.equals(cur))
buf.append(" selected=\"true\"");
buf.append('>').append(_(l)).append("</option>\n");
}
if (showRemove)
buf.append("<option value=\"remove\">").append(_("Remove")).append("</option>");
buf.append("</select>\n");
return buf.toString();
}
/**
* All the classes the log manager knows about, except ones that
* already have overrides
* @since 0.8.1
*/
public String getNewClassBox() {
List<Log> logs = _context.logManager().getLogs();
Set limits = _context.logManager().getLimits().keySet();
TreeSet<String> sortedLogs = new TreeSet();
for (Log log : logs) {
String name = log.getName();
if (!limits.contains(name))
sortedLogs.add(name);
// add higher classes of length 3 or more
int dots = 0;
int lastdot = -1;
int nextdot = 0;
while ((nextdot = name.indexOf('.', lastdot + 1)) > 0) {
if (++dots >= 3) {
String subst = name.substring(0, nextdot);
if (!limits.contains(subst))
sortedLogs.add(subst);
}
lastdot = nextdot;
}
}
StringBuilder buf = new StringBuilder(65536);
buf.append("<select name=\"newlogclass\">\n" +
"<option value=\"\" selected=\"true\">")
.append(_("Select a class to add"))
.append("</option>\n");
for (String l : sortedLogs) {
buf.append("<option value=\"").append(l).append("\">")
.append(l).append("</option>\n");
}
buf.append("</select>\n");
buf.append(getLogLevelBox("newloglevel", "WARN", false));
return buf.toString();
}
}

View File

@ -46,6 +46,8 @@
</i></td>
</tr><tr><td class="mediumtags" align="right"><b><%=intl._("Log level overrides")%>:</b></td>
<td><jsp:getProperty name="logginghelper" property="logLevelTable" /></td>
</tr><tr><td class="mediumtags" align="right"><b><%=intl._("New override")%>:</b></td>
<td><jsp:getProperty name="logginghelper" property="newClassBox" /></td>
</tr><tr><td colspan="2"><hr></td>
</tr><tr class="tablefooter"><td colspan="2"> <div class="formaction">
<input type="reset" value="<%=intl._("Cancel")%>" >

View File

@ -156,7 +156,7 @@ public class LogManager {
return rv;
}
/** @deprecated unused */
/** now used by ConfigLogingHelper */
public List<Log> getLogs() {
return new ArrayList(_logs.values());
}
@ -415,15 +415,21 @@ public class LogManager {
/**
* Determine how many bytes are in the given formatted string (5m, 60g, 100k, etc)
*
* Size may be k, m, or g; a trailing b is ignored. Upper-case is allowed.
* Spaces between the number and letter is are allowed.
* The number may be in floating point.
* 4096 min, 2 GB max (returns int)
*/
public int getFileSize(String size) {
int sz = -1;
public static int getFileSize(String size) {
try {
String v = size;
char mod = size.toUpperCase().charAt(size.length() - 1);
if (!Character.isDigit(mod)) v = size.substring(0, size.length() - 1);
int val = Integer.parseInt(v);
String v = size.trim().toUpperCase();
if (v.length() < 2)
return -1;
if (v.endsWith("B"))
v = v.substring(0, v.length() - 1);
char mod = v.charAt(v.length() - 1);
if (!Character.isDigit(mod)) v = v.substring(0, v.length() - 1);
double val = Double.parseDouble(v);
switch (mod) {
case 'K':
val *= 1024;
@ -438,10 +444,11 @@ public class LogManager {
// blah, noop
break;
}
return val;
if (val < 4096 || val > Integer.MAX_VALUE)
return -1;
return (int) val;
} catch (Throwable t) {
System.err.println("Error parsing config for filesize: [" + size + "]");
t.printStackTrace();
return -1;
}
}