有时候,我们需要确定某些文件是否有变化而做出一些对应的动作,例如,曾经开发的一款服务器中,由于模块比较多,在运行期间有时候需要单独的输出某个模块日志,但又不可能总是开着日志。
log4j中已经实现了可以动态监控日志级别日志监视器
PropertyConfigurator.configureAndWatch(properties);
上面的properties是日志配置文件,例如常用的 log4j.properties ,log4j.xml。
但是这是系统级别的,然后看了一下源代码,
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Contributors: Mathias Bogaert
package org.apache.log4j.helpers;
import java.io.File;
/**
* Check every now and then that a certain file has not changed. If it has, then
* call the {@link #doOnChange} method.
*
* @author Ceki Gülcü
* @since version 0.9.1
*/
public abstract class FileWatchdog extends Thread {
/**
* The default delay between every file modification check, set to 60
* seconds.
*/
static final public long DEFAULT_DELAY = 60000;
/**
* The name of the file to observe for changes.
*/
protected String filename;
/**
* The delay to observe between every check. By default set
* {@link #DEFAULT_DELAY}.
*/
protected long delay = DEFAULT_DELAY;
File file;
long lastModif = 0;
boolean warnedAlready = false;
boolean interrupted = false;
protected FileWatchdog(String filename) {
super("FileWatchdog");
this.filename = filename;
file = new File(filename);
setDaemon(true);
checkAndConfigure();
}
/**
* Set the delay to observe between each check of the file changes.
*/
public void setDelay(long delay) {
this.delay = delay;
}
abstract protected void doOnChange();
protected void checkAndConfigure() {
boolean fileExists;
try {
fileExists = file.exists();
} catch (SecurityException e) {
LogLog.warn("Was not allowed to read check file existance, file:["
+ filename + "].");
interrupted = true; // there is no point in continuing
return;
}
if (fileExists) {
long l = file.lastModified(); // this can also throw a
// SecurityException
if (l > lastModif) { // however, if we reached this point this
lastModif = l; // is very unlikely.
doOnChange();
warnedAlready = false;
}
} else {
if (!warnedAlready) {
LogLog.debug("[" + filename + "] does not exist.");
warnedAlready = true;
}
}
}
public void run() {
while (!interrupted) {
try {
Thread.sleep(delay);
} catch (InterruptedException e) {
// no interruption expected
}
checkAndConfigure();
}
}
}
这是一个抽象类,子类只要实现最关心的文件内容有变化的回调方法 doOnChange 就OK。
因此,在一个工程中,如果想实现模块级别的日志控制,则我们可以附件一个配置文件,在这个配置文件中指定模块的日志级别, 在log4j中指定总的级别,然后在应用中实现文件内容监控,则可以做到动态切换,实现细粒度的控制。
分享到:
相关推荐
一旦检测到文件变化,你可以执行相应的处理逻辑,例如将新创建或修改的文件上传到服务器。 接下来,我们讨论“模拟POST提交文件流同步服务器文件”。在Java中,可以使用`java.net.HttpURLConnection`或第三方库如...
Java实现实时监控目录下文件变化的方法 Java实现实时监控目录下文件变化的方法是指通过Java语言来实现实时监控目录下文件的变化情况,包括文件的创建、删除、修改等操作。这种方法可以应用于各种场景,例如文件系统...
在IT领域,尤其是在系统管理和自动化任务执行中,有时我们需要实时监控某个目录下的文件变化,并在文件发生变动时执行特定操作,如复制文件到其他位置。这个场景可以通过编程实现,常用的编程语言如Python、Java或C#...
在Android平台上,开发Java应用程序时,我们经常需要处理与文件系统相关的任务,其中之一就是实现文件监听器。这个功能允许我们实时监控一个特定的文件夹,一旦该文件夹中有新的文件出现,程序可以立即做出响应,...
在Java编程中,监测文件变化是一项重要的功能,特别是在开发日志系统、自动化构建工具或实时数据处理应用时。本文将详细讲解如何使用Java实现文件变化的监控,并通过一个具体的示例来阐述相关知识点。 首先,Java中...
用java语言编写的ftp小工具,可以按指定时间监控ftp服务器,把服务器指定目录内新产生的文件或者文件夹下载到本地指定文件夹,下载后删除数据。 也可以监控本地文件夹,把文件夹内新产生的文件或者文件夹整体上传到...
4. **文件系统监控**:利用FileObserver或WatchService监听USB设备目录,捕获文件变化。 5. **后台服务**:创建并管理后台服务,使得程序能在用户无感知的情况下持续运行。 6. **权限控制**:适当地设置程序的权限,...
总的来说,"spring boot文件夹文件监听程序"是一个结合了Java文件系统监听和Spring Boot自动化功能的实用工具,它可以实时监控指定目录,及时响应文件变化,对于文件管理、数据同步等场景具有很高的价值。...
本文将通过一个示例介绍如何使用Java的WatchService来监听文件变化。 首先,需要注意的是,WatchService仅能对目录进行监视,而不能对文件进行监视。在开始编写代码之前,我们需要确定一个目录的路径来作为监听的...
### Java监听数据库的背景与意义 在现代软件开发中,数据库是存储和管理数据的核心组件。为了确保数据的一致性和完整性,开发者需要能够监控并响应数据库中的变化。Java监听数据库的概念主要涉及到数据库触发器、...
除了编程实现外,还有一些图形界面工具和命令行工具可以用于文件变化监控,比如`fswatch`(跨平台)、`tail`命令的 `-f`选项(实时追踪文件追加内容)等。 六、应用场景 1. 日志分析:实时查看日志文件的新增内容,...
- **异步HotLog模式**:变化数据从源数据库的在线重做日志文件中捕获。这种方式存在一定的延迟,因为数据提交和写入日志之间存在时间差。 - **创建异步HotLog模式**:需要设置ChangeTable来存储变化数据。通过LGWR...
可以定义一个`FileSystemChangeEvent`接口,`FileSystemObserver`负责监听文件系统的变化,如文件系统的`FileWatcher`类实现`Observable`,在文件系统发生变化时通知观察者。 6. **模式的优点** - **松耦合**:被...
这篇博客“java监听器”可能详细解释了如何在Java中使用监听器以及它们在实际项目中的应用。 首先,我们来理解什么是Java监听器。在Java Swing或JavaFX等GUI库中,监听器是接口,实现了这些接口的类可以“监听”...
在Java中,我们可以使用`java.net.ServerSocket`来监听TCP连接,`java.nio.channels.FileChannel`来监听文件系统变化。监听进程通常设计为无阻塞的,以确保它可以高效地处理多个并发事件。 接下来,我们将探讨如何...
这个项目“java监听器+quartz实现每天动态时间执行任务的功能”是结合了Java的监听器机制和Quartz定时任务框架来完成这样的需求。下面将详细解释这两个关键知识点。 **Java监听器** Java监听器是Java AWT和Swing库...
- `oracl.sql`文件可能是包含触发器和存储过程定义的SQL脚本,而`Test`文件可能是一个测试类或示例,用于演示如何在Java中建立Socket连接并接收数据。 5. **安全与性能考虑**: - 数据库直接与应用通过Socket通信...
7. **文件自动加密**:文件加密通常涉及对文件内容进行编码转换。Java提供了`javax.crypto`包,其中包含各种加密算法,如AES(高级加密标准)和RSA。可以使用`Cipher`类进行加密和解密操作。 8. **多线程编程**:...
### Java监听器和过滤器详解 #### 监听器概念及分类 监听器在Java Web开发中扮演着非常重要的角色,主要用于监听特定容器事件的发生,比如服务器对象的创建与销毁等,并根据这些事件做出相应的处理。它的工作原理...
Java中的监听机制与观察者设计模式是编程中重要的概念,它们在软件开发中扮演着关键的角色,尤其是在构建可扩展和可维护的系统时。这里,我们将深入探讨这两个主题,并通过实例来阐述它们的工作原理和应用。 首先,...