2013-03-13 115 views
1

我有一個可以生成日誌的Java桌面應用程序。 我想將這些日誌發送到遠程服務器將文件發送到服務器的最簡單方法

這樣做的正確方法是什麼?通過FTP?寫一個小的java服務器併發送一個套接字?發佈內容到PHP表格

如果使用FTP,它是否安全?我的意思是,是否可以允許上傳,但也可以保護文件不被刪除或重命名?

+0

的時間和頻率應在日誌上載?每個小時,每天一次,每週一次? – Kai 2013-03-13 09:41:21

+0

@ user714965爲了防止發現錯誤,每週一次左右(我們處於beta版:P版)。日誌應該在應用程序啓動時(崩潰後)上傳。 – TheBronx 2013-03-13 09:41:51

+0

您是否考慮過在發生錯誤時通過電子郵件發送日誌的選項?大多數日誌庫提供設置 – 2013-03-13 09:59:00

回答

1

通過電子郵件發送日誌文件也是另一種選擇。這使您可以選擇將日誌發送到其電子郵件上的人員列表,以防需要立即根據錯誤執行操作。

對於log4j的檢查此鏈接:

http://www.codereye.com/2009/02/sending-email-alerts-with-log4j.html

基本要點是:

log4j.rootLogger=INFO, a, email 
log4j.appender.a=org.apache.log4j.ConsoleAppender 
log4j.appender.a.layout=org.apache.log4j.PatternLayout 
log4j.appender.a.layout.ConversionPattern=%d{HH:mm:ss} %-5p [%c{1}]: %m%n 
log4j.appender.email=org.apache.log4j.net.SMTPAppender 
log4j.appender.email.BufferSize=10 
log4j.appender.email.SMTPHost=mysmtp.mailserver.net 
[email protected] 
[email protected] 
log4j.appender.email.Subject=My Module Error 
log4j.appender.email.layout=org.apache.log4j.PatternLayout 
log4j.appender.email.layout.ConversionPattern=%d [%t] %-5p %c %x - %m%n 

同時檢查AsynAppender用於異步發送電子郵件,使當前線程不阻止針對電子郵件將被寄出。

+0

謝謝,我想我會通過電子郵件發送日誌,我不確定我是否會使用log4j,因爲我不想發送所有日誌,但我沒有提到這個問題。 – TheBronx 2013-03-13 10:14:21

+0

您可以指定記錄器級別。如果遇到該級別的記錄事件,則會發送一封電子郵件。如果您想進一步微調,您也可以僅爲一個包指定它。 – 2013-03-13 11:11:41

1

在你的具體情況下,我會建議使用log4jSimpleSocketServer

在你的服務器,你可以只啓動服務器使用以下參數:

java -cp log4j.jar org.apache.log4j.net.SimpleSocketServer 4712 

這裏是服務器樣本log4j.properties

log4j.rootLogger=debug, stdout 

log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 

log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n 

這裏是樣品log4j.properties客戶端:

log4j.appender.SERVER=org.apache.log4j.net.SocketAppender 
log4j.appender.SERVER.Port=4712 
log4j.appender.SERVER.RemoteHost=loghost 
log4j.appender.SERVER.ReconnectionDelay=10000 

唯一的說明是,你不能只能使用SimpleSocketServer的功能設置某種認證。您只能使用其他方法來實現這一點,f.e. SSH隧道。

+0

是否有可能不發送所有日誌?我想決定何時發送日誌。 – TheBronx 2013-03-13 10:10:07

+0

是的,當然。你可以指定'category','level'等等,特別是'SERVER' appender。如果有必要,你甚至可以創建自己的「關卡」。如果您想彙總來自多個客戶端的一些關鍵日誌,這種方法將很有幫助。順便說一句,在服務器上,您不僅可以使用'ConsoleAppender',還可以使用'SMTPAppender',其中@Varun Achar建議 – n1ckolas 2013-03-13 10:19:12

+0

感謝您的答案,我更喜歡電子郵件解決方案,因爲我不必觸摸服務器,但是反正+1 ! – TheBronx 2013-03-13 12:21:38

0

是... Log4J對於您的應用程序中的日誌機制非常有用。

而對於發送數據到服務器,它變得非常容易使用客戶端套接字 - 服務器套接字。

將數據從客戶端發送到服務器有非常有用的方法,反之亦然。

0

感謝@VarunAchar我決定通過電子郵件發送日誌。但是,而不是使用log4j的(也就是用一個好主意,但對我來說,我不需要這樣一個完整的解決方案),我用我自己的方法與一些附件發送電子郵件:

Properties properties = new Properties(); 
properties.setProperty("mail.smtp.submitter", from); //such as [email protected] 
properties.setProperty("mail.smtp.auth", "true"); 
properties.setProperty("mail.smtp.host", host); //use smtp.gmail.com for Google 
properties.put("mail.smtp.user", from); //such as [email protected] 
properties.put("mail.smtp.port", port); //use 465 for Google's SMTP server 
properties.put("mail.smtp.socketFactory.port", port); //use 465 for Google's SMTP server 
properties.put("mail.smtp.starttls.enable","true"); 
properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
properties.put("mail.smtp.socketFactory.fallback", "false"); 

Authenticator mailAuthenticator = new MailAuthenticator(from,"mypassword"); 
Session mailSession = Session.getDefaultInstance(properties,mailAuthenticator); 
Message message = new MimeMessage(mailSession); 

InternetAddress fromAddress = new InternetAddress(from); 
InternetAddress toAddress = new InternetAddress(to); 

message.setFrom(fromAddress); 
message.setRecipient(RecipientType.TO, toAddress); 
//you can use RecipientTypes such as 
//RecipientType.TO 
//RecipientType.BCC 
//RecipientType.CC 
//RecipientType.NEWSGROUPS 
message.setSubject(subject); 

// Create the message part 
BodyPart messageBodyPart = new MimeBodyPart(); 

// Some text 
messageBodyPart.setText(text); 

// Attachments 
Multipart multipart = new MimeMultipart(); 
multipart.addBodyPart(messageBodyPart); 
// Attach error.log 
File f = new File(ruta+"error.log"); 
if (f.exists()) { 
    messageBodyPart = new MimeBodyPart(); 
    String filename = ruta+"error.log"; 
    DataSource source = new FileDataSource(filename); 
    messageBodyPart.setDataHandler(new DataHandler(source)); 
    messageBodyPart.setFileName(filename); 
    multipart.addBodyPart(messageBodyPart); 
} 

// repeat with more attachments if needed 

// Fill email content 
message.setContent(multipart); 

Transport.send(message); 

它採用Java Mail API
原代碼發現這裏:http://tunatore.wordpress.com/2011/10/05/how-to-send-an-e-mail-using-java-mail-api-swing-desktop-application-using-googles-smtp-example/
和安裝部分是在這裏:http://www.roseindia.net/javamail/SendAttachment.shtml

相關問題