/* * 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"); } }