您的位置:首页 > 运维架构 > Tomcat

在Tomcat 与weblogic 中的 日志(log4j) 配置系列二(weblogic 应用程序使用log4j)

2013-08-01 18:24 741 查看

前言

在Tomcat 与weblogic 中的 日志(log4j) 配置系列一

在系列一 中, 有一个问题一直没有解决,就是部署到weblogic 中应用程序如何通过log4j写日志到文件中?

这里仅仅使用log4j, 而不使用 commons-logging, 关于log4j 和commons-logging的区别和关联,请参考

java 日志技术汇总(log4j , Commons-logging,.....)

一个web 项目实例

这个实例很简单,就是定义一个servlet, 用来写日志

1. 使用eclipse 创建一个动态web 项目, 导入log4j.jar 包

2. 创建一个servlet 类

/**
* @author oscar999
* @date 2013-7-31
* @version V1.0
*/
package com.oscar999;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class LogServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

public void service(HttpServletRequest req, HttpServletResponse res) {

testLog4j();
try {
PrintWriter out = res.getWriter();
out.println("<Hr><h1>Please check the Logs Are generated in .log or Not .....");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void testLog4j() {
Logger log = Logger.getLogger(LogServlet.class);
PropertyConfigurator.configure("log4j.properties");
log.debug("Debug info.");
log.info("Info info");
log.warn("Warn info");
log.error("Error info");
log.fatal("Fatal info");
}

}

3. 在web.xml 中添加servlet 配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>logTestApp</display-name>

<servlet>
<servlet-name>LogServlet</servlet-name>
<servlet-class>com.oscar999.LogServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>LogServlet</servlet-name>
<url-pattern>/logServlet</url-pattern>
</servlet-mapping>

<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>

4. 编写一个 log4j.properties 文件

log4j.rootLogger=debug,stdout,logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=logfile.log
log4j.appender.logfile.MaxFileSize=512KB
log4j.appender.logfile.MaxBackupIndex=3
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

5. 把log4j.properties文件放入 user_projects\domains\base_domain 下。(base_domain是这里使用的domain name, 如果domain name 不一样,应该知道要怎么做了)

因为上面servlet 中,读取log4j 的配置是 PropertyConfigurator.configure("log4j.properties");

这样就直接到 base_domain的路径下去找log4j.properties。

在log4j.properties配置产生的日志文件 logfile.log默认也会放到 base_domain目录下,

也可以修改, 建议是可以放到 “base_domain\servers\AdminServer\logs” 这个目录下。

6. 接下来通过 http://localhost:8080/appname/servletname

访问就可以了

使用应用程序中的log4j.properties

在上面的例子中, 我们使用了base domain 的根路径来放置log4j.properties .难道说就没有办法读到应用程序中的log4j?

我们知道,

在Tomcat 中,可以在servlet 中通过 getServletContext().getRealPath("/"); 得到路径;weblogic 部署时不解压war 档,所以没有办法读到相应的路径。

但是可以通过getServletContext().getResourceAsStream(file) 这个方法获取路径。

(至于这个方法是直接取war 档里的文件,还是取 base_domain\servers\AdminServer\tmp\_WL_user 中对应的缓存文件就没有深究了).

这里的例子是:

先通过一个servlet 设置log4j 的相关配置(配置文件),在应用启动时就甚至好, 后面的调用就不再需要 设置这个了PropertyConfigurator.configure("log4j.properties"); 。

这里把 log4j.properties 放置在/WEB-INF/log4j.properties 路径下(如果放置在src下, 需确认打包时是否把这个文件放进了war 的classes 路径下)

实现的步骤如下:

1. 在web.xml 配置设置log4j 初始化的servlet.

<servlet>
<servlet-name>log4jLoader</servlet-name>
<servlet-class>com.oscar999.Log4jInit</servlet-class>
<init-param>
<param-name>log4j</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>


2. 把log4j.properties放入/WEB-INF 路径下

3. 完成com.oscar999.Log4jInit.java 的servlet, 设置log4j

/**
* @author oscar999
* @date 2013-8-2
* @version V1.0
*/
package com.oscar999;

import java.io.IOException;
import java.util.Properties;

import javax.servlet.http.HttpServlet;

import org.apache.log4j.PropertyConfigurator;

public class Log4jInit extends HttpServlet {

/**
*
*/
private static final long serialVersionUID = 1L;

public void init()
{
//1. apache tomcat use
/**
*
* String prefix =getServletContext().getRealPath("/");
*
* String file = getInitParameter("log4j");
*
* System.out.println("................set log4j start");
*
* if(file != null) {
*
* PropertyConfigurator.configure(prefix+file);
*  }
*
*/

//2. weblogic use
String logCfgFile = getInitParameter("log4j");
System.out.println("==========set log4j start");
if(logCfgFile!=null)
{
Properties ps= new Properties();
try{
ps.load(getServletContext().getResourceAsStream(logCfgFile));
}catch(IOException e)
{
e.printStackTrace();
}
PropertyConfigurator.configure(ps);
}
}

}


4 测试的servlet 改成如下方式:

/**
* @author oscar999
* @date 2013-7-31
* @version V1.0
*/
package com.oscar999;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class LogServlet extends HttpServlet {

// static Log log = LogFactory.getLog(LogServlet.class);
/**
*
*/
private static final long serialVersionUID = 1L;

public void service(HttpServletRequest req, HttpServletResponse res) {
// testLog4j();
testLog4jByResourceStream();
try {
PrintWriter out = res.getWriter();
out.println("<Hr><h1>Please check the Logs Are generated in .log or Not .....");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void testLog4jByResourceStream() {
Logger log = Logger.getLogger(LogServlet.class);
log.debug("Debug info By Resource Stream.");
log.info("Info info By Resource Stream");
log.warn("Warn info By Resource Stream");
log.error("Error info By Resource Stream");
log.fatal("Fatal info By Resource Stream");
}

}


如此, 就不需要往base domain 路径放 .properties 文件了。



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: