0

我创建了一个 JAVA 应用程序。有时,用户对其进行了无效的操作,或者应用程序在输出错误时遇到了一些异常。但是,除非我使用 java -jar myapp.jar 从命令行运行应用程序,否则这些输出不可见

我希望将所有这些以日志的形式记录到文件中,但我找不到负责输出这些错误等的函数或对象。

为了简化我的解释,假设我的应用程序使用 for 循环和 Sytem.out 命令输出从 1 到 10 的数字。如何记录输出到系统的所有内容?

谢谢

4

7 回答 7

3

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

有了这个,您可以轻松地在文件或控制台之间切换。

于 2012-04-03T12:31:23.647 回答
2

您可以使用System.setOut(and setErr) 将默认标准输出/错误设置为您自己PrintStream的 s。此 Oracle 博客条目中有一个完整的示例(由 archive.org 提供,因为原始链接已失效)。

但是,如果它是您自己的应用程序,您应该使用日志框架而不是使用标准输出/错误。

于 2012-04-03T12:32:07.540 回答
2

同意上述观点,您应该使用日志框架。我更喜欢使用 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;
    }
}

这会将设置器输出记录到日志文件中。只需更改属性文件即可将其关闭。非常简单。

于 2012-04-03T12:57:25.537 回答
1

您必须通过System.setOut()System.setErr()重新定义流,但我认为使用现有的日志框架作为Apache Log4J将是一个更灵活的解决方案。

于 2012-04-03T12:46:51.457 回答
0

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

于 2012-04-03T12:33:56.073 回答
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

简单日志文件生成代码:

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 回答