log4j怎样记录日志到项目目录而不是tomcat目录中?

tanyi 2005-09-15 03:33:06
我用tomcat做项目,希望把日志文件放在本项目中,而不是放在tomcat的目录中。
log4j.rootLogger=debug, stdout, R

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

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=../logs/error.log

log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

上面的配置会把日志写到tomcat的logs目录中中,但我希望存在项目的logs目录中,请问有什么办法?
谢谢!!!!!
...全文
833 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanyi 2005-09-20
  • 打赏
  • 举报
回复
谢谢大家啊!
mzhanker(海风)的方法正是我所需要的!特别谢谢你!
我个人始终认为,日志最好写在项目的目录里,我以前是把日志文件的绝对路径写在配置文件里的,其实这也是一种可行的办法,因为所谓配置文件嘛,就是指可以在运行期配置相关属性的文件,在配置文件里包含绝对路径也是讲得通的。但通过mzhanker(海风)的解决办法,项目路径可以在程序装载的时候动态取得并写到环境属性里,然后在配置文件中引用环境属性,这样即使在配置文件里也用不着写死了。这样至少有一点好处,用VSS合作开发的时候就可以让这个配置文件统一了,用不着每个开发人员都单独配置自己的日志路径。
但至于如果项目打包成war,还能不能往包里写日志,还有待继续探讨。再一次谢谢每一位!
julian_zzx 2005-09-17
  • 打赏
  • 举报
回复
放在本项目中?
有个疑问,war包ear包的时候怎么办?
mzhanker 2005-09-17
  • 打赏
  • 举报
回复
1:新建一个ServletContextListener的实现类Log4jConfigListener
2:Log4jConfigListener做:System.setProperty("webapp","你的webapp路径");
3:在log4j配置中:
log4j.appender.A2.File=${webapp}/log/access.log.
这样就配置了你的log路径.

如果还不知道,建议你看看spring或者log4j的源代码.
humanity 2005-09-17
  • 打赏
  • 举报
回复
log4j 可以在 java 方法里面指定 配置信息。
这个文件的位置同样可以制定,只要你 新建一个 HttpServletContextListener
并且添加到 web.xml #/web-app/lister 下面, 启动时,初始化 log4j 配置,让他敢在其他任何的 log4j 调用之前就行了。
humanity 2005-09-17
  • 打赏
  • 举报
回复
绝对路径:
String tomcatRoot = AccessController.doPrivileged(
new PrivilegedAction<String>() {
public String run() {
return System.getenv("CATALINA_HOME");
}
});

相对路径:
URL webxml = getClass().getResource("/WEB-INF/web.xml");
if( webxml.getProtocol() !="file") { //压缩包内
//比如 jar:file:/C:/MyProjects/build/mywebproject.war/WEB-INF/web.xml
String path = //.. 提取出 C:/MyProject/build 来, 他就是你想要的目录。
}else{ // file:/C:/MyProjects/build/mywebproject.war/WEB-INF/web.xml
//更简单了 , 后退 1 个目录 就行了。
}




zeq258 2005-09-16
  • 打赏
  • 举报
回复
其实一般如果属于项目的日志,
都是防在项目下的一个文件夹中的。

你说的意思我明白,但是我没有遇到像你说的这中情况。
帮你顶下!
Rangiggs 2005-09-16
  • 打赏
  • 举报
回复
up
tanyi 2005-09-15
  • 打赏
  • 举报
回复
zeq258(近朱者赤) ,谢谢你的回复,但我还是有疑问。比如我的tomcat装在c:/tomcat,而我的项目在c:/projects/myproject,文件默认的指向路径是tomcat下的bin目录,按你的说法,难道要写成../../projects/myproject?这样不太妥吧?那如果我的项目和tomcat不在同一个盘符下呢(Windows系统)?总之用这种办法和用绝对路径没什么区别了。我以前都是用绝对路径的,直接指到项目的logs目录里。但现在考虑打包成war的问题,打包后肯定会说路径找不到的。
liuquanyi 2005-09-15
  • 打赏
  • 举报
回复
学习了!
zeq258 2005-09-15
  • 打赏
  • 举报
回复
log4j.appender.R.File=../logs/error.log
这里,你可以用相对路径,定位到你希望的目录。

也可以用绝对路径,直接写目录位置就可以了!

这个应该很简单的,没有什么问题呀!


--------------------------------
../每用一次,向上返回一级目录。

比如你希望存在。。。。/logs/aaa.log中。

那么你可以这样../../../一直返回n次,知道到,和logs有共同的祖先级目录,然后在进入/.../logs/aaa.log,

这样说,应该明白了吧!

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧