Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java自定义记录器问题_Java_Logging - Fatal编程技术网

Java自定义记录器问题

Java自定义记录器问题,java,logging,Java,Logging,我有一个自定义的记录器类: import java.io.OutputStream; import java.io.PrintStream; public class Logger extends PrintStream{ public Logger(OutputStream outputStream) { super(outputStream); logHeader(); } private void logHeader(){

我有一个自定义的
记录器
类:

import java.io.OutputStream;
import java.io.PrintStream;

public class Logger extends PrintStream{

    public Logger(OutputStream outputStream) {
        super(outputStream);
        logHeader();
    }

    private void logHeader(){
        for (int i=0; i<20; i++) print("#");
        print("Program execution start: ");
        print(CalendarClock.getInitTimeStamp());
        for (int i=0; i<20; i++) print("#");
        println();
    }

    public void logFooter(){
        for (int i=0; i<=20; i++) print("#");
        print("Program execution stop: ");
        print(CalendarClock.getCurrentTimeStamp());
        for (int i=0; i<=20; i++) print("#");
        println("\n");
    }

    @Override
    public void print(String arg0) {
        super.print(arg0);
        if (this.out != System.out) System.out.print(arg0);
    }

    @Override
    public void println(String arg0) {
        super.println(arg0);
        if (this.out != System.out) System.out.println(arg0);
    }
}
public class Main {
    @SuppressWarnings("resource")
    public static void main(String[] args){
        File logFile = new File("data/test.log");
        Logger logger;

        try{
            if (!logFile.exists()) logFile.createNewFile();
            logger = new Logger(new FileOutputStream(logFile, false));
        } catch (IOException e) {
            logger = new Logger(System.out);

        }                                   
        logger.println("Hello World.");
        logger.println("Foo Bar");          
        logger.logFooter();
        logger.close();

    }

}
首先,Eclipse在
logger=newlogger(System.out)处不断显示警告
捕获(IOException e)
内:
资源泄漏:此位置的“记录器”未关闭
。我必须添加
@SuppressWarnings(“资源”)
使其消失

其次,该程序向控制台输出以下内容:

####################Program execution start: 2015-10-27 10:55:51####################Hello World.Hello World.
Foo BarFoo Bar
#####################Program execution stop: 2015-10-27 10:55:51#####################
当它正确地登录到文件时:

####################Program execution start: 2015-10-27 10:55:51####################
Hello World.
Foo Bar
#####################Program execution stop: 2015-10-27 10:55:51#####################
最后,如果我运行以下代码:

public class Main {
    @SuppressWarnings("resource")
    public static void main(String[] args){
        File logFile = new File("data/test.log");
        Logger logger;

        try{
            throw new IOException("Threw the exception!");
            /*if (!logFile.exists()) logFile.createNewFile();
            logger = new Logger(new FileOutputStream(logFile, false));*/
        } catch (IOException e) {
            logger = new Logger(System.out);
            logger.println(e.getMessage());
        }           
        logger.println("Hello World.");
        logger.println("Foo Bar");
        logger.logFooter();
        logger.close();

    }

}
输出正确打印为:

####################Program execution start: 2015-10-27 10:59:18####################
Threw the exception!
Hello World.
Foo Bar
#####################Program execution stop: 2015-10-27 10:59:18#####################
显然,这一切似乎超出了我的理解,对此行为的任何解释都将不胜感激

更新: 我通过重写null参数
println
,解决了标题末尾没有新行的问题:

@Override
public void println() {
    super.println();
    if (out != System.out) System.out.println();
}
现在,第一个
main
的输出为:

####################Program execution start: 2015-10-27 11:15:30####################
Hello World.Hello World.
Foo BarFoo Bar
#####################Program execution stop: 2015-10-27 11:15:30#####################

我使用调试器查看代码执行的顺序,发现
PrintStream
类实现了
prinln(arg0)
作为对
print(arg0)
newline()
的调用,后者相当于
println()
。因此,每次在
Logger
中调用
println(arg0)
时,
arg0
被打印到
stdout
两次,一次在
print(arg0)
中,一次在
println(arg0)

为了解决我的问题,我将
Logger
类中
println(arg0)
的实现更改为:

@Override
public void println(String arg0) {
    print(arg0);
    println();
}

首先,不应添加@SuppressWarning,但应包装logger.close();带有“finally”子句。永远不要忘记用finally子句包装close()方法。这样做是为了确保即使抛出异常,连接也会关闭。