Package org.gudy.azureus2.ui.console.commands

Source Code of org.gudy.azureus2.ui.console.commands.Log

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

Related Classes of org.gudy.azureus2.ui.console.commands.Log

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.