0

I have created a JAVA application. Sometimes, users do invalid operations on it or there are some exceptions that the application encounters when it outputs the errors. However, these outputs are not visible unless I run the application from command line using java -jar myapp.jar

I wish to record all of these to a file in the form of a log but I am unable to find a function or object which is responsible for outputting these errors etc.

To simplify my explanation, assume that my application outputs number from 1 to 10 using a for loop and a Sytem.out command. How can I record everything that is output to the System?

Thanks

4

7 に答える 7

3

ログ フレームワークを使用しない理由: http://logback.qos.ch/

これにより、ファイルまたはコンソールを簡単に切り替えることができます。

于 2012-04-03T12:31:23.647 に答える
2

System.setOut(および)を使用setErrして、デフォルトの標準出力/エラーを独自PrintStreamのに設定できます。このOracleブログエントリには完全な例があります(元のリンクが無効になっているため、archive.orgの提供)。

ただし、それが独自のアプリケーションである場合は、標準の出力/エラーを使用する代わりに、ロギングフレームワークを使用する必要があります。

于 2012-04-03T12:32:07.540 に答える
2

上記に同意すると、ロギング フレームワークを使用する必要があります。私は SLF4J などの抽象化を使用することを好みます。

この例では、下で log4j を使用できます。Java アプリケーションのクラスパスに配置できる log4j.properties ファイルの例を次に示します。

#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

この構成を使用すると、ローリング アペンダーを使用して 2 つのログ ファイルが作成され、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;
    }
}

これにより、setter の出力がログ ファイルに記録されます。プロパティファイルを変更するだけでオフにできます。とてもシンプルです。

于 2012-04-03T12:57:25.537 に答える
1

System.setOut()およびSystem.setErr( )を介してストリームを再定義する必要がありますが、既存のロギング フレームワークをApache Log4Jとして使用する方がより柔軟なソリューションになると思います。

于 2012-04-03T12:46:51.457 に答える
0

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) {
}
于 2012-04-03T12:35:32.733 に答える
0

System.setOutとSystem.setErrを使用して、異なるPrintStreamを設定できます。

于 2012-04-03T12:33:56.073 に答える
0

単純なログ ファイル生成のコード:

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) {}   
    }
}
于 2015-04-18T23:21:10.737 に答える