簡體   English   中英

如何將所有系統輸出寫入JAVA中的文件?

[英]How to write all the System output to a file in JAVA?

我已經創建了一個JAVA應用程序。 有時,用戶對其執行無效操作,或者在應用程序輸出錯誤時遇到一些例外。 但是,除非我使用java -jar myapp.jar從命令行運行應用程序,否則這些輸出是不可見的

我希望將所有這些內容以日志形式記錄到文件中,但是我找不到負責輸出這些錯誤等的函數或對象。

為了簡化說明,假定我的應用程序使用for循環和Sytem.out命令輸出1到10之間的數字。 如何記錄輸出到系統的所有內容?

謝謝

為什么不使用日志框架: http : //logback.qos.ch/

這樣,您可以輕松地在文件或控制台之間切換。

您可以使用System.setOut (和setErr )將默認的標准輸出/錯誤設置為您自己的PrintStream 此Oracle博客條目中有一個完整的示例(由原始鏈接提供,由archive.org提供)。

但是,如果它是您自己的應用程序,則應使用日志記錄框架,而不要使用標准輸出/錯誤。

同意以上所述,您應該使用日志記錄框架。 我更喜歡使用SLF4J之類的抽象。

在此示例中,您可以在下面使用log4j。 這是一個示例log4j.properties文件,您可以將其放入Java應用程序的類路徑中。

#Rootlogger logs to console and logfile
log4j.rootLogger=INFO,stdout,logfile


log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=/tmp/apname.log
log4j.appender.logfile.MaxFileSize=1024KB
# Keep three backup files.
log4j.appender.logfile.MaxBackupIndex=3
# Pattern to output: date [thread] priority [category] - message
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d [%t] %p [%c] - %m%n

#=============== CREATE A SEPARATE HANDLER FOR LOGGING SPECIFIC PACKAGES
log4j.appender.MYPACKAGEHANDLER=org.apache.log4j.RollingFileAppender
log4j.appender.MYPACKAGEHANDLER.File=/tmp/mypackage.log
# 1/2 GB
log4j.appender.MYPACKAGEHANDLER.MaxFileSize=512MB
# Keep three backup files.
log4j.appender.MYPACKAGEHANDLER.MaxBackupIndex=3
# Pattern to output: message only
log4j.appender.MYPACKAGEHANDLER.layout=org.apache.log4j.PatternLayout
log4j.appender.MYPACKAGEHANDLER.layout.ConversionPattern=%m%n

log4j.additivity.com.techtrip.mypackage=false
log4j.logger.com.techtrip.mypackage=DEBUG, MYPACKAGEHANDLER

使用此配置將創建帶有滾動附加程序的兩個日志文件,並將登錄com.techtrip.mypackage到/tmp/mypackage.log的任何類的所有調試日志輸出打印。

假設一個帶有Logger和Formatter的簡單示例類:

package com.techtrip.mypackage;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Foo {

    private Logger logger = LoggerFactory.getLogger(Foo.class);

    private String someString;

    private Foo() {
        super();
    }
    public void setSomeString(String someString) {
        if (logger.isDebugEnabled()){
            logger.debug(String.format("Setting someString %s", someString));
        }

        this.someString = someString;
    }
}

這會將設置器的輸出記錄到日志文件中。 只需更改屬性文件即可將其關閉。 很簡單。

您必須通過System.setOut()System.setErr()重新定義流,但是我認為將現有的日志記錄框架用作Apache Log4J會是一種更靈活的解決方案。

用於生成簡單日志文件的代碼:

import java.io.FileOutputStream;
import java.io.PrintStream;

public class SimpleLog_with_println {
public static void main(String[] args) {

          String st1 = "This World is Very Nice";
          String st2 = " And Beautiful.";
        try {
            System.setOut(new PrintStream(new FileOutputStream("log1.txt"))); //Create log file in parent directory

            // System.setOut(new PrintStream(new FileOutputStream("C:\\log1.txt"))); //Create log file in specified directory
            System.out.println();
            System.out.println("Now the output is redirected! And String is: " +st1 +st2);
        } catch(Exception e) {}   
    }
}

您可以使用System.setOut和System.setErr設置不同的PrintStream

考慮使用日志記錄庫而不是System.out。 像這樣設置它:

try {
    // Create a file handler that write log record to a file called logfile.txt
    FileHandler handler = new FileHandler("logfile.txt");

    // Add to the desired logger
    Logger logger = Logger.getLogger("");
    logger.addHandler(handler);
} catch (IOException e) {
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM