当前位置:编程学习 > JAVA >>

Logger为什么不按顺序执行??


public class Work {

private Logger logger=Logger.getLogger(this.getClass().getName());

public void doWork(String name){
try {
logger.log(Level.INFO,name+"开始工作..."); //日志
System.out.println(name+"努力工作...");//业务逻辑代码
logger.log(Level.INFO,name+"结束工作...");//日志
} catch (Exception e) {
logger.log(Level.SEVERE,name+"工作出现问题...");//日志
}
}
public static void main(String[] args) {
Work w=new Work();
w.doWork("小明");
}
}

请问这段代码,为什么有时候输出的是:

小明努力工作...
2013-10-10 20:34:10 com.wzh.test.Work doWork
信息: 小明开始工作...
2013-10-10 20:34:10 com.wzh.test.Work doWork
信息: 小明结束工作...


有时候输出的又是:

2013-10-10 20:44:27 com.wzh.test.Work doWork
信息: 小明开始工作...
2013-10-10 20:44:27 com.wzh.test.Work doWork
信息: 小明结束工作...
小明努力工作...


应该要按顺序执行,始终输出下面这段才对

2013-10-10 20:45:36 com.wzh.test.Work doWork
信息: 小明开始工作...
小明努力工作...
2013-10-10 20:45:36 com.wzh.test.Work doWork
信息: 小明结束工作...

如果不按顺序执行,我又怎么能通过写日志来跟踪代码呢?? --------------------编程问答-------------------- 程序确实是由上往下执行的,但是控制台显示顺序乱了,因为他们的输出对象不一样,如果是一样的, 比如统一适用System.out.print输出 肯定不会乱了顺序,同样的情况还有System.err.print   --------------------编程问答--------------------
引用 1 楼 ch656409110 的回复:
程序确实是由上往下执行的,但是控制台显示顺序乱了,因为他们的输出对象不一样,如果是一样的, 比如统一适用System.out.print输出 肯定不会乱了顺序,同样的情况还有System.err.print  

哦,我还以为Logger是通过自己的线程输出的,线程不同步造成的。那么如果我都输出到文本日志里,都是顺序的吧? --------------------编程问答-------------------- 这里不涉及到多线程吧、、、不过你倒是提醒我了 ,可以使用多线程尝试解决不同输出对象输出到控制台顺序的问题,具体如下:


public class Test {
public static void main(String[] args) throws UnsupportedEncodingException, InterruptedException {
            new Thread(new MyThread()).start();
}
}

class MyThread implements java.lang.Runnable
{
    boolean isOut = true;
    @Override
    public synchronized void run() 
    {
        for (int i = 0; i < 10; ++i)
        {
         if(isOut){
         System.out.println("Thread: " + i);
         isOut = false;
         }else{
         System.err.println("Thread : " + i);
         isOut = true;
         }
        }
    }
}

输出结果:

--------------------编程问答-------------------- 哦,不同输出对象输出的顺序还不一样,这是为什么呢,如果不是输出到控制台而是输出到日志文本呢? --------------------编程问答-------------------- 楼主听说过多线程没? --------------------编程问答--------------------
引用 5 楼 rainbowsix 的回复:
楼主听说过多线程没?

是不是说不同的输出对象,使用的线程是不同的?我没看到Logger类的源码里有使用多线程啊? --------------------编程问答-------------------- 不清楚你的是什么Logger,但看样子log就是按多线程方式输出的,它是单起一个线程输出的吧,有源码吗,看一下 --------------------编程问答--------------------
引用 7 楼 dracularking 的回复:
不清楚你的是什么Logger,但看样子log就是按多线程方式输出的,它是单起一个线程输出的吧,有源码吗,看一下

就是 java.util.logging.Logger --------------------编程问答--------------------
引用 6 楼 zhuawang 的回复:
Quote: 引用 5 楼 rainbowsix 的回复:

楼主听说过多线程没?

是不是说不同的输出对象,使用的线程是不同的?我没看到Logger类的源码里有使用多线程啊?


你可以看看System.out的源码 --------------------编程问答--------------------
引用 8 楼 zhuawang 的回复:
Quote: 引用 7 楼 dracularking 的回复:

不清楚你的是什么Logger,但看样子log就是按多线程方式输出的,它是单起一个线程输出的吧,有源码吗,看一下

就是 java.util.logging.Logger

貌似是没有涉及到多线程

而且多次运行发现两次log执行的内容还是严格按照顺序的
这个可能就是涉及到System.out了
--------------------编程问答--------------------
引用 8 楼 zhuawang 的回复:
Quote: 引用 7 楼 dracularking 的回复:

不清楚你的是什么Logger,但看样子log就是按多线程方式输出的,它是单起一个线程输出的吧,有源码吗,看一下

就是 java.util.logging.Logger

貌似与println也木关系(也不是多线程,即使是多线程也不可能跑到第一句log之前)
看来确实是一楼说的eclipse控制台输出实现的问题了,其特点还是同类型对象能保持顺序 --------------------编程问答-------------------- 我看怎么是log的顺序没变,只有log和print的顺序 变了。只要
2013-10-10 20:34:10 com.wzh.test.Work doWork 信息: 小明开始工作... 2013-10-10 20:34:10 com.wzh.test.Work doWork 信息: 小明结束工作...
顺序不变就行
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,