最近另一个项目组找到我,请我帮忙写日志部分,大概因为之前写过一点log4j的扩展吧。写完后,到网上又逛了一下,看是否有更好的解决方案,无意中发现了这个http://java.dzone.com/articles/do-you-know-log4j-sound-appender,感觉挺有意思的。

看文章里讨论得蛮热烈的,不由心动,自己试了一把。之前又建过一个DownloadManager工程,把它改造成Maven工程。

首先加上依赖,目前已经到1.1版本了。

<dependency>
    <groupId>log4j</groupId>
    <artifactId>apache-log4j-extras</artifactId>
    <version>1.1</version>
</dependency>

接下来先给DownloadManager加上日志功能吧。正好研究一下JDownload的日志实现。JDownload里的日志不是用的Log4j,而是Java Util包中的日志类。改造了一下,换成Log4j。好在之前写过Log4J的扩展,轻车熟路,一会就弄好了。关键是加上了这个方法。

private static SoundAppender createSoundAppender(String name, String audioURL, Level level,
        Layout layout) {
    SoundAppender soundAppender = new SoundAppender();
    soundAppender.setName(name);
    soundAppender.setAudioURL(audioURL);
    soundAppender.setThreshold(level);
    soundAppender.setLayout(layout);
    soundAppender.activateOptions();

    LevelMatchFilter levelMatchFilter = new LevelMatchFilter();
    levelMatchFilter.setLevelToMatch("WARN");
    soundAppender.addFilter(levelMatchFilter);
    return soundAppender;
}

这就差不多了,打个日志试试吧。可是我试来试去,死活出不来声音。一怒之下,把源码Check Out出来读了一遍。

https://svn.apache.org/repos/asf/logging/log4j/companions/extras/trunk

看了一下源码后,发现跟我的预期相差甚远。原本以为它可以把你的日志记录成声音格式,心想会不会用到了什么Text2Speech技术。看了源码后,直呼上当,其实就是一开始定义一个声音文件,触发了事件后就播放一下。

/**
* Play the sound if an event is being processed
*/
protected void append(LoggingEvent event) {
    if (clip != null) {
        clip.play();
    }
}

O(∩_∩)O~,不过应该也是有办法实现Text2Speech的,http://java.sun.com/products/java-media/speech/reference/codesamples/index.html,有时间可以给它扩展下。

试验源代码:http://javaforge.com/svn/RoaringTiger/trunk/DownloadManager Revision 7。