001: /*
002: This software is OSI Certified Open Source Software.
003: OSI Certified is a certification mark of the Open Source Initiative.
004:
005: The license (Mozilla version 1.0) can be read at the MMBase site.
006: See http://www.MMBase.org/license
007:
008: */
009:
010: package org.mmbase.util.logging.log4j;
011:
012: import org.mmbase.util.logging.Logging;
013: import org.apache.log4j.helpers.FormattingInfo;
014: import org.apache.log4j.helpers.PatternConverter;
015: import org.apache.log4j.helpers.PatternParser;
016: import org.apache.log4j.spi.LoggingEvent;
017:
018: /**
019: * Adds several conversion patterns to the ones supported natively by log4j.
020: * See <a href="http://logging.apache.org/log4j/docs/api/org/apache/log4j/PatternLayout.html">log4j pattern layout</a>
021: <table>
022: <tr><th>Conversion Pattern</th><th>Effect</th></tr>
023: <tr><td>%q</td><td>A truncated level (from the _end_, not from the beginning as log4j's %p itself would do) . To 3 chars.</td></tr>
024: <tr><td>%k</td><td>Currently memory in use (in kb).</td></tr>
025: <tr><td>%N</td><td>Machine Name of current MMBase (or 'localhost' if not set).</td></tr>
026: </table>
027: * @author Michiel Meeuwissen
028: * @since MMBase-1.6
029: * @version $Id: MMPatternParser.java,v 1.10 2007/11/19 15:26:09 michiel Exp $
030: */
031: public class MMPatternParser extends PatternParser {
032:
033: public MMPatternParser(String pattern) {
034: super (pattern);
035: }
036:
037: public void finalizeConverter(char c) {
038: if (c == 'q') {
039: addConverter(new TruncatedLevelPatternConverter(
040: formattingInfo));
041: currentLiteral.setLength(0);
042: } else if (c == 'k') {
043: addConverter(new MemoryPatternConverter(formattingInfo));
044: currentLiteral.setLength(0);
045: } else if (c == 'N') {
046: addConverter(new MachineNamePatternConverter(formattingInfo));
047: currentLiteral.setLength(0);
048: } else if (c == 'T') {
049: addConverter(new ThreadGroupPatternConverter(formattingInfo));
050: currentLiteral.setLength(0);
051: } else {
052: super .finalizeConverter(c);
053: }
054: }
055:
056: private static class TruncatedLevelPatternConverter extends
057: PatternConverter {
058: TruncatedLevelPatternConverter(FormattingInfo formattingInfo) {
059: super (formattingInfo);
060: }
061:
062: public String convert(LoggingEvent event) {
063: return event.getLevel().toString().substring(0, 3);
064: }
065: }
066:
067: private static class MemoryPatternConverter extends
068: PatternConverter {
069: MemoryPatternConverter(FormattingInfo formattingInfo) {
070: super (formattingInfo);
071: }
072:
073: public String convert(LoggingEvent event) {
074: Runtime rt = Runtime.getRuntime();
075: return "" + (rt.totalMemory() - rt.freeMemory()) / 1024;
076: }
077: }
078:
079: /**
080: * @since MMBase-1.8
081: */
082: private static class MachineNamePatternConverter extends
083: PatternConverter {
084: MachineNamePatternConverter(FormattingInfo formattingInfo) {
085: super (formattingInfo);
086: }
087:
088: public String convert(LoggingEvent event) {
089: return "" + Logging.getMachineName();
090: }
091: }
092:
093: /**
094: * @since MMBase-1.9
095: */
096: private static class ThreadGroupPatternConverter extends
097: PatternConverter {
098: ThreadGroupPatternConverter(FormattingInfo formattingInfo) {
099: super (formattingInfo);
100: }
101:
102: public String convert(LoggingEvent event) {
103: return ""
104: + Thread.currentThread().getThreadGroup().getName();
105: }
106: }
107: }
|