Java 用旋转跟踪std输出文件,这会长期有效吗?
我正在尝试实现一个日志跟踪程序,它将在前一个文件被删除并替换为新文件(永远)后继续跟踪。所以,我不必每次重启服务器(打印日志)时都运行这个程序 这是我的密码Java 用旋转跟踪std输出文件,这会长期有效吗?,java,tail,Java,Tail,我正在尝试实现一个日志跟踪程序,它将在前一个文件被删除并替换为新文件(永远)后继续跟踪。所以,我不必每次重启服务器(打印日志)时都运行这个程序 这是我的密码 public void tail(String file) throws InterruptedException, IOException { waitUntilFileExist(file); File f = new File(file); BufferedReader br = new BufferedR
public void tail(String file) throws InterruptedException, IOException {
waitUntilFileExist(file);
File f = new File(file);
BufferedReader br = new BufferedReader(new FileReader(file.trim()));
br.skip(f.length());
String line = null;
while (f.exists()) {
f = new File(file);
line = br.readLine();
if (line == null) {
Thread.sleep(1000);
} else {
if (msl != null) {
//Send line to attached interface
msl.onMessage(line);
}
}
}
waitUntilFileExist(file);
tail(file);
}
public void waitUntilFileExist(String file) throws InterruptedException {
File f = new File(file);
if (!f.exists()) {
System.out.println("File doesn't exists");
Thread.sleep(1000);
waitUntilFileExist(file);
} else {
System.out.println("File does exists");
}
}
首先,它将检查指定的文件是否存在?当它确实存在时,读取文件并打印行。如果文件在读取时被删除,它将等待文件被重新创建,然后调用tail方法
我在Linux机器上进行了测试,效果很好,但我不确定这是否是正确的方法。
你有没有别的办法?
这对生产环境(如天和月)有效吗?您的程序将因堆栈溢出错误而失败,因为每次您在两种方法
tail
和waitUntilFileExist
中使用递归方法调用时,都会越来越深,并且永远无法从中退出。
我为您的代码制作了更好的变体:
public void tail(字符串文件)抛出InterruptedException、IOException{
布尔值isNeedRun=true;
while(isNeedRun){
waitUntilFileExist(文件);
试一试{
读取文件(文件);
}捕获(例外e){
e、 printStackTrace();
}
}
}
私有void readFile(字符串文件)引发InterruptedException,IOException{
文件f=新文件(文件);
FileReader=newFileReader(file.trim());
试一试{
BufferedReader br=新的BufferedReader(读卡器);
br.跳过(f.长度());
弦线;
而(f.exists()){
f=新文件(文件);
line=br.readLine();
如果(行==null){
睡眠(1000);
}否则{
如果(msl!=null){
//将线路发送到连接的接口
msl.onMessage(行);
}
}
}
}最后{
试一试{
reader.close();
}捕获(例外e){
e、 printStackTrace();
}
}
}
私有void waitUntilFileExist(字符串文件)引发InterruptedException{
文件f=新文件(文件);
而(!f.exists()){
System.out.println(“文件不存在”);
睡眠(1000);
}
System.out.println(“文件确实存在”);
}
但是这个变种也不完美!您可能会丢失一些行,因为可能会出现这样的情况,即在行之间将某些内容写入文件waitUntilFileExist(文件)代码>和br.skip(f.length())代码>
如果您在unix系统上需要tail,最好使用tail控制台工具。您可以从java启动单独的进程并使用它的输出。当删除并再次创建文件时,此变量将保证0%的丢失