2012-07-20 17 views
5

Tengo un programa Java muy pequeño que puede realizar FTP sobre SSL (no SFTP) o FTPS, usando la biblioteca apache-commons-net. La razón por la que escribí este programa es que la máquina cliente es AIX 5.3 que no admite FTP sobre SSL (OOTB), y la máquina host FTP ejecuta el servidor FileZilla con solo FTP sobre SSL habilitado. El programa funciona bien sin ningún problema, pero la cantidad de registro que genera es enorme. Mi pregunta es: ¿Hay alguna forma de controlar la cantidad de registros?Registro controlado para Apache-commons-net lib (Java)

(Nota Una vez más - El programa funciona perfectamente bien para mi requisito minimalista)

A continuación se muestra un fragmento de mi código

import java.io.*; 
import java.text.MessageFormat; 
import java.util.logging.Logger; 
import org.apache.commons. 
..... 
.... 
.... 
try { 
      int reply; 
      logger.info("# Invoking Trust Manager"); 
      client.setTrustManager(TrustManagerUtils.getAcceptAllTrustManager()); 
      //client.setTrustManager(TrustManagerUtils.getValidateServerCertificateTrustManager()); 
      logger.info("# Connect Call"); 
      client.connect(server, port); 
      client.login(username, password); 
      logger.info("# Login Success"); 

      client.setFileType(FTP.ASCII_FILE_TYPE); 
      client.execPBSZ(0); // Set protection buffer size 
      client.execPROT("P"); // Set data channel protection to private 
      client.enterLocalPassiveMode(); 

      logger.info(MessageFormat.format("Connected to {0} .", server)); 
      reply = client.getReplyCode(); 
      if (!FTPReply.isPositiveCompletion(reply)) { 
       client.disconnect(); 
       logger.severe("FTP server refused connection."); 
       System.exit(1); 
      } 

      if (flag.equals("-d")) { //Dir mode 
       if (args.length == 7){ 
        renameFile = args[6]; //copy rename token 
       } 
       //We will get the file listing and stream the output to create files 
       logger.info("# Invoked Directory mode"); 
       client.changeWorkingDirectory(remoteFile); 
       FTPFile[] ftpFiles; 
       ftpFiles = client.listFiles(remoteFile); 
       if (ftpFiles != null && ftpFiles.length > 0) {      
        for (FTPFile file : ftpFiles) { 
         if (!file.isFile()) { 
          continue; 
         }       
         InputStream fin = client.retrieveFileStream(remoteFile + "/" + file.getName()); 
         if (fin == null) { 
          logger.severe(MessageFormat.format("could not retrieve file: {0}", file.getName())); 
          continue; 
         } 
         // write the inputStream to a FileOutputStream 
         OutputStream out = new FileOutputStream(new File(localFile + "/"+ renameFile + file.getName())); 
         int read = 0; 
         byte[] bytes = new byte[1024]; 

         while ((read = fin.read(bytes)) != -1) { 
          out.write(bytes, 0, read); 
         } 
         fin.close(); 
         out.flush(); 
         out.close(); 
         fin = null; 
         client.completePendingCommand(); 
        } 
       } 
      } 

      if (flag.equals("-f")) { //File mode 
       //Transfer a single file 
       logger.info("# Invoked File mode"); 
       client.listFiles(); 
       boolean retrieved = client.retrieveFile(remoteFile, new FileOutputStream(localFile)); 

       if (retrieved) { 
        logger.info("# File copied."); 
       } 
      } 
     } catch (Exception e) { 
      if (client.isConnected()) { 
       try { 
        client.disconnect(); 
       } catch (IOException ex) { 
        ex.printStackTrace(); 
       } 
      } 
      logger.severe("!! Could not connect to server.!! Please retry!"); 
      e.printStackTrace();    
     } finally { 
      client.disconnect();    
      logger.info("# FTP Client disconnected"); 
      System.exit(0); 
     } 

el registro de que genera para transferir un archivo es como continuación-

Jul 20, 2012 5:00:08 AM com.mff.ftps.FTPSSLTool main 
INFO: Connecting to IP: 216.153.173.246 on Port: 00890 
Jul 20, 2012 5:00:09 AM com.mff.ftps.FTPSSLTool main 
INFO: # Initiating SSL connection 
Jul 20, 2012 5:00:09 AM com.mff.ftps.FTPSSLTool main 
INFO: # Invoking Trust Manager 
Jul 20, 2012 5:00:09 AM com.mff.ftps.FTPSSLTool main 
INFO: # Connect Call 
IBMJSSEProvider2 Build-Level: -20110513 
keyStore is: /usr/java6_64/jre/lib/security/cacerts 
keyStore type is: jks 
keyStore provider is: 
init keystore 
SSLContextImpl: Using X509ExtendedKeyManager com.ibm.jsse2.xc 
SSLContextImpl: Using X509TrustManager org.apache.commons.net.util.TrustManagerUtils$TrustManager 
Installed Providers = 
    IBMJSSE2 
    IBMJCE 
    IBMJGSSProvider 
    IBMCertPath 
    IBMSASL 
    IBMXMLCRYPTO 
    IBMXMLEnc 
    Policy 
    IBMSPNEGO 
JsseJCE: Using SecureRandom from provider IBMJCE version 1.2 
trigger seeding of SecureRandom 
done seeding SecureRandom 
IBMJSSE2 to send SCSV Cipher Suite on initial ClientHello 
JsseJCE: Using cipher AES/CBC/NoPadding from provider TBD via init 
IBMJSSE2 will allow RFC 5746 renegotiation per com.ibm.jsse2.renegotiate set to none or default 
IBMJSSE2 will not require renegotiation indicator during initial handshake per com.ibm.jsse2.renegotiation.indicator set to OPTIONAL or default taken 
IBMJSSE2 will not perform identity checking against the peer cert check during renegotiation per com.ibm.jsse2.renegotiation.peer.cert.check set to OFF or default 
JsseJCE: Using MessageDigest MD5 from provider IBMJCE version 1.2 
JsseJCE: Using MessageDigest SHA from provider IBMJCE version 1.2 
JsseJCE: Using MessageDigest MD5 from provider IBMJCE version 1.2 
JsseJCE: Using MessageDigest SHA from provider IBMJCE version 1.2 
%% No cached client session 
*** ClientHello, SSLv3 
RandomCookie: GMT: 1342778411 bytes = { 246, 135, 47, 123, 204, 170, 94, 224, 76, 244, 28, 242, 63, 243, 124, 13, 93, 156, 170, 88, 91, 79, 89, 55, 157, 135, 214, 250 } 
Session ID: {} 
Cipher Suites: [SSL_RSA_WITH_RC4_128_MD5, SSL_RSA_WITH_RC4_128_SHA, SSL_RSA_WITH_AES_128_CBC_SHA, SSL_DHE_RSA_WITH_AES_128_CBC_SHA, SSL_DHE_DSS_WITH_AES_128_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_RC4_128_SHA, SSL_RSA_WITH_DES_CBC_SHA, SSL_RSA_FIPS_WITH_DES_CBC_SHA, SSL_DHE_RSA_WITH_DES_CBC_SHA, SSL_DHE_DSS_WITH_DES_CBC_SHA, SSL_RSA_EXPORT_WITH_RC4_40_MD5, SSL_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA, SSL_RENEGO_PROTECTION_REQUEST] 
Compression Methods: { 0 } 
*** 
main, WRITE: SSLv3 Handshake, length = 81 
main, READ: SSLv3 Handshake, length = 74 
*** ServerHello, SSLv3 
RandomCookie: GMT: 1342778410 bytes = { 142, 39, 57, 18, 38, 123, 184, 245, 24, 29, 238, 158, 68, 17, 226, 210, 53, 31, 36, 225, 52, 166, 78, 116, 251, 98, 122, 4 } 
Session ID: {143, 221, 201, 170, 184, 190, 241, 94, 223, 253, 199, 199, 50, 161, 233, 224, 88, 78, 82, 162, 13, 222, 236, 56, 215, 253, 101, 12, 39, 45, 126, 203} 
Cipher Suite: SSL_RSA_WITH_RC4_128_MD5 
Compression Method: 0 
*** 
Server did not supply RI Extension - com.ibm.jsse2.extended.renegotiation.indicator=optional or default - processing will continue 
%% Created: [Session-1, SSL_RSA_WITH_RC4_128_MD5] 
** SSL_RSA_WITH_RC4_128_MD5 
main, READ: SSLv3 Handshake, length = 1361 
*** Certificate chain 
chain [0] = [ 
[ 
    Version: V3 
    Subject: CN=ftps.thillsecure.com, OU=Terms of use at www.verisign.com/rpa (c)05, OU=Thill Logistics, O=TCFC LLC, L=Neenah, ST=Wisconsin, C=US 
    Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5 

    Key: IBMJCE RSA Public Key: 
modulus:134055911103149706293270567805752446004906288958857850 
public exponent: 
65537 

    Validity: [From: Sun Dec 04 18:00:00 CST 2011, 
       To: Wed Dec 12 17:59:59 CST 2012] 
    Issuer: CN=VeriSign Class 3 Secure Server CA - G3, OU=Terms of use at https://www.verisign.com/rpa (c)10, OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US 
    SerialNumber: [168622087069244624687861365106323602194] 
.... 
.... 
.... 
Hundreds and hundreds of more lines 

estoy usando java.utils.logging.Logger para mi propio propósito de registro, pero las líneas de troncos se getti ng ofuscado por las numerosas líneas de registro generadas por los propios métodos de biblioteca apache-commons-net.

Así que de nuevo, la pregunta es: "¿Hay alguna manera de controlar este comportamiento de registro de la biblioteca apache-commons-net? Cualquier método que pueda usar o cualquier indicador que deba establecerse"

ACTUALIZACIÓN:

fin llegué a controlar la tala (Gracias especiales a Flavio). Todo lo que tenía que hacer era incluir System.setProperty("javax.net.debug", "false"); en mi código. Lo tenía configurado inicialmente como System.setProperty("javax.net.debug", "ssl"); que permitía el registro de nivel de depuración. Ahora los registros son mucho más cortos y precisos. También era evidente que los registros no eran de la biblioteca commons-net después de todo, sino del javax.net. El registro es mucho más corto y se ve algo como continuación-

Jul 30, 2012 9:03:16 AM com.mff.ftps.FTPSSLTool main 
INFO: Connecting to IP: xxx.xxx.xxx.xxx on Port: 890 
Jul 30, 2012 9:03:16 AM com.mff.ftps.FTPSSLTool main 
INFO: # Initiating SSL connection 
Jul 30, 2012 9:03:16 AM com.mff.ftps.FTPSSLTool main 
INFO: # Invoking Trust Manager 
Jul 30, 2012 9:03:16 AM com.mff.ftps.FTPSSLTool main 
INFO: # Connect Call 
220 GlobalSCAPE Secure FTP Server 
USER XXXXXXX 
331 Password required for XXXXXXX. 
PASS XXXXXXXXX 
230 Login OK. Proceed. 
Jul 30, 2012 9:03:22 AM com.mff.ftps.FTPSSLTool main 
INFO: # Login Success 
TYPE A 
200 Type set to A. 
PBSZ 0 
200 PBSZ Command OK. Protection buffer size set to 0. 
PROT P 
200 PROT Command OK. Using Private data connection 
Jul 30, 2012 9:03:24 AM com.mff.ftps.FTPSSLTool main 
INFO: Connected to xxx.xxx.xxx.xxx . 
CWD /Data/Inv 
Jul 30, 2012 9:03:24 AM com.mff.ftps.FTPSSLTool main 
INFO: # Invoked Directory mode 
250 Folder changed to "/Data/Inv". 
SYST 
215 UNIX Type: L8 
PASV 
227 Entering Passive Mode (216,153,173,246,109,220). 
LIST /Data/Inv 
150 Opening ASCII mode data connection for file list. 
226 Transfer complete. 1430 bytes transferred. 1278 Bps. 
Jul 30, 2012 9:03:30 AM com.mff.ftps.FTPSSLTool main 
INFO: # FTP Client disconnected 

Respuesta

4

Creo que está buscando en el lugar equivocado; esos mensajes no son de la biblioteca de red de apache commons.

Creo que son del IBMJSSEProvider2 que ves referido en las primeras líneas. De acuerdo con este link, usted debería ser capaz de desactivar por no establecer la propiedad del sistema javax.net.debug o redirigirlos a las os400.stdout y os400.stderr propiedades.

+0

¡Impresionante! Eso era exactamente lo que estaba buscando. Tenía algo así en mi código 'System.setProperty (" javax.net.debug "," ssl ");' y lo modifiqué para que fuera 'System.setProperty (" javax.net.debug "," false ") ; '. esto redujo drásticamente el registro, gracias muchísimo. – Annjawn

0

Puede establecer el nivel de registro de la aplicación mediante setLevel(). La clase Level se usa para definir qué mensajes se deben escribir en el registro. Puede establecer uno de los siguientes Niveles de registro:

  • Level.SEVERE (nivel más alto)
  • Level.WARNING
  • Level.INFO
  • Level.CONFIG
  • Level.FINE
  • Level.FINER
  • Level.FINEST

Si utiliza LOGGER.setLevel(Level.INFO), cada nivel de registro superior o igual INFO se escribirá en el registro, es decir , SEVERE, WARNING and INFO. Además, tiene los niveles Level.OFF y Level.ALL para desactivar el inicio de sesión o para registrar todo.

Agregue a su aplicación un nivel de registro más alto, como logger.setLevel(Level.SEVERE).

Ejemplo

public void writeLog() { 
    // Set the LogLevel to Severe, only severe Messages will be written 
    LOGGER.setLevel(Level.SEVERE); 
    LOGGER.severe("Severe Log"); 
    LOGGER.warning("Warning Log"); 
    LOGGER.info("Info Log"); 
    LOGGER.finest("Really not important"); 

    // Set the LogLevel to Info, severe, warning and info will be written 
    // Finest is still not written 
    LOGGER.setLevel(Level.INFO); 
    LOGGER.severe("Severe Log"); 
    LOGGER.warning("Warning Log"); 
    LOGGER.info("Info Log"); 
    LOGGER.finest("Really not important"); 
} 

Más información: http://www.vogella.com/articles/Logging/article.html

P.S. tenga cuidado con su archivo logging.properties que establece su global log level.

+0

Gracias por la respuesta. Pero, ¿controlará esto el registro 'apache-commons-net'? la mayoría de las líneas de registro que ve en mi pregunta original anterior es de la biblioteca 'apache-commons-net' y no de mi archivo de clase. Como puede ver, está imprimiendo cada paso de Keystore, a los cokkies a la cadena de certificados. En este punto, quiero controlar el registro de la biblioteca en sí (no mi registro de nivel de programa) ya que no quiero ver muchos detalles, estos detalles suelen ser útiles durante la depuración/desarrollo. – Annjawn

+0

Basado en esta [pregunta] (http://stackoverflow.com/questions/5009658/adjust-logging-level-for-apache-commons-logging?answertab=active#tab-top), creo que no funcionará. Intente cambiar el archivo de propiedades con el nivel deseado como se describe en este 'logging.properties' [archivo de ejemplo] (http://www.java-tips.org/java-se-tips/java.util.logging/how- to-configure-a-logger-default-values-with-a-properties.html). Anulará las propiedades globales. – Yamaneko

0

Bueno, he tenido el mismo problema con Spring, Quartz, Hibernate, etc. Las API y los frameworks crean grandes bloques de troncos.

Establezco niveles personalizados para cada una de las API por paquete.

  • logger.org.spring = WARN
  • logger.org.hibernate = DEBUG
  • logger.org.quartz = INFO
  • logger.com.myApp = DEBUG

De Por supuesto, este no es el conjunto de propiedades completo, pero entiendes la idea. Puede usar el nombre del paquete - org.apache.commons y asignar un nivel de registro a ese paquete. Tenga en cuenta que todos y cada uno de los registros de cualquier clase en ese nivel de paquete se configurarán con el mismo nivel que este.

Utilicé slf4j sobre log4j (http://www.slf4j.org/), en lugar de util madelogger. Pero estoy seguro de que la solución podría ser un poco torcida en su situación. Si pudiera ser un poco audaz, recomendaría usar SLF4J. HTH.

0

esperan que la tala apache-commons-net utilizar ya sea commons-logging o SLF4J - en ausencia de cualquier otro factor que controlan, estos deben registro de ruta a java.util.logging.

La última respuesta aquí es que SI está viendo los registros entremezclados en un archivo de salida (no en la consola), entonces es muy probable que se estén enrutando a través de un registrador común. Y java.lang.logging está funcionando aquí, así que probemos la configuración.

Para configurar java.util.logging:

crear el archivo de sus propiedades de registro, por ejemplo myLog.properties, y personalizar los niveles de los diferentes paquetes.Por ejemplo, establecer un nivel más alto que INFO - como GRAVES - para el paquete desagradable com.mff.ftps:

# handlers=java.util.logging.ConsoleHandler, java.util.logging.FileHandler 
handlers=java.util.logging.FileHandler 

# Set ROOT logger level 
.level=INFO 
com.mff.ftps.level=SEVERE 
# Set any number specifications: <package.path>.level=<LOGLEVEL> 

java.util.logging.ConsoleHandler.level=WARNING 
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter 

java.util.logging.FileHandler.level=FINEST 
java.util.logging.FileHandler.pattern=myLogFile.log 
java.util.logging.FileHandler.limit=1073741824 # 1MB 
java.util.logging.FileHandler.count=2 
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter 

Al iniciar java, especifica las propiedades de registro del archivo:

java -Djava.util.logging.config.file=<pathTo>/myLog.properties -cp .. .

o escribir código:

File logPropFile = new File("<pathTo>/myLog.properties"); 
InputStream logPropStream = new FileInputStream(logPropFile); 
try { 
    LogManager.getLogManager().readConfiguration(logPropStream); 
} 
finally { 
    logPropStream.close(); 
} 
+0

Gracias, pero la solución fue establecer 'javax.net.debug'. – Annjawn

Cuestiones relacionadas