2012-07-20 17 views
5

Tôi có một chương trình Java rất nhỏ có khả năng thực hiện FTP qua SSL (không phải SFTP) hoặc FTPS, sử dụng thư viện apache-commons-net. Lý do tại sao tôi đã viết chương trình này là máy khách là AIX 5.3 không hỗ trợ FTP qua SSL (OOTB), và máy chủ FTP chạy máy chủ FileZilla chỉ với FTP qua SSL được kích hoạt. Chương trình chạy rất tốt mà không gặp bất kỳ vấn đề nào nhưng số lượng ghi nhật ký nó tạo ra rất lớn. Câu hỏi của tôi là Có cách nào để kiểm soát số lượng đăng nhập không?Ghi nhật ký được kiểm soát đối với lib-commons-net lib (Java)

(Note Again - Chương trình làm việc hoàn toàn tốt cho yêu cầu tối giản của tôi)

Dưới đây là một đoạn trích từ mã của tôi

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); 
     } 

Các log nó tạo ra để chuyển một tập tin là như liệt kê dưới đây

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 

Tôi đang sử dụng java.utils.logging.Logger cho mục đích ghi nhật ký của riêng mình, nhưng dòng nhật ký là getti ng obfuscated bởi nhiều dòng đăng nhập được tạo ra bởi các phương pháp thư viện apache-commons-net chính nó.

Vì vậy again- Câu hỏi đặt ra là - "Có cách nào để kiểm soát này hành vi khai thác gỗ của thư viện apache-commons-net bản thân Bất kỳ phương pháp tôi có thể sử dụng hoặc bất kỳ lá cờ mà cần phải được thiết lập ???"

UPDATE:

cuối cùng tôi đã đến kiểm soát khai thác gỗ (Đặc biệt cảm ơn Flavio). Tất cả những gì tôi phải làm là bao gồm System.setProperty("javax.net.debug", "false"); trong mã của tôi. Ban đầu tôi đã đặt ban đầu là System.setProperty("javax.net.debug", "ssl"); đã bật ghi nhật ký cấp độ gỡ lỗi. Giờ đây nhật ký ngắn hơn và chính xác hơn nhiều. Rõ ràng là các bản ghi không phải từ thư viện mạng lưới commons-net sau khi tất cả, nhưng từ javax.net. Nhật ký ngắn hơn nhiều và trông giống như dưới đây-

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 

Trả lời

4

Tôi nghĩ bạn đang tìm kiếm địa điểm sai; những tin nhắn đó không phải từ thư viện net commons net.

Tôi nghĩ rằng chúng là từ IBMJSSEProvider2 bạn thấy được đề cập trong dòng đầu tiên. Theo link này, bạn sẽ có thể vô hiệu hóa chúng bằng cách không thiết lập các hệ thống sở hữu javax.net.debug, hoặc chuyển hướng chúng với os400.stdoutos400.stderr tài sản.

+0

Tuyệt vời! Đó là chính xác những gì tôi đang tìm kiếm. Tôi đã có một cái gì đó như thế này trong mã của tôi 'System.setProperty (" javax.net.debug "," ssl ");' và tôi đã sửa đổi nó thành 'System.setProperty (" javax.net.debug "," false ") ; '. điều này giảm đáng kể việc đăng nhập, cảm ơn một tấn. – Annjawn

0

Bạn có thể đặt mức nhật ký của ứng dụng bằng setLevel(). Lớp Level được sử dụng để xác định thư nào sẽ được ghi trong nhật ký. Bạn có thể thiết lập một trong những cấp độ Log sau:

  • Level.SEVERE (mức cao nhất)
  • Level.WARNING
  • Level.INFO
  • Level.CONFIG
  • Level.FINE
  • Level.FINER
  • Level.FINEST

Nếu bạn sử dụng LOGGER.setLevel(Level.INFO), mọi cấp độ ghi cao hơn hoặc bằng INFO sẽ được viết trong nhật ký, tức là, SEVERE, WARNING and INFO. Ngoài ra, bạn có các cấp độ Level.OFFLevel.ALL để tắt tính năng ghi nhật ký hoặc đăng nhập mọi thứ.

Thêm vào ứng dụng của bạn cấp độ nhật ký cao hơn, chẳng hạn như logger.setLevel(Level.SEVERE).

Ví dụ

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

Thông tin thêm: http://www.vogella.com/articles/Logging/article.html

T.B. hãy cẩn thận với tệp logging.properties đặt global log level của bạn.

+0

Cảm ơn bạn đã phản hồi. Nhưng điều này sẽ kiểm soát việc khai thác 'apache-commons-net'? hầu hết các dòng nhật ký mà bạn nhìn thấy trong câu hỏi ban đầu của tôi ở trên là từ thư viện 'apache-commons-net' và không phải từ tệp lớp của tôi. Như bạn có thể thấy in ấn của nó mỗi bước từ Keystore, để cokkies đến chuỗi chứng chỉ. Tại thời điểm này, tôi muốn kiểm soát chính bản ghi của thư viện (không phải đăng nhập mức chương trình của tôi) vì tôi không muốn thấy nhiều chi tiết, các chi tiết này thường hữu ích trong quá trình gỡ lỗi/phát triển. – Annjawn

+0

Dựa trên [câu hỏi này] (http://stackoverflow.com/questions/5009658/adjust-logging-level-for-apache-commons-logging?answertab=active#tab-top), tôi nghĩ nó sẽ không hoạt động. Hãy thử thay đổi tệp thuộc tính của bạn với mức mong muốn như được mô tả bằng cách này 'logging.properties' [tệp ví dụ] (http://www.java-tips.org/java-se-tips/java.util.logging/how- to-configure-a-logger-default-values-with-a-properties.html). Nó sẽ ghi đè lên các thuộc tính toàn cầu. – Yamaneko

0

Vâng, tôi đã có cùng một vấn đề với Spring, Quartz, Hibernate vv API và khung công tác tạo ra những tảng đá khổng lồ của các bản ghi.

Tôi đặt mức tùy chỉnh cho từng API trên cơ sở từng gói.

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

Trong số tất nhiên đây không phải là bộ tài sản hoàn chỉnh, nhưng bạn có ý tưởng. Bạn có thể sử dụng tên gói - org.apache.commons và gán mức nhật ký cho gói đó. Xin lưu ý: Bất kỳ và mọi bản ghi từ bất kỳ lớp nào theo cấp gói đó sẽ được định cấu hình với cùng cấp như thế này.

Tôi đã sử dụng slf4j trên log4j (http://www.slf4j.org/), thay vì sử dụng trình ghi nhật ký. Nhưng tôi chắc chắn rằng sửa chữa có thể được xoắn một chút trong tình huống của bạn. Nếu tôi có thể là một chút táo bạo, tôi khuyên bạn nên sử dụng SLF4J. HTH.

0

mong muốn việc đăng nhập apache-commons-net để sử dụng commons-logging hoặc SLF4J - trong trường hợp không có bất kỳ yếu tố kiểm soát nào khác, chúng sẽ được ghi nhật ký đến java.util.logging. Câu trả lời cuối cùng ở đây là nếu bạn thấy các bản ghi được trộn lẫn trong một tệp đầu ra (không phải bàn điều khiển), thì rất có khả năng chúng được định tuyến thông qua một bộ ghi nhật ký chung. Và java.lang.logging đang hoạt động ở đây, vì vậy hãy thử cấu hình.

Để cấu hình java.util.logging:

Tạo tập tin thuộc tính khai thác gỗ của bạn, nói myLog.properties, và tùy chỉnh mức cho các gói khác nhau.Ví dụ, thiết lập một mức độ cao hơn INFO - như NGHIÊM TRỌNG - cho gói đáng ghét 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 

Khi bạn khởi động java, định nộp các thuộc tính logging:

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

hoặc viết mã:

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

Cảm ơn, nhưng giải pháp là đặt 'javax.net.debug'. – Annjawn