我有一個可以生成日誌的Java桌面應用程序。 我想將這些日誌發送到遠程服務器。將文件發送到服務器的最簡單方法
這樣做的正確方法是什麼?通過FTP?寫一個小的java服務器併發送一個套接字?發佈內容到PHP表格?
如果使用FTP,它是否安全?我的意思是,是否可以允許上傳,但也可以保護文件不被刪除或重命名?
我有一個可以生成日誌的Java桌面應用程序。 我想將這些日誌發送到遠程服務器。將文件發送到服務器的最簡單方法
這樣做的正確方法是什麼?通過FTP?寫一個小的java服務器併發送一個套接字?發佈內容到PHP表格?
如果使用FTP,它是否安全?我的意思是,是否可以允許上傳,但也可以保護文件不被刪除或重命名?
通過電子郵件發送日誌文件也是另一種選擇。這使您可以選擇將日誌發送到其電子郵件上的人員列表,以防需要立即根據錯誤執行操作。
對於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用於異步發送電子郵件,使當前線程不阻止針對電子郵件將被寄出。
謝謝,我想我會通過電子郵件發送日誌,我不確定我是否會使用log4j,因爲我不想發送所有日誌,但我沒有提到這個問題。 – TheBronx 2013-03-13 10:14:21
您可以指定記錄器級別。如果遇到該級別的記錄事件,則會發送一封電子郵件。如果您想進一步微調,您也可以僅爲一個包指定它。 – 2013-03-13 11:11:41
在你的具體情況下,我會建議使用log4j
的SimpleSocketServer。
在你的服務器,你可以只啓動服務器使用以下參數:
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隧道。
是否有可能不發送所有日誌?我想決定何時發送日誌。 – TheBronx 2013-03-13 10:10:07
是的,當然。你可以指定'category','level'等等,特別是'SERVER' appender。如果有必要,你甚至可以創建自己的「關卡」。如果您想彙總來自多個客戶端的一些關鍵日誌,這種方法將很有幫助。順便說一句,在服務器上,您不僅可以使用'ConsoleAppender',還可以使用'SMTPAppender',其中@Varun Achar建議 – n1ckolas 2013-03-13 10:19:12
感謝您的答案,我更喜歡電子郵件解決方案,因爲我不必觸摸服務器,但是反正+1 ! – TheBronx 2013-03-13 12:21:38
是... Log4J對於您的應用程序中的日誌機制非常有用。
而對於發送數據到服務器,它變得非常容易使用客戶端套接字 - 服務器套接字。
將數據從客戶端發送到服務器有非常有用的方法,反之亦然。
感謝@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
的時間和頻率應在日誌上載?每個小時,每天一次,每週一次? – Kai 2013-03-13 09:41:21
@ user714965爲了防止發現錯誤,每週一次左右(我們處於beta版:P版)。日誌應該在應用程序啓動時(崩潰後)上傳。 – TheBronx 2013-03-13 09:41:51
您是否考慮過在發生錯誤時通過電子郵件發送日誌的選項?大多數日誌庫提供設置 – 2013-03-13 09:59:00