将 Log4j 配置文件放在项目外面

配置文件为什么要放在项目之外

在项目开发阶段,我们使用的是测试区的数据库,FTP 等等 资源。
在项目上线时,自然要切换到正式区。 如果配置文件写在项目里面,那么发布时就要变更代码,修改链接地址。
所以讲配置文件放在项目之外,就可以解决这个问题了。

为什么要动态配置 log4j.properties 的路径

因为目前我的项目要给多个外包厂用,部署到多个服务器上。 因外包厂服务器安装目录不同,各自的命令规范也无法统一。

所以需要客户自己制定log路径位置。

基本思路

* 在tomcat的context.xml中 新增一个变量,维护log4j的位置.
* 在项目启动加载时,根据路径读取log4j的文件,重新定义log4j配置文件.

配置tomcat的context.xml

  • context.xml 新增一行

<br /><Environment name="myLog4jPath" override="false" type="java.lang.String" value="/opt/conf/log4j.properties"/> <br />

创建maven项目

  • pom.xml

    注意事项 : log4j要是1.2.17以上版本,否则不支持

    <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <build>
        <finalName>MyLogger</finalName>
      </build>
    

新建servlet

package com;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
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 MyLoggerServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private Logger logger = Logger.getLogger(MyLoggerServlet.class);

/**
 * @see HttpServlet#HttpServlet()
 */
public MyLoggerServlet() {
    Context initCtx = null;
    String config = null;
    InputStream is = null;
    Context envCtx = null;

    try {
        initCtx = new InitialContext();
        envCtx = (Context) initCtx.lookup("java:comp/env");

        config = (String) envCtx.lookup("myLog4jPath");

        is = new FileInputStream(new File(config));

        PropertyConfigurator.configure(is);

        logger.info("========================config file path============="
                + config);

    } catch (Exception ex) {
        logger.error(ex.toString());
    } finally {
        if (envCtx != null) {
            try {
                envCtx.close();
            } catch (NamingException e) {
                e.printStackTrace();
            }
        }
        if (initCtx != null) {
            try {
                initCtx.close();
            } catch (NamingException e) {
                e.printStackTrace();
            }
        }
    }
}

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
 *      response)
 */
protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    PrintWriter pw = response.getWriter();
    logger.info("hello servlet, hello log4j");
    pw.write("okok");
    pw.flush();
}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
 *      response)
 */
protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
}

}

`

web.xml

<servlet>
    <servlet-name>MyLoggerServlet</servlet-name>
    <display-name>MyLoggerServlet</display-name>
    <description></description>
    <servlet-class>com.MyLoggerServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>MyLoggerServlet</servlet-name>
    <url-pattern>/MyLoggerServlet</url-pattern>
</servlet-mapping>

测试

Servlet会在第一次调用时加载/opt/conf/log4j.properties文件, 并打印log到指定目录
http://localhost:8080/MyLogger/MyLoggerServlet

时间: 2024-11-13 17:54:06

将 Log4j 配置文件放在项目外面的相关文章

java web 项目如何加载log4j配置文件

在整个WEB系统中,为了统一的使用日志管理,需要在系统启动的时候就加载Log4j的配置文件,这样才能保证以后使用log4j的格式是一致的,便于跟踪和解决问题. 那么,如何在系统启动的时候加载log4j的配置文件呢?下面我简单的介绍一下: 1.在web.xml文件中添加一个"监听器" Xml代码 <!-- 加载log4j的配置信息 --> <listener> <listener-class>hb.init.log4j.Log4jInit</li

log4j配置文件详解(转)

Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息.通过配置,可以创建出Log4J的运行环境. 1. 配置文件Log4J配置文件的基本格式如下: #配置根Loggerlog4j.rootLogger = [ level ] , appenderName1 , appenderName2 , …#配置日志信息输出目的地Appenderlog4j.appender.appenderName =

log4j在javaWeb项目中的使用

在前边的文章中对log4j的配置文件进行了说明,今天介绍如何在普通的javaWeb项目中使用log4j. 在日常的开发过程中,日志使用的很频繁,我们可以利用日志来跟踪程序的错误,程序运行时的输出参数等,很多情况下可能会使用System.out.println()这个方法,但是还有一种更加简洁的方式,那就是使用日志框架,今天就看看log4j这个日志框架如何在javaWeb的类中使用. 一.log4j的配置文件 我们要使用log4j必须要有log4j的配置文件,前面一篇文章提到,log4j的配置文件

log4j配置文件位置详解

自动加载配置文件: (1)如果采用log4j输出日志,要对log4j加载配置文件的过程有所了解.log4j启动时,默认会寻找source folder下的log4j.xml配置文件,若没有,会寻找log4j.properties文件.然后加载配置.配置文件放置位置正确,不用在程序中手动加载log4j配置文件.如果将配置文件放到了config文件夹下,在build Path中设置下就好了. 若要手动加载配置文件如下: (1)PropertyConfigurator.configure("log4j

log4j - 配置文件

Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息. 通过配置,可以创建出Log4J的运行环境. 1. 配置文件  Log4J配置文件的基本格式如下: 代码如下: 1 #配置根Logger 2 3 log4j.rootLogger = [ level ] , appenderName1 , appenderName2 , … 4 5 #配置日志信息输出目的地Appender 6 7 log

log4j配置文件详细解释

log4j.properties文件中语句的解释 1 此句为将等级为INFO的日志信息输出到stdout和R这两个目的地,stdout和R的定义在下面的代码,可以任意起名.等级可分为OFF.FATAL.ERROR.WARN.INFO.DEBUG.ALL,如果配置OFF则不打出任何信息,如果配置为INFO这样只显示INFO, WARN, ERROR的log信息,而DEBUG信息不会被显示,具体讲解可参照第三部分定义配置文件中的logger. 2 3 log4j.rootCategory=INFO,

log4j 配置文件 详解 + 实例 分析

Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息.通过配置,可以创建出Log4J的运行环境. 1. 配置文件 Log4J配置文件的基本格式如下:  #配置根Logger log4j.rootLogger  =   [ level ]   ,  appenderName1 ,  appenderName2 ,  - #配置日志信息输出目的地Appender log4j.appender.a

log4j在java项目中使用

   Log4j.properties的路径为    src/config/log4j Log4j.properties文件的内容下面定义日志输出级别是 INFO,并且配置了2个输出目的地,一个是A3,一个是console log4j.rootLogger = INFO,A3,CONSOLE //日志最低的输出级别 log4j.appender.A3.Threshold=INFO log4j.appender.A3.encoding=UTF-8 //每天产生一个文件DailyRollingFil

log4j配置文件的三个主要的组件

log4j配置文件的三个主要的组件: Logger,Appender和Layout,分别为日志类型,日志输出目的地,日志输出格式. log4j.rootLogger = [level],appenderName, appenderName, ... (level是错误级别,appenderName是输出目的地,本例设为mylog,可以定义多个) level优先级分别为FATAL.ERROR.WARN.INFO.DEBUG 5个级别.通过定义的级别,你可以控制程序中的日志输出.比如在这里定义了ER