如何将所有系统输出写入JAVA中的文件?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将所有系统输出写入JAVA中的文件?相关的知识,希望对你有一定的参考价值。
我创建了一个JAVA应用程序。有时,用户对其执行无效操作,或者在输出错误时应用程序遇到一些异常。但是,除非我使用java -jar myapp.jar从命令行运行应用程序,否则这些输出不可见
我希望以日志的形式将所有这些记录到文件中,但是我无法找到负责输出这些错误等的函数或对象。
为了简化我的解释,假设我的应用程序使用for循环和Sytem.out命令输出1到10之间的数字。如何记录输出到系统的所有内容?
谢谢
同意上述内容,您应该使用日志框架。我更喜欢使用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
使用此配置将创建两个带有滚动appender的日志文件,将登录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输出记录到日志文件中。只需更改属性文件即可将其关闭。非常简单。
为什么不使用日志框架:http://logback.qos.ch/
有了它,您可以轻松地在文件或控制台之间切换。
您可以使用System.setOut
(和setErr
)将默认标准输出/错误设置为您自己的PrintStream
s。在this Oracle blog entry有一个完整的例子(由archive.org提供,因为原来的link已经死亡)。
但是,如果它是您自己的应用程序,则应使用日志记录框架而不是使用标准输出/错误。
您必须通过System.setOut()和System.setErr()重新定义流,但我认为使用现有的日志框架作为Apache Log4J将是一个更灵活的解决方案。
您可以使用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) {
}
简单日志文件生成代码:
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) {}
}
}
以上是关于如何将所有系统输出写入JAVA中的文件?的主要内容,如果未能解决你的问题,请参考以下文章