今天看到log4j裏的一個工具類,用來監控文件,如有變動就執行特定的操作,簡單且有用,只需要實現一個doOnChange()方法即可。
從這個文件可以看出,其實log4j.properties或者log4j.xml是可以實現在線修改的,不用重啓服務,只需在web.xml里加一個org.springframework.web.util.Log4jConfigListener,再用<context-param>配置一個初始屬性log4jRefreshInterval,即刷新log4j配置信息的間隔時間,單位是毫秒,如下:
1
2
3
4
5
6
7
8
9
10
11
|
< context-param > < param-name >log4jConfigLocation</ param-name > < param-value >log4j.properties</ param-value > </ context-param > < context-param > < param-name >log4jRefreshInterval</ param-name > < param-value >60000</ param-value > </ context-param > < listener > < listener-class >org.springframework.web.util.Log4jConfigListener</ listener-class > </ listener >
非web應用的話需要寫一個類Foo繼承org.apache.log4j.varia.ReloadingPropertyConfigurator,重寫doConfigure方法,直接調用org.apache.log4j.PropertyConfigurator.configureAndWatch(String, long);
FileWatchdog源碼如下: /* *
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; import org.apache.log4j.helpers.LogLog; /** Check
every now and then that a certain file has not changed. If it has,
then call the {<a href="http://my.oschina.net/link1212" target="_blank" rel="nofollow">@link</a> #doOnChange} method. <a
href="http://my.oschina.net/arthor" target="_blank" rel="nofollow">@author</a> Ceki Gülcü <a
href="http://my.oschina.net/u/266547" target="_blank" rel="nofollow">@since</a> 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 {<a href="http://my.oschina.net/link1212" target="_blank" rel="nofollow">@link</a> #DEFAULT_DELAY}.
*/ protected long
delay = DEFAULT_DELAY; File
file; long lastModif
= 0 ; boolean warnedAlready
= false ; boolean interrupted
= false ; protected FileWatchdog(String
filename) { 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(); } } } |