在 JVM 中创建文件时,commons-io Tailer 不调用 handle()
commons-io Tailer is not calling handle() when file is created inside the JVM
我有一个可用的 Tailer 实现 (commons-io Tailer)
这是我的裁缝:
public class SyslogConsumer implements TailerListener {
@Override
public void handle(String line) { System.out.println(line);}
...
}
public void process() {
TailerListener listener = new SyslogConsumer();
final Tailer tailer = Tailer.create( path.toFile(), listener );
Runtime.getRuntime().addShutdownHook( new Thread( "LogProcessor shutdown hook" ) {
public void run() {
tailer.stop();
}
} );
}
和我的测试:
public class LogProcessorTest {
private static Path templog;
private static final String logEvent = "May 1 00:00:00 this is valid";
@Before
public void setup()
throws IOException
{
templog = Files.createTempFile( "logprocessing", ".log" );
templog.toFile().deleteOnExit();
BufferedWriter bw = new BufferedWriter( new FileWriter( templog.toFile() ) );
bw.write( logEvent );
bw.newLine();
bw.close();
}
@Test
public void testProcessingValidEntriesProducesEvents()
throws IOException
{
// utility method that pipes stdout to my bytearray
ByteArrayOutputStream bos = new ByteArrayOutputStream();
TestUtils.captureStdOut( bos );
LogProcessor proc = new LogProcessor( templog.toString() );
proc.process();
String s = bos.toString( "UTF-8" );
Assert.assertEquals( logEvent, s );
}
}
在检查 bos 的内容时,它是空的,但日志文件包含 2 行:
>May 1 00:00:01 this is valid
>
如果我将测试指向使用 bash 脚本创建和写入的文件:
$ cat test/endlessLogGenerator.sh
#! /bin/bash
DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
out="$DIR/data/logstream.out"
echo > $out
c=0
while :
do
let c=$((c+1))
echo $(date +"%b %d %T this is message $c") >> $out
sleep 1
done
那么它就完美了。然而,当我在测试运行器中创建文件时,我的侦听器从未被 Tailer 处理程序调用。我尝试在一个单独的线程中创建我的文件,也尝试写入一个不是由测试创建的现有文件,还尝试在将它交给 Tailer 观看后写入我的测试中的文件,等等。没有任何效果。我似乎尝试在测试运行器中写入文件的任何事情都不会导致 TailerListener 触发 handle() 方法。我是 运行 在 Windows 7 和 Java 8 上,在 Eclipse 中。有没有人有使用 JVM 写入的文件对 TailerListener 的 handle() 方法进行单元测试的经验 运行 测试?
谢谢。
原来我的问题是由 Tailer 吞下异常并静默关闭流引起的:
Tailer's run() implementation...
....
} catch (Exception e) {
listener.handle(e);
} finally {
IOUtils.closeQuietly(reader);
}
....
在我的 handle() 实现中,我从日志中解析日期,但 DateTimeFormatter 没有设置正确的模式,因此它抛出了一个未经检查的运行时异常,该异常被 Tailer 捕获。奇怪的库实现者选择来设计这种行为。
我保留了这个问题,而不是将其删除,因为这个警告可能会派上用场。
我有一个可用的 Tailer 实现 (commons-io Tailer) 这是我的裁缝:
public class SyslogConsumer implements TailerListener {
@Override
public void handle(String line) { System.out.println(line);}
...
}
public void process() {
TailerListener listener = new SyslogConsumer();
final Tailer tailer = Tailer.create( path.toFile(), listener );
Runtime.getRuntime().addShutdownHook( new Thread( "LogProcessor shutdown hook" ) {
public void run() {
tailer.stop();
}
} );
}
和我的测试:
public class LogProcessorTest {
private static Path templog;
private static final String logEvent = "May 1 00:00:00 this is valid";
@Before
public void setup()
throws IOException
{
templog = Files.createTempFile( "logprocessing", ".log" );
templog.toFile().deleteOnExit();
BufferedWriter bw = new BufferedWriter( new FileWriter( templog.toFile() ) );
bw.write( logEvent );
bw.newLine();
bw.close();
}
@Test
public void testProcessingValidEntriesProducesEvents()
throws IOException
{
// utility method that pipes stdout to my bytearray
ByteArrayOutputStream bos = new ByteArrayOutputStream();
TestUtils.captureStdOut( bos );
LogProcessor proc = new LogProcessor( templog.toString() );
proc.process();
String s = bos.toString( "UTF-8" );
Assert.assertEquals( logEvent, s );
}
}
在检查 bos 的内容时,它是空的,但日志文件包含 2 行:
>May 1 00:00:01 this is valid
>
如果我将测试指向使用 bash 脚本创建和写入的文件:
$ cat test/endlessLogGenerator.sh
#! /bin/bash
DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
out="$DIR/data/logstream.out"
echo > $out
c=0
while :
do
let c=$((c+1))
echo $(date +"%b %d %T this is message $c") >> $out
sleep 1
done
那么它就完美了。然而,当我在测试运行器中创建文件时,我的侦听器从未被 Tailer 处理程序调用。我尝试在一个单独的线程中创建我的文件,也尝试写入一个不是由测试创建的现有文件,还尝试在将它交给 Tailer 观看后写入我的测试中的文件,等等。没有任何效果。我似乎尝试在测试运行器中写入文件的任何事情都不会导致 TailerListener 触发 handle() 方法。我是 运行 在 Windows 7 和 Java 8 上,在 Eclipse 中。有没有人有使用 JVM 写入的文件对 TailerListener 的 handle() 方法进行单元测试的经验 运行 测试?
谢谢。
原来我的问题是由 Tailer 吞下异常并静默关闭流引起的:
Tailer's run() implementation...
....
} catch (Exception e) {
listener.handle(e);
} finally {
IOUtils.closeQuietly(reader);
}
....
在我的 handle() 实现中,我从日志中解析日期,但 DateTimeFormatter 没有设置正确的模式,因此它抛出了一个未经检查的运行时异常,该异常被 Tailer 捕获。奇怪的库实现者选择来设计这种行为。
我保留了这个问题,而不是将其删除,因为这个警告可能会派上用场。