Java, Only Java!

统计

留言簿(19)

积分与排名

好友空间

文档技巧

阅读排行榜

评论排行榜

Apusic AS的Web应用中调用Log4J的流程

经常碰到项目中用Log4J,但是自己一直都没有认真去研究过Log4J的运行流程,看了许多资料讲得都是Log4J.properties怎么配置,但是Log4J启动→调用→输出的流程仍然不清楚,本文就准备对Log4J的详细启动过程进行介绍,使得大家可以更好的在Apusic中使用Log4J。

 

1. 编写一个Servlet程序,目标是初始化Log4J的相关配置,具体内容参考附件中的Log4jInit.java程序,附件下载地址:http://zhuyuanxiang.javaeye.com/topics/download/66d599d6-b21c-3933-a707-be2b08505519
public class Log4jInit extends HttpServlet {

 public void init() {
  ServletContext context = getServletConfig().getServletContext();
  Hierarchy hierarchy = new Hierarchy(new RootCategory(Level.DEBUG));

  // 将hierarchy初始化后保存到context中,在Web应用的全局供其他Web代码使用。
  context.setAttribute("hierarchy", hierarchy);

  String prefix = getServletContext().getRealPath("/");
  String file = getInitParameter("log4j-init-file");
  // if the log4j-init-file is not set, then no point in trying
  if (file != null) {   // 增加hierarchy配置的内容
   new PropertyConfigurator().doConfigure(prefix + file, hierarchy);
   Logger logger = hierarchy.getLogger(Log4jInit.class.getName());
   logger.info("Logging initialized for Hello.");
  }
 }

关键就是对Hierachy的初始化,并且保存到context中,供其他Web应用中的Java代码使用

2. 配置web.xml文件,对Log4jInit在Web应用加载过程中初始化

 <servlet>
  <servlet-name>log4j-init</servlet-name>
  <servlet-class>wombat.Log4jInit</servlet-class>

  <init-param>
   <param-name>log4j-init-file</param-name>
   <param-value>WEB-INF/classes/log4j.properties</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
 </servlet>

3. 编写HelloServlet.java,在代码中使用Logger

 public void init() throws ServletException {
  ServletContext context = getServletConfig().getServletContext();
  // 从context中取出hierarchy供本Servlet的Logger使用
  Hierarchy hierarchy = (Hierarchy) context.getAttribute("hierarchy");

  if (hierarchy == null) {
   context.log("The Hello web-application is not properly intialized.");
  } else {
   logger = hierarchy.getLogger(HelloServlet.class.getName());

   logger.info("HelloServlet initiation is OK!");
  }
 }

 

因此,如果使用Log4J需要在代码中初始化Log4J的相关配置并保存到上下文中,同时配置信息写在web.xml中,并且正确提供log4j.properties文件,然后在代码中调用了Logger就可以输出日志信息了。

本例子的/hello.log一般会输出在应用所在盘的根目录下,开发人员可以根据自己的需要调整Log4J.properties文件就可以改变了。

posted on 2008-06-13 22:53 朱远翔 阅读(1987) 评论(10)  编辑  收藏 所属分类: 1.Java世界

评论

# re: Apusic AS的Web应用中调用Log4J的流程 2008-06-14 00:18 Robin's Java World

Apusic使用Log4J还这难?
如果这难,表明Apusic做得可不好哟。
看看Webshpere和WebLogic,使用Log4J就跟在Tomcat中一样,没有任何分别。  回复  更多评论   

# re: Apusic AS的Web应用中调用Log4J的流程 2008-06-14 10:14 朱远翔-Apusic技术顾问

@Robin's Java World
可能我写的东西带来些误解,我说的不是什么应用服务器有问题,而是介绍Log4J在应用服务器的Web应用中如何被调用的。现在介绍Log4J配置的文章多,而Log4J运行机制的文章少。
许多朋友用的时候都知其然而不知其所以然,一旦应用Log4J的某个环节出现问题(例如:配置文件找不到),就不知道怎么处理了,我也是这样茫然用Log4J很久后,被迫研究了一下运行机制,写出来与大家一起分享。
实际上大部分应用都不是单纯在用Log4J,而是Java Commons-Logging(JCL)+Log4J,使用的方式与这篇文章还有不同,我想你说的在其他应用服务器中很好用,可能也就是这种应用方式。下面一篇文章我就会介绍JCL+Log4J在Apusic中的应用,你会发现在Apusic中Log4J同样很好用。
Apusic的日志机制采用了与Log4J不同的框架,是SUN JDK 1.4 Logging,并不是Apusic应用服务器本身有什么不足,不同框架的融合正是J2EE世界的特点,那么融合这两种框架对许多朋友来说确实存在一定的难度,这两篇文章的目的也就是想帮助大家。  回复  更多评论   

# re: Apusic AS的Web应用中调用Log4J的流程 2008-06-14 10:25 鬼狗

我Orz了,作为国内apusic的最早用户,作为apusic的义务免费测试人员,作为apusic的直接受害者,我今天又Orz了。

ls的,貌似楼主的意思并非是说apusic不能正常使用log4j,而是要自己玩玩。我们使用log4j和在其他应用服务器上并没有区别。

楼主,你骗点击也不用这样么,这跟apusic有鬼关系,你这样写只会让大家以为apusic很滥,虽然她确实很滥,但是作为顾问你要有职业道德么。



  回复  更多评论   

# re: Apusic AS的Web应用中调用Log4J的流程 2008-06-14 10:45 朱远翔-Apusic技术顾问

@鬼狗
我不用骗点击率,我开博就说了这个是我记录自己工作内容的地方。
其次,每个应用服务器肯定会有不同的,我只测试了Apusic的使用情况,严谨的说只能是Apusic上的Log4J如何用。
任何产品都有不完美的地方,Oracle的数据库就是最新的版本,我还遇到过CPU资源被严重消耗,最后通过打补丁来解决的问题,但是没人会说Oracle数据库不好。Apusic作为国内知名的应用服务器产品,也得到了大量客户的认可。
不过对于Apusic产品给您工作带来的麻烦,我们愿意配合您给予解决。  回复  更多评论   

# re: Apusic AS的Web应用中调用Log4J的流程 2008-06-14 14:17 鬼狗

如果apusic的技术人员有能力解决,谁还有意见,问题就是。。。。。
  回复  更多评论   

# re: Apusic AS的Web应用中调用Log4J的流程 2008-06-14 14:18 鬼狗

ps一下,你们客服人员到现场连个服务单都不填的,管理那个滥。  回复  更多评论   

# re: Apusic AS的Web应用中调用Log4J的流程 2008-06-14 15:01 朱远翔-Apusic技术顾问

@鬼狗
看样子,真的把你郁闷到了,很抱歉。
如果你那里有什么我可以帮上忙的,也可以给我留言。
仍然感谢你对Apusic产品的支持。  回复  更多评论   

# re: Apusic AS的Web应用中调用Log4J的流程 2008-07-23 18:31 隔叶黄莺

其实在Webshpere下通过 commons-logging 来使用 log4j 也不容易,因为 commons-logger 的初始化优先取某个系统属性,而 Websphere 启动时恰好又设置了这一系统属性,就会发现 log4j 输不出日志来,被 Websphere 的日志实现截了下来,轮不到 log4j 的份。

不知道这能不能算是 Websphere 做得很差劲。  回复  更多评论   

# re: Apusic AS的Web应用中调用Log4J的流程 2008-07-24 09:22 朱远翔-Apusic技术顾问

@隔叶黄莺
通过调整默认的Commons-Logging估计可以解决。
这个问题技术上难度不大,还是考虑周到与否的问题。  回复  更多评论   

# re: Apusic AS的Web应用中调用Log4J的流程 2009-11-17 23:33 XX001

webshpere 的日志输出是有些麻烦,要设定系统属性.
不过,这个并不代表webshpere 做得不好
同样.Apusic 可以不用设定系统属性,就可以方便的输出日志,
也不代表,Apusic 就做得好
一个产品的好不好,要看应用领域,用户群体,还有开发者.
如果三样都差,肯定不会是什么好产品

  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: