程序打成jar包后,如何使用log4j.properties文件?

guyucowboy 2009-08-31 05:16:11
我想请教一下大家:
我使用log4j,JBuilder 2005 我把log4j.properties(此文件已经写好了)放在工程的src目录下,可以运行,输出error信息。
但是我现在把工程文件打jar包了,我还想使用log4j.properties文件,我该怎么办?
无论我把log4j.properties文件打到jar包中,还是把此文件放在与jar包的相同目录下,都不起作用。

程序打成jar包后,如何使用log4j.properties文件进行error等信息的输出?

谢谢大家!
...全文
2362 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
guyucowboy 2009-08-31
  • 打赏
  • 举报
回复
感谢火龙果!

原因就是差“.”和"lib/log4j.log4j-1.2.8.jar "

我的MANIFEST.mf中 classpath 没有写“.” 也没有写 "lib/log4j.log4j-1.2.8.jar "(我以为程序中用了lib/commons-logging.jar 而没有用log4j-1.2.8.jar,所以没写,新手了一回...)

我想没有在MANIFEST.mf中写“.”,导致没有file.html文件产生,而控制台能输出log信息,是因为在环境变量中的classpath 中有“.”,而MANIFEST.mf没有“.”,应该是这个原因吧。

再次感谢火龙果!
谢谢大家热心帮助!

明星54 2009-08-31
  • 打赏
  • 举报
回复
帮顶!
关注,标记了。
铁匠梁老师 2009-08-31
  • 打赏
  • 举报
回复
火龙果分析得有道理,配置文件是配置的,不是固定的,所以要放在jar包外面
  • 打赏
  • 举报
回复
不建议把 log4j.properties 或者 log4j.xml 诸如配置性质的文件打到 jar 包中去,这样的话根本没办法更改配置文件,跟写死在代码没有什么区别。

我一般在建工程时源代码是放在 src 这个 source folder 中的,而需要在类路径下的配置文件,再建一个 resource 的 source folder,把文件放在这个目录中,这样便于打包时不把 resource 打到 jar 中去,而且还能方便复制什么的。
长公子冰 2009-08-31
  • 打赏
  • 举报
回复
给你一个本人亲身经历的实例吧!目录结构如下。

project/
/com/
/*.class
/image/
/*.jpg
/META-INF/
/MANIFEST.MF
/org/
/apache/
/log4j/
/*.class
/log4j.properties


PS:我写的是一个小可执行jar文件.里面带有记录日志的功能,用的是LOG4J.起初想把logj4.jar一起打包的,结果运行不了,报找不到主类,其实并不是找不到入口类,而是找不到log4j。于是就采取了将log4j的代码一起打包,log4j.properties就放在主目录下,可以找得到。
  • 打赏
  • 举报
回复
看了一下,你把 MANIFEST.MF 文件中的 Class-Path: 后加个点(表示当前路径),点后面再加个空格再试试看。
  • 打赏
  • 举报
回复
我测试了一下,一点问题都没有:

我的目录结构是:

root
|
+-- test.jar
|
+-- lib
| |
| +-- log4j.jar
|
+-- log4j.xml


test.jar 中 META-INF/MANIFEST.MF 内容为:

Manifest-Version: 1.0
Main-Class: com.bao.test.Main
Class-Path: . lib/log4j.jar


log4j.xml 内容为:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p [%c{1}] %m%n" />
</layout>
</appender>

<appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="logs/file.log" />
<param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p [%c{1}] %m%n" />
</layout>
</appender>

<root>
<priority value="debug" />
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</log4j:configuration>


我在 root 目录下执行 java -jar test.jar 命令后,log4j 会自动在 root 目录下新建一个 logs 的目录,然后把 file.log 放在这个目录中。
  • 打赏
  • 举报
回复
请告之你的目录结构,以及 jar 包中 MANIFEST.MF 的内容。
guyucowboy 2009-08-31
  • 打赏
  • 举报
回复
回复火龙果:
确实,放在一个目录之下,可以,不用在MANIFEST.mf中class-path指定,也不用放在classes中一起打包,在控制台执行java -jar AA.jar 在控制台输出了log.error中的内容。

但为什么没有新建file.html文件呢?

在控制台输出:

2009-8-31 19:42:43 ca.uhn.log.HapiLogImpl error
严重: Error accepting remote connection

在控制台输出了,但为什么没有输出在文件中?在没打包之前,直接运行project.jpx是可以产生file.html文件来记录信息的,而打包后只在控制台中有信息?

谢谢大家热心帮助!

guyucowboy 2009-08-31
  • 打赏
  • 举报
回复
多谢楼上回复,还想请教一下:
我把log4j.properties 放在classes目录下,一起打到了jar包中,在控制台用java -jar AA.jar 能够输出log.error中的信息,应该是起作用了,但是没有新建file.html文件(因为 log4j.appender.FILE.File=file.html )

无论我通过控制台,或者双击jar包执行,都没有新文件产生,这是为啥啊?
谢谢大家!
  • 打赏
  • 举报
回复
我指的放在一起,是放在一个目录之下。
  • 打赏
  • 举报
回复
跟你的 jar 文件放在一起就可以了啊
沙老师 2009-08-31
  • 打赏
  • 举报
回复
简言之放的地方只要包含在CLASSPATH环境变量中就可以了
guyucowboy 2009-08-31
  • 打赏
  • 举报
回复
多谢#9楼回复:

我把它放进去了,可还是没好使啊?
我把log4j.properties放在Class-Path中,并把log4j.properties放在了与AA.jar同级目录中。
谢谢大家!

MANIFEST.mf 文件内容:

Manifest-Version: 1.0
Class-Path: lib/hapi-0.5beta.jar lib/jdom.jar lib/commons-logging.jar
lib/xerces.jar log4j.properties
Main-Class: edu.imust.hl7.app.HL7Application

log4j.properties文件内容:

log4j.rootLogger=WARN, Console,FILE

log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=(%r ms) [%t] %-5p: %c#%M %x: %m%n

log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=file.html
log4j.appender.FILE.Append=true
log4j.appender.FILE.layout=org.apache.log4j.HTMLLayout



lightyear307 2009-08-31
  • 打赏
  • 举报
回复
我也想知道这个问题
inthirties 2009-08-31
  • 打赏
  • 举报
回复
把log4j.properties自己放到classpath里就可以
guyucowboy 2009-08-31
  • 打赏
  • 举报
回复
回复#3楼:
请详细指点,谢谢!
guyucowboy 2009-08-31
  • 打赏
  • 举报
回复
多谢#5楼
回复#5楼:
我把log4j.properties放在了class目录下,打到了jar包中,但是没有起到效果:当我操作异常时,并没有日志文件被新建。
guyucowboy 2009-08-31
  • 打赏
  • 举报
回复
我看别人的一个程序,他把log4j.xml与AA.jar并排放在了同一级目录下,能起作用。
但我的是log4j.properties,没起作用。难道是不是还有别的说法?多谢大家!
bayougeng 2009-08-31
  • 打赏
  • 举报
回复
很简单啊,你直接放在class目录下,一起打包就可以了。
加载更多回复(4)

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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