有没有办法从System.out.println触发一个触发器?

时间:2012-02-09 21:53:33

标签: java triggers listen system.out

这可能是一个非常愚蠢的问题,但是,有什么方法可以在用Java在控制台上打印某些内容并在其他地方监听它时触发一个触发器?

我对触发器或System类(或Logger)的理解很少,所以如果有更简单的方法(没有触发器),请告诉我。

我们正在尝试使用Logger记录所有测试。目前,我们一直在使用简单的“System.out.println”来记录控制台中的所有内容,因此我想知道是否可以在打印到打印机时触发触发器,然后让侦听器将该信息添加到Logger。

感谢。

4 个答案:

答案 0 :(得分:6)

最直接的方法是

System.setOut(new PrintStream(System.out) {
  public void println(String s) {
    logger.log(s);
    super.println(s);
  }
  // override some other methods?
});

答案 1 :(得分:2)

面向方面编程(AOP)可以帮助您实现此行为。

由于您正在使用Java,因此您可以使用AspectJ(最成熟的AOP语言之一)捕获对System.out.println()的所有调用,并“注入”您通知Logger类的行为。

以下是AspectJ中的一些示例代码:

pointcut somethingIsBeingLogged(): execution(public static * System.out.println());
before() : somethingIsBeingLogged() {
    // Get the context by joinPoint.getThis();
    // Notify the Logger class
}

您实际上可以停止对System.out.println()的调用,只让您的Logger类获得控制权。如果您想采用AOP路径,我可以提供更多详细信息。

答案 2 :(得分:1)

对于Louis Wasserman来说,这只是一个很好的单身包装。任何想要使用它的人都可以免费使用我的代码。使用它,您可以以相当简单的方式在任何地方获得控制台输出。

public class SystemOutListener {

    private static SystemOutListener singleton;

    public static SystemOutListener GetSingleton() {
        if (singleton == null) {
            singleton = new SystemOutListener();
            singleton.ReplaceStandartSystemOutPrintStream();
        }
        return singleton;
    }
    private ArrayList<ISystemOutObserver> observersList = new ArrayList<>();

    public void AttachSystemOutObserver(ISystemOutObserver observer) {
        observersList.add(observer);
    }

    public void RemoveSystemOutObserver(ISystemOutObserver observer) {
        observersList.remove(observer);
    }

    private void FireSystemOutPrintln(String message) {
        for (int i = 0; i < observersList.size(); i++) {
            java.awt.EventQueue.invokeLater(new HandleSystemOutRunner(observersList.get(i), message));
        }
    }

    private void ReplaceStandartSystemOutPrintStream() {
        System.setOut(new PrintStream(System.out) {
            @Override
            public void println(String s) {
                super.println(s);
                FireSystemOutPrintln(s);
            }
        });
    }

    public interface ISystemOutObserver {
        public void HandleSystemOut(String message);
    }

    private class HandleSystemOutRunner implements Runnable {

        private String message;
        private ISystemOutObserver target;

        public HandleSystemOutRunner(ISystemOutObserver target, String message) {
            this.message = message;
            this.target = target;
        }

        @Override
        public void run() {
            target.HandleSystemOut(message);
        }
    }
}

用法:

SystemOutListener.GetSingleton().AttachSystemOutObserver(/*YOUR OBSERVER*/)

Lambda(Java 8)也可以代替观察者使用!

答案 3 :(得分:0)

可能距离你需要的地方一千英里,但你可以在linux下使用像“watch”这样的东西寻找特定的文字。如果您要注销文件,可以设置“监视”以监视文件中的某些文本并相应地发出指令。