【问题标题】:How to write all the System output to a file in JAVA?如何将所有系统输出写入 JAVA 中的文件?
【发布时间】:2012-04-03 12:28:48
【问题描述】:

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

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

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

谢谢

【问题讨论】:

  • 你必须有一个输出流。在你的情况下,你最好使用FileOutputStream
  • 这行得通:FileOutputStream f = new FileOutputStream("log-out.txt");打印流 ps = new PrintStream( f ); System.setOut(ps);

标签: java logging logfile


【解决方案1】:

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

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

【讨论】:

    【解决方案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;
        }
    }
    

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

    【讨论】:

    • 对于 windows,您可以使用完整路径,例如:log4j.appender.MYPACKAGEHANDLER.File=C:/tmp/mypackage.log
    【解决方案3】:

    您可以使用System.setOut(和setErr)将默认标准输出/错误设置为您自己的PrintStreams。在this Oracle blog entry 中有一个完整的例子(由archive.org 提供,因为原来的link 已故)。

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

    【讨论】:

    • 正如 Jarle Handsen 所说,Logback 是一个很好的日志框架。支持multiple appenders(如文件、控制台、DB),需要时可以同时使用。
    【解决方案4】:

    您必须通过 System.setOut()System.setErr() 重新定义流,但我认为使用现有的日志框架为Apache Log4J

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        考虑使用日志库而不是 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) {
        }
        

        【讨论】:

          【解决方案7】:

          简单日志文件生成代码:

          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) {}   
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2017-04-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-05-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多