log4j日志输出到web项目指定文件夹

感谢 eric2500 的这篇文章:http://www.cxyclub.cn/n/27860/

摘要:尝试将log4j的文件日志输出到web工程制定目录,遇到了很多问题,最终在eric2500的指导下搞定,下面是记录。 其原理在于log4j的配置文件支持服务器的vm的环境变量,如${oss.log4j.path},在log4j加载配置文件之前,先用 System.setProperty("","")设置好日志文件路径,这一操作通过一个初始的servlet来实现。

步骤:

1.配置log4j.properties

注:1.已注释掉了以控制台形式输出日志;2.log4j的layout.ConversionPattern属性对于以HTML形式输出无用(HTML有自己的格式),所以没写。

log4j.rootCategory=debug,stdout,ROLLFILE,R

# output as console. Now comment it out because I don‘t want to use it.
#log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p (%F:%L) -%m%n

# output as file
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p (%c:%L) -%m%n
log4j.appender.R.File=${log4j.root.path}logs/log.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=1

# output as HTML
# ConversionPattern to no effect as output HTML
log4j.appender.ROLLFILE = org.apache.log4j.DailyRollingFileAppender
log4j.appender.ROLLFILE.layout = org.apache.log4j.HTMLLayout
log4j.appender.ROLLFILE.File = ${log4j.root.path}logs/log.html
log4j.appender.ROLLFILE.Append = true
log4j.appender.ROLLFILE.Threshold = DEBUG

2.配置web.xml

注:<init-param>的<param-value>属性为指定的log4j的存储地址,这里没有设置,在处理log4j的存储地址的systemServlet中指定。

     <!-- 设置log4j的配置路径(类目录下) -->
     <context-param>
          <param-name>log4jConfigLocation</param-name>
          <param-value>classpath:log4j.properties</param-value>
     </context-param>
    <!-- 加载log4j配置文件 -->
    <listener>
      <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>

    <!-- 在自定义的Servlet中设置log4j的存储地址。不需要配置servlet-mapping,load-on-startup设置为0,会在web容器启动时候就装入该servlet。 -->
    <servlet>
        <servlet-name>systemServlet</servlet-name>
        <servlet-class>com.wql.util.SystemServlet</servlet-class>
        <init-param>
            <param-name>log4j.root.path</param-name>
            <param-value></param-value>
        </init-param>
        <load-on-startup>0</load-on-startup>
    </servlet>

3.编写处理log4j的存储地址的systemServlet

注:log4j的存储地址在此项目发布的物理路径下:E:\Spring2\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\OA2_02\logs

package com.wql.util;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import org.apache.log4j.Logger;

public class SystemServlet  extends HttpServlet{
    private static final Logger logger = Logger.getLogger(SystemServlet.class);

    private static final long serialVersionUID = -833322220864312415L;

    @Override
    public void init() throws ServletException {
        //获取根路径(web的发布地址)
        String rootPath = this.getServletContext().getRealPath("/");
        //以info等级打印根路径
        logger.info(rootPath);

        //从web.xml中获取param-name为log4j.root.path的值--即指定的log4j的存储地址
        String log4jPath = this.getServletConfig().getInitParameter("log4j.root.path");
        //若没有指定log4j.root.path初始参数,则使用WEB的工程目录--即web的发布地址
        log4jPath = (log4jPath==null||"".equals(log4jPath))?rootPath:log4jPath;
        //将log4j的存储地址设置为系统属性
        System.setProperty("log4j.root.path", log4jPath);
        //初始化
        super.init();
    }
}

大功告成!启动服务器后,就可以在:E:\Spring2\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\OA2_02\logs中查看日志。

备注:

1.按照此方式配置log4j在启动服务器时会出现logs\log.log拒绝io流访问异常信息,如下所示:(不要管它,不会有影响。)

附1:log4j日志文件输出到指定的磁盘: http://blog.csdn.net/mxlxiao7/article/details/7340480

附2:lo4j的详情介绍:http://www.blogjava.net/hwpok/archive/2008/01/16/175711.html

时间: 2024-10-09 10:49:01

log4j日志输出到web项目指定文件夹的相关文章

关于idea中新建web项目 webapp文件夹没有小蓝点 ,启动服务,访问不到解决方案

第一步: 选中项目按F4键,找到你的项目. 第二步: 选中项目下的web,如果没有web点击左上角的加号,找到web最下面,添加进去 第三步: 点开type下的节点,出来弹框, 第四步: 点击弹框的选择文件夹按钮,找到你的web 就OK啦!

使用yo命令,无法安装项目到指定文件夹

出现使用命令yo安装项目时,如果无法安装到指定文件夹,很可能是存在.yo-rc.json. Yeoman将  .yo-rc.json 所在的目录作为工程的根目录,之后Yeoman将当前文件目录跳转到根目录下运行请求的生成器,所以需要删除它. 注意:很多情况下,该文件是隐藏的,需要先系统设置显示隐藏文件,再将其删除就可以了. mac上可以 cd到根目录 运行 ls -l -a会找到该文件,再执行rm .yo-rc.json就OK了.

asp.net从服务器(指定文件夹)下载任意格式的文件到本地

一.我需要从服务器下载ppt文件到本地 protected void Btn_DownPPT_Click(object sender, EventArgs e)        {            DBService svc = new DBService();            svc.DownPpts();            string strFileName = "公报.ppt";            string filename = Context.Serve

php 删除指定文件夹

php 删除指定文件夹 1.前言 目标:php删除一个指定目录 所使用的的php函数:is_dir,opendir,readdir,scandir,rmdir,closedir,等等(注:其他文件操作函数也可以完成,这里只列举了本次使用的函数) 2.相关函数介绍 php文件操作的方法大致相同,已经在上一篇介绍过了,这里就不在重复介绍,这里就介绍一个新函数 rmdir 详情参考:http://www.w3school.com.cn/php/func_filesystem_rmdir.asp 其他函

IOS 对相册图片进行读取、存储到指定文件夹

这个示例程序主要用到了IOS中的UIImageView.UIImagePickerViewController.UIImage.NSFileManager等知识,结合这些知识构成一个小的应用程序,主要功能是对相册图片进行读取.存储到指定文件夹.从指定文件夹读取出来.这方面的知识在正式项目中用的是比较多的.做Android开发中,经常会使用到将图片保存到SD卡和从SD卡读取图片的操作,相比于Android在这方面的操作,IOS要方便许多. 基本功能是从相册选取一张图片,选完后显示在界面的UIIma

apk当安装程序将文件复制到手机自带的指定文件夹

项目已获得,今天.apk文件以获得另一个非调试手机,发现一个问题. 由于涂料.所以绘图数据的点存储在一个.txt文字档.把它用usb传到指定目录下的,可是明显不科学,由于用户下载了你的.apk文件,你却告诉他,还要把这个文本文件复制到指定的目录下.所以,我就要解决问题.就是把文本文件打包在apk文件里,安装.apk时就让创建一个程序目录.然后把文本文件复制到这个目录目录里,用户执行程序,就能够画图,不用再让他拷贝一份画图的点的坐标的数据.同理,事实上我这里还有设计轨廓的数据和标准轨廓的数据也是要

遍历指定文件夹下的所有文件

1 /// <summary> 2 /// 遍历指定文件夹下的文件 3 /// </summary> 4 /// <param name="dirPath">指定的目录</param> 5 public static void FindFile(string dirPath) 6 { 7 //在指定目录及子目录下查找文件 8 DirectoryInfo Dir = new DirectoryInfo(dirPath); 9 try 10

C# 读取指定文件夹中的全部文件,并按规则生成SQL语句!

本实例的目的在于: 1 了解怎样遍历指定文件夹中的全部文件 2 控制台怎样输入和输出数据 代码: using System; using System.IO; namespace ToSql{ class ToSql{ static void Main(){ string path = System.Environment.CurrentDirectory; System.Console.WriteLine("输入要读取的文件夹名"); string name = Console.Re

批处理脚本遍历指定文件夹下的文件

批处理脚本 1. 遍历指定文件夹下的文件 1.1 命令解释 命令: for [参数] %%变量名 in (匹配符) do (执行的命令) 切记:每个指令之间必须以空格隔开,in 与 ( 之间有空格,do 与 ( 间也有空格,否则命令会无法成功执行 ps:本节只讲用批处理脚本执行 for 命令遍历文件夹的场景,因此以下分析每个指令意义时,不介绍其他含义 []:表示此项指令为可选 [参数]:参数取值一共有四种: /d, /r, /l, /f,加上无参数,所以一共五种场景 无参:遍历当前路径的文件夹下