我用struts2+ibatis搭建的框架,在日志文件输出的时候遇到这个问题很是纠结,希望大家帮个忙解释哈……,谢谢了
首先我在log4的资源文件中配置如下:
[img]http://dl.iteye.com/upload/attachment/533623/370df173-5525-3a13-925f-206474bedcce.jpg[/img]
然后我启动项目,我测试日志输出的代码写在登录方法里面代码如下:
[img]http://dl.iteye.com/upload/attachment/533626/c9a12f46-cb94-39e0-a22a-7dc404790c17.jpg[/img]
然后运行发现:有日志文件在handlog.log文件在D:\workspace.metadata.me_tcat\webapps\Own_Project\log目录下面,
后面 我写了个测试类代码如下:
[img]http://dl.iteye.com/upload/attachment/533628/a01a23f1-0579-3ec9-912c-156f0e7dc2c6.jpg[/img]
运行后发现:有日志文件在handlog.log文件在D:\workspace.metadata.me_tcat\webapps\Own_Project\log目录下面,
log4的资源文件配置改成如下:
[img]http://dl.iteye.com/upload/attachment/533630/0211c3c6-95d7-351c-a08b-fdfa88922707.jpg[/img]
最后,我改了登录方法代码如下:
[img]http://dl.iteye.com/upload/attachment/533632/e61161cd-145e-35f4-a070-70ef6cefce30.jpg[/img]
log4的配置文件和上面那个是一样的都是动态的那种,但是我怎么测试都输出不了日志文件???这是为什么呢???
"LOG_DIR"是个变量,会被System Property中的“WORKDIR”的值代替,
但是这个有个前提是
在log4j加载配置文件之前,先用System.setProperty设置好“WORKDIR”的值。而你在加载log4j配置文件前根本没设置“WORKDIR”的值。
[code="java"]
public class Log4jInit extends HttpServlet {
static Logger logger = Logger.getLogger(Log4jInit.class);
public Log4jInit() {
}
public void init(ServletConfig config) throws ServletException {
String prefix = config.getServletContext().getRealPath("/");
String file = config.getInitParameter("log4j");
String filePath = prefix + file;
Properties props = new Properties();
try {
FileInputStream istream = new FileInputStream(filePath);
props.load(istream);
istream.close();
));
//设置路径
String logFile = prefix + props.getProperty("log4j.appender.handLog.file");
props.setProperty("log4j.appender.handLog.File",logFile);
PropertyConfigurator.configure(props);//装入log4j配置信息
} catch (IOException e) {
toPrint("Could not read configuration file [" + filePath + "].");
toPrint("Ignoring configuration file [" + filePath + "].");
return;
}
}
public static void toPrint(String content) {
System.out.println(content);
}
}
[/code]
[code="xml"]
log4j-init
Log4jInit
log4j
WEB-INF/classes/log4j.properties
[/code]
这取决于log4j.properties先被装载,还是LOG_DIR系统属性先被定义。
根据常识,log4j一开始就装载了那个log4j.properties,那时候LOG_DIR还没定义呢。而当login()被调用的时候你定义LOG_DIR,已经晚了。log4j不会因此重新装载那个配置文件。所以没用。
不应该在login的地方再设置路径吧。
应该在系统启动的时候就设置路径然后再装在Log4J
在一个Servlet的init方法中做
楼上的童鞋说的是,你如果需要在log4j配置文件中使用环境变量,必须在log4j初始化之前设置好,而且一旦log4j初始化完成后,在改变环境变量来说是没有用的,因为log4j初始化是已经把环境变量直接替换成真实的值了。
你可以看看Spring里的Log4jConfigListener的做法。