java log4j相对路径_Log4j中配置日志文件相对路径

以上是网上log4j日志文件的相对路径配置的三种方法(我能找到的就三种),分析:

方法一主要是扩展了log4j的RollingFileAppender类,其他的FileAppender同样道理。扩展的方法,就是用一个子类去覆盖setFile方法,这个方法在log4j读取配置文件生成appender的时候调用,传入的就是配

置文件中的路径,这样我就可以按照自己的想法在路径前面加上根路径了。这种方法可以在log4j.properties中用相对路径自由配置log4j.appender.A1.File属性来决定生成的日志相对web应用根

目录的位置。

方法二是利用服务器vm中已经存在的环境变量如${catalina.home}来设置相对于${catalina.home}的日志路径,日志只能放到服务器子目录里,而且如果是用的其它服务器,则要改对应的环境变量。此方法平台移植不方便。

方法三是扩展ActionServlet类,覆盖其init()方法,新方法中载入log4j.properties位置的参数,可以自由配置log4j的配置文件的名字和存放位置。也可自由配置log4j日志文件的相对于当前应用的路径。详

细代码如下:

程序代码

package wbb.bysxxglxt.util;

import org.apache.struts.action.*;

import org.apache.commons.logging.LogFactory;

import org.apache.commons.logging.Log;

import Javax.servlet.ServletException;

import java.util.Properties;

import java.io.InputStream;

import org.apache.log4j.PropertyConfigurator;

import java.io.FileInputStream;

import java.io.IOException;

public class ExtendedActionServlet extends ActionServlet {

private Log log = LogFactory.getLog(this.getClass().getName());

public ExtendedActionServlet() {}

public void init() throws ServletException {

log.info(

"Initializing, My MyActionServlet init this System's Const Variable");

String prefix = this.getServletConfig().getServletContext().getRealPath(

"/");

String file = this.getServletConfig().getInitParameter("log4j");

String filePath = prefix + file;

Properties props = new Properties();

System.out.println(prefix);

System.out.println(file);

System.out.println(filePath);

try {

FileInputStream log4jStream = new FileInputStream(filePath);

props.load(log4jStream);

log4jStream.close();

String logFile = prefix +

props.getProperty("log4j.appender.A1.File"); //设置路径

System.out.println(logFile);

props.setProperty("log4j.appender.A1.File", logFile);

PropertyConfigurator.configure(props); //装入log4j配置信息

} catch (IOException e) {

e.printStackTrace();

}

log.info("Initializing, end My Init");

super.init();//应用了struts,此方法不能省,ActionServlet覆盖了的此方法中有很多重要操作

}

}

**********************应用web.xml 关键部分***************************

程序代码

action

wbb.bysxxglxt.util.ExtendedActionServlet

config

/WEB-INF/struts-config.xml

log4j

properties\log4j.properties

debug

0

application

ApplicationResources

0

action

*.do

注意log4j参数中相对路径的斜杠线的写法,而且log4j属性文件如放置在web-inf/classes目录或web-inf等目录中最好改名,因为在加载此Servlet之前,服务器如tomcat启动时会自动搜索web-inf目录和web-inf/classes目录中log4j.properties文件,如有则自动加载。log4j属性文件加载后,由于该属性文件中log4j.appender.A1.File的值用的是相对路径,自动加载配置便会出错:

log4j:ERROR setFile(null,true) call failed.

java.io.FileNotFoundException: WEB-INF\logs\bysxxglxt.log (系统找不到指定的路径。)

不知道log4j为什么会这么早自动启动。尽管后面加载扩展的ActionServlet中正确设置了log4j属性文件并正常加载了,但报的这个错还是怪不爽的,于是只有更改log4j属性文件名字或者更改其存放位置,让其不能自动加载了,不过还是有两个警告:

log4j:WARN No appenders could be found for logger (org.apache.commons.digester.Digester.sax).

log4j:WARN Please initialize the log4j system properly.

这样做就算是掩耳盗铃了,如果你有更好的解决办法,希望能在此贴出来,大家一起研究。

********************log4j.properties*****************************

### 设置logger级别 ###

程序代码

log4j.rootLogger=DEBUG,stdout,A1

### appender.stdout输出到控制台 ###

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.Target=System.out

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern= [%5p] [BYSXXGLXT] %d{yyyy-MM-dd HH:mm:ss}: %-4r [%-5p] [%t] ( %F,%L ) - %m%n

### appender.A1输出到日志文件 ###

log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender

log4j.appender.A1.File=WEB-INF\\logs\\bysxxglxt.log

##注意上面日志文件相对应用根目录路径的写法

log4j.appender.A1.DatePattern='.'yyyy-MM-dd'.log'

log4j.appender.A1.Append=true

## 输出DEBUG级别以上的日志

log4j.appender.A1.Threshold=DEBUG

log4j.appender.A1.layout=org.apache.log4j.PatternLayout

log4j.appender.A1.layout.ConversionPattern= [%5p] [BYSXXGLXT] %d{yyyy-MM-dd HH:mm:ss}: %-4r    [%t] ( %F,%L ) - %m%n

Log4j 的详细介绍:请点这里

Log4j 的下载地址:请点这里

0b1331709591d260c1c78e86d0c51c18.png

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页

打赏作者

步知春

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值