Java tutorial
/* * Written and copyright 2001-2004 Tobias Minich. Distributed under the GNU * General Public License; see the README file. This code comes with NO * WARRANTY. * * Log.java * * Created on 23.03.2004 * */ package org.gudy.azureus2.ui.console.commands; import java.io.IOException; import java.util.*; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Option; import org.apache.commons.cli.Options; import org.apache.log4j.Appender; import org.apache.log4j.ConsoleAppender; import org.apache.log4j.FileAppender; import org.apache.log4j.Logger; import org.apache.log4j.PatternLayout; import org.apache.log4j.varia.DenyAllFilter; import org.gudy.azureus2.plugins.PluginInterface; import org.gudy.azureus2.plugins.logging.LoggerChannel; import org.gudy.azureus2.plugins.logging.LoggerChannelListener; import org.gudy.azureus2.ui.console.ConsoleInput; /** * @author Tobias Minich */ public class Log extends OptionsConsoleCommand { private Map channel_listener_map = new HashMap(); public Log() { super("log", "l"); } protected Options getOptions() { Options options = new Options(); options.addOption(new Option("f", "filename", true, "filename to write log to")); return options; } public void execute(String commandName, final ConsoleInput ci, CommandLine commandLine) { Appender con = Logger.getRootLogger().getAppender("ConsoleAppender"); List args = commandLine.getArgList(); if ((con != null) && (!args.isEmpty())) { String subcommand = (String) args.get(0); if ("off".equalsIgnoreCase(subcommand)) { if (args.size() == 1) { con.addFilter(new DenyAllFilter()); ci.out.println("> Console logging off"); } else { String name = (String) args.get(1); Object[] entry = (Object[]) channel_listener_map.remove(name); if (entry == null) { ci.out.println("> Channel '" + name + "' not being logged"); } else { ((LoggerChannel) entry[0]).removeListener((LoggerChannelListener) entry[1]); ci.out.println("> Channel '" + name + "' logging off"); } } } else if ("on".equalsIgnoreCase(subcommand)) { if (args.size() == 1) { if (commandLine.hasOption('f')) { // send log output to a file String filename = commandLine.getOptionValue('f'); try { Appender newAppender = new FileAppender(new PatternLayout("%d{ISO8601} %c{1}-%p: %m%n"), filename, true); newAppender.setName("ConsoleAppender"); Logger.getRootLogger().removeAppender(con); Logger.getRootLogger().addAppender(newAppender); ci.out.println("> Logging to filename: " + filename); } catch (IOException e) { ci.out.println("> Unable to log to file: " + filename + ": " + e); } } else { if (!(con instanceof ConsoleAppender)) { Logger.getRootLogger().removeAppender(con); con = new ConsoleAppender(new PatternLayout(PatternLayout.TTCC_CONVERSION_PATTERN)); con.setName("ConsoleAppender"); Logger.getRootLogger().addAppender(con); } // switch back to console appender ci.out.println("> Console logging on"); } con.clearFilters(); } else { // hack - dunno how to do plugin-specific logging using these damn appenders.. Map channel_map = getChannelMap(ci); final String name = (String) args.get(1); LoggerChannel channel = (LoggerChannel) channel_map.get(name); if (channel == null) { ci.out.println("> Channel '" + name + "' not found"); } else if (channel_listener_map.get(name) != null) { ci.out.println("> Channel '" + name + "' already being logged"); } else { LoggerChannelListener l = new LoggerChannelListener() { public void messageLogged(int type, String content) { ci.out.println("[" + name + "] " + content); } public void messageLogged(String str, Throwable error) { ci.out.println("[" + name + "] " + str); error.printStackTrace(ci.out); } }; channel.addListener(l); channel_listener_map.put(name, new Object[] { channel, l }); ci.out.println("> Channel '" + name + "' on"); } } } else if (subcommand.equalsIgnoreCase("list")) { Map channel_map = getChannelMap(ci); Iterator it = channel_map.keySet().iterator(); while (it.hasNext()) { String name = (String) it.next(); ci.out.println( " " + name + " [" + (channel_listener_map.get(name) == null ? "off" : "on") + "]"); } } else { ci.out.println("> Command 'log': Subcommand '" + subcommand + "' unknown."); } } else { ci.out.println( "> Console logger not found or missing subcommand for 'log'\r\n> log syntax: log [-f filename] (on [name]|off [name]|list)"); } } protected Map getChannelMap(ConsoleInput ci) { Map channel_map = new HashMap(); PluginInterface[] pis = ci.azureus_core.getPluginManager().getPluginInterfaces(); for (int i = 0; i < pis.length; i++) { LoggerChannel[] logs = pis[i].getLogger().getChannels(); if (logs.length > 0) { if (logs.length == 1) { channel_map.put(pis[i].getPluginName(), logs[0]); } else { for (int j = 0; j < logs.length; j++) { channel_map.put(pis[i].getPluginName() + "." + logs[j].getName(), logs[j]); } } } } return (channel_map); } public static void commandLogtest(ConsoleInput ci, List args) { Logger.getLogger("azureus2").fatal( "Logging test" + (((args == null) || (args.isEmpty())) ? "" : ": " + args.get(0).toString())); } public String getCommandDescriptions() { return ("log [-f filename] (on [name]|off [name]|list)\t\t\tl\tTurn on/off console logging"); } }