基本思路
- 继承 FileAlterationListenerAdaptor接口(或实现 FileAlterationListener 接口)
- 使用 FileAlterationObserver 注册上述的 listerner
- 使用 FileAlterationMonitor 注册上述的 observer
- 实现 CommandLineRunner接口
注:FileAlterationObserver、FileAlterationMonitor都属于commons-io下的类。
现实代码
/**
* 监听文件变化
*/
public class FileListenerFactory {
// 设置监听路径
private final static String monitorDir = "/opt/lzth";
// 设置监听文件后缀
private final static String suffix = ".txt,.pdf,.word,.xls,.xlsx";
// 设置轮询间隔
private final static long interval = TimeUnit.SECONDS.toMillis(1);
public static FileAlterationMonitor getMonitor() {
// 创建过滤器
IOFileFilter directories = FileFilterUtils.and(
FileFilterUtils.directoryFileFilter(),
HiddenFileFilter.VISIBLE);
List<IOFileFilter> list = new ArrayList<>();
String[] split = suffix.split(",");
IOFileFilter ioFileFilter;
for (String s : split) {
ioFileFilter = FileFilterUtils.suffixFileFilter(s);
list.add(ioFileFilter);
}
list.add(FileFilterUtils.fileFileFilter());
IOFileFilter files = new OrFileFilter(list);
IOFileFilter filter = FileFilterUtils.or(directories, files);
// 装配过滤器
FileAlterationObserver observer = new FileAlterationObserver(new File(monitorDir), filter);
// 向监听者添加监听器
observer.addListener(new FileChangeListener());
// 返回监听者
return new FileAlterationMonitor(interval, observer);
}
/**
* 这属于第二种现实方式,暂时不做介绍,下次进行分享
* 系统层文件监听
*/
public static void fileMonitor(){
/** 关注目录的事件 */
int mask = JNotify.FILE_CREATED |
JNotify.FILE_DELETED |
JNotify.FILE_MODIFIED|
JNotify.FILE_RENAMED|
JNotify.FILE_ANY;
/** 是否监视子目录,即级联监视 */
boolean watchTree = true;
MyJNotifyAdapter jNotifyListener = new MyJNotifyAdapter();
try {
int watchID = JNotify.addWatch(monitorDir, mask, watchTree, jNotifyListener);
System.out.println("监听程序Id:" + watchID);
} catch (JNotifyException e) {
e.printStackTrace();
}
}
}
/**
* 文件变化监听器
* 在Apache的Commons-IO中有关于文件的监控功能的代码. 文件监控的原理如下:
* 由文件监控类FileAlterationMonitor中的线程不停的扫描文件观察器FileAlterationObserver,
* 如果有文件的变化,则根据相关的文件比较器,判断文件时新增,还是删除,还是更改。(默认为1000毫秒执行一次扫描)
*/
public class FileChangeListener extends FileAlterationListenerAdaptor {
private static Logger log = LoggerFactory.getLogger(FileChangeListener.class);
public FileChangeListener() {
}
@Override
public void onStart(FileAlterationObserver observer) {
log.info("[轮询开始]");
}
@Override
public void onDirectoryCreate(File directory) {
log.info("[目录创建]:" + directory.getAbsolutePath());
}
@Override
public void onDirectoryChange(File directory) {
log.info("[目录改变]:" + directory.getAbsolutePath());
}
@Override
public void onDirectoryDelete(File directory) {
log.info("[目录删除]:" + directory.getAbsolutePath());
}
@Override
public void onFileCreate(File file) {
log.info("[文件创建]:" + file.getName());
}
/*
*获取文件变更的内容,可通过正则获取系统生成的log文件部分内容
*具体怎么获取需要的信息,这样不介绍,现实方式多种多样
*/
@Override
public void onFileChange(File file) {
log.info("[文件改变]:" + file.getName());
}
@Override
public void onFileDelete(File file) {
log.info("[文件删除]:" + file.getName());
}
@Override
public void onStop(FileAlterationObserver observer) {
log.info("[轮询结束]");
}
}
总结:通过此次方式实现获取系统运行日志,存在不能及时获取日志变更内容和轮询间隔具体设置多少比较的问题。
本文暂时没有评论,来添加一个吧(●'◡'●)