2011-08-18 191 views
1

当我运行多个线程时,我在System.out.println输出中迷路了,因为我认为每个线程必须位于不同的控制台中。在控制台管理多个线程

有没有简单的方法来使用Eclipse进行管理?

编辑:问题是不知道哪个消息属于每个线程。确切的问题是,当一个新的线程被调用时控制台停止打印,并且log4j也发生了同样的情况。

回答

0

我刚刚配置为将所有日志写入文件。

<appender name="rolling-file" class="org.apache.log4j.RollingFileAppender"> 
     <param name="file" value="home/.../mylog.log" /> 
     <param name="MaxFileSize" value="1000KB" /> 
<!--  Keep one backup file --> 
     <param name="MaxBackupIndex" value="4" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d [%t] %-5p %l - %m%n" /> 
     </layout> 
</appender> 
3

我建议你切换到比System.out.println更好的测井设施,log4j是一个受欢迎的选择。

如果你不想包括用于此目的的另一个库,我建议你

  • 给所有线程有意义的名称(见Thread.setName
  • 包裹日志语句在你自己的静态记录功能
  • Thread.currentThread().getName()为前缀的每行输出。

如果你认为是太“侵入”或如果你处理的遗留代码,你可以创建自己的PrintStream其前缀各参数println与当前线程的名称(如上),然后执行System.setOut(new YourThreadLoggingPrintStream());

+0

好的。我现在使用log4j。但是,它是一个Tomcat服务器。我应该在哪里调用'BasicConfigurator.configure();'或者,在这种情况下并不那么简单? – coffee

+0

@Ernest我的意思是,我已经配置好了。但我不知道我怎么能遵循我的3线程呢。不管怎么说,还是要谢谢你。 – coffee

1

你可以使用log4j的,并设置了不同的记录器为每个线程,每个记录器连接到不同的Eclipse视图,但是这将是一个很大的配置和很多在您的应用程序编码。或者,如果您只是将线程ID与消息一起记录下来,那么即使所有线程都记录到相同视图,您也可以知道打印出哪个线程。

1

如果您使用log4j,则可以使用嵌套诊断上下文来保持线程的正确记录。

这里是国家数据中心的描述从the log4j manual

大多数实际系统必须处理多个客户端同时 。在这样一个典型的多线程实现系统中,不同的线程将处理不同的客户端。日志记录为 ,特别适用于跟踪和调试复杂的分布式应用程序。区分 一个客户端与另一个客户端的日志记录输出的常用方法是为每个客户端实例化一个新的单独记录器,用于 。这促进了记录器的扩散,并增加了记录的管理开销。

甲打火机技术是独特地标记来自同一客户端相互作用引发 每个日志的请求。尼尔·哈里森模式 语言程序设计3,由R.马丁D.里勒和F 布施曼(Addison-Wesley出版社,1997年)编辑在书中描述的这种方法 “用于记录诊断邮件的模式,”。

为了唯一地标记每个请求,用户将上下文信息 推入NDC,即嵌套诊断上下文的缩写。 NDC 类如下所示。

public class NDC { 
    // Used when printing the diagnostic 
    public static String get(); 

    // Remove the top of the context from the NDC. 
    public static String pop(); 

    // Add diagnostic context for the current thread. 
    public static void push(String message); 

    // Remove the diagnostic context for this thread. 
    public static void remove(); } 

NDC作为一组上下文信息被管理为每个线程。 请注意,org.apache.log4j.NDC类的所有方法都是静态的。 假设NDC打印已打开,每次发出日志请求 时,相应的log4j组件都会在日志输出中包含当前线程的整个NDC 堆栈。这是在用户干预的情况下完成的,该用户只负责将 正确信息放在NDC中,方法是在代码中几个明确定义的点处使用推送和弹出方法。相比之下,每个客户端的记录器方法都会对代码进行大量更改。

为了说明这一点,我们举一个servlet 为众多客户端提供内容的例子。在执行其他代码之前,servlet可以在请求开始时构建NDC 。上下文信息可以是客户端的主机名和该请求固有的其他信息,通常包含Cookie中的 信息。因此,即使servlet同时为多个客户端 提供服务,由相同的代码(即属于同一个记录器的 )启动的日志仍然可以被区分,因为每个客户端请求将具有不同的NDC堆栈。将这一点与将新实例化的记录器传递给在客户请求期间行使的所有代码 的复杂性相对比。