java如何判断apache的日志文件正在被使用?50分

时间:2022-10-01 05:18:16
现在用java做一个apache的日志分析工具,但是在apache的日志目录中,有一个是当前apache正在记录的日志文件。准备忽略该文件,但是不知道用什么方法判断哪个文件是apache正在用的日志。

本来以为很简单的事情折腾了半天竟然没法解决。

1.用canwrite方法,返回true;晕倒
2.用filewriter强行向正在记录的日志文件写数据,本来想它会抛异常,结果竟然成功,再次晕倒。
3.csdn上狂搜半天,居然没发现一个比较好的解决方案,继续晕。。。。。

不知道各位有没有什么好办法解决呢?

12 个解决方案

#1


这种东西要用平台API比较好。

#2


多谢楼上兄弟回答。
用os的api就比较麻烦,因为肯定会用在各种平台上,如果用平台的话,复杂度大大提高~~
不知各位还有没有什么比较好的办法,曲线救国也行。。。

#3


不会~ 
我想日志不会还弄个文件锁吧~~ 能写能读是当然,如果一定要判断的吧~~判断名字吧~~日志文件一般有特殊的命名规则~~

#4


真搞不明白,既然jdk有不同平台的版本,为什么这种东西不在jdk里面实现啊

#5


1 我觉得可以用约定来做

日期最新的一个,肯定是在用的一个

OVER

2 你做分析工具,你可以把日志复制到另一个单独目录,再对那个目录的文件分析就可以了!

#6


多谢 java2000回复,你说的我都考虑过。

1.用日期最新的方法判断,在一个极端情况下有一个bug,就是如果从新的一天开始,到日志分析任务开始执行时刻,没有人访问web的话,apache是不会重新生成日志的,这样就会遗漏最后一个,如果对时效要求高一点,这样就会有问题

2.目前做的这个东东是给其他同事用的,水平参差,想尽量做的智能一点。

目前打算用当前时间和日志文件最后修改时间判断,如果在同一天,则不对日志处理。

还是觉得不太爽,呵呵,先这么着吧。

#7


只要不是在写入中,文件就可以被另一个进程写入。
最好换种思路,比如名字最后一次修改时间等。

#8


多谢楼上各位!

看来最初的思路,除了调用os的api外没有直接的解决方案了。多谢各位!

#9




~~~~飘过~~~~
~~~友情UP~~~~


#10


重写Apache包.

#11


想知道哪个正在用的日志...我有个方法...

当系统使用了日志,用户要移动、修改、删除日志都不可以的。所以你要判断哪个日志系统正在用,在文件写写一个空的byte就行。

File files = new File("日志目录");

int idx;

try{
   for(int i = 0 ; i < files.length ; i++){
       FileOutputStream fos = new FileOutputStream(files[i]);
       fos.write((byte)0);        
       fos.close();
   }
}catch(Exception ex){
    idx = i;
}

//系统正在用的日志是:
files[i]

#12


//系统正在用的日志是: 
files[idx]

#1


这种东西要用平台API比较好。

#2


多谢楼上兄弟回答。
用os的api就比较麻烦,因为肯定会用在各种平台上,如果用平台的话,复杂度大大提高~~
不知各位还有没有什么比较好的办法,曲线救国也行。。。

#3


不会~ 
我想日志不会还弄个文件锁吧~~ 能写能读是当然,如果一定要判断的吧~~判断名字吧~~日志文件一般有特殊的命名规则~~

#4


真搞不明白,既然jdk有不同平台的版本,为什么这种东西不在jdk里面实现啊

#5


1 我觉得可以用约定来做

日期最新的一个,肯定是在用的一个

OVER

2 你做分析工具,你可以把日志复制到另一个单独目录,再对那个目录的文件分析就可以了!

#6


多谢 java2000回复,你说的我都考虑过。

1.用日期最新的方法判断,在一个极端情况下有一个bug,就是如果从新的一天开始,到日志分析任务开始执行时刻,没有人访问web的话,apache是不会重新生成日志的,这样就会遗漏最后一个,如果对时效要求高一点,这样就会有问题

2.目前做的这个东东是给其他同事用的,水平参差,想尽量做的智能一点。

目前打算用当前时间和日志文件最后修改时间判断,如果在同一天,则不对日志处理。

还是觉得不太爽,呵呵,先这么着吧。

#7


只要不是在写入中,文件就可以被另一个进程写入。
最好换种思路,比如名字最后一次修改时间等。

#8


多谢楼上各位!

看来最初的思路,除了调用os的api外没有直接的解决方案了。多谢各位!

#9




~~~~飘过~~~~
~~~友情UP~~~~


#10


重写Apache包.

#11


想知道哪个正在用的日志...我有个方法...

当系统使用了日志,用户要移动、修改、删除日志都不可以的。所以你要判断哪个日志系统正在用,在文件写写一个空的byte就行。

File files = new File("日志目录");

int idx;

try{
   for(int i = 0 ; i < files.length ; i++){
       FileOutputStream fos = new FileOutputStream(files[i]);
       fos.write((byte)0);        
       fos.close();
   }
}catch(Exception ex){
    idx = i;
}

//系统正在用的日志是:
files[i]

#12


//系统正在用的日志是: 
files[idx]