log4j中日志输出文件指定相对路径的方法

我想大多数使用Log4j输出日志到文件系统的朋友可能都碰到过这个问题吧。

那就是在log4j的配置文件中无法指定相对路径,比如如下的配置就会有问题:

log4j.appender.E = org.apache.log4j.RollingFileAppender
log4j.appender.E.File = ../log/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern =%-d{yyyy-MM-dd HH\:mm\:ss} [ %t\:%r ] - [ %p ] [%c] %m%n

难道只能指定C:/log/error.log如此绝对路径的形式吗?答案是否定的!下面来看看几种解决办法:

1、使用系统变量

第一步,首先要定义系统变量

这里说的系统变量也就是System.getProperty(..)方法可以得到的变量,比如说user.dir等与操作系统相关的变量会默认加载进来。

另外,利用启动参数-D也可以手动加入系统参数,比如我们可以指定日志路径-Dlog.path="D:/abc/log"。当然,这样写成绝对路径又不灵活了。

其实我们可以在系统启动时在程序初始化的时候来动态选择路径,然后System.setProperty(..),那就万无一失了~

第二步,在log4j配置文件中使用系统变量

如何使用呢?比如我们在系统变量中定义了一个log.path,那么使用时只需要${log.path}就可以得到该属性对应的value值了

需要注意的是,若你使用的是tomcat,那么默认就可以使用${catalina.home}来得到tomcat的根目录

log4j.appender.E.File = ${catalina.home}/logs/error.log

这种方法比较简单方便,推荐!

2、自定义log4j配置文件加载

这种方式的原理是为log4j中配置的路径动态地添加上当前项目的根路径。

在Spring工程中一般都使用org.springframework.web.util.Log4jConfigListener这个类来加载log4j的配置文件

当然底层还是调用PropertyConfigurator.configure(url);或是DOMConfigurator.configure(url);

但是貌似这个配置文件加载之后是无法读取配置,更无法修改单个配置属性,那其实我们就需要在设置到log4j之前来修改某个值了

所以使用这种方式就必须自己定义加载log4j配置文件,思路也比较简单,比如我们用properties文件,在properties指定的输出路径我们只给定相对于项目根路径的相对路径,而项目根路径我们在程序中动态地获取。先将文件加载到Properties,之后通过组装项目根路径以及相对路径并通过set方法来改变log4j.appender.E.File的值,然后再通过PropertyConfigurator.configure(Properties properties)配置到log4j中

下面贴出代码:

public class Log4jInit extends HttpServlet {
         public void init(ServletConfig config) throws ServletException {
             String prefix = config.getServletContext().getRealPath("/");
             String file = config.getInitParameter("log4j");
             String filePath = prefix + file;
             Properties props = new Properties();
             FileInputStream istream = new FileInputStream(filePath);
             props.load(istream);
             istream.close();
             String logFile = prefix + props.getProperty("log4j.appender.E.File");//设置路径
             props.setProperty("log4j.appender.E.File",logFile);
             PropertyConfigurator.configure(props);//装入log4j配置信息
         }
}

之后在web.xml中配置好init-parameter并将该servlet的load-on-startup设置为1就可以了~

个人认为第一种方法简单方便,完全可以取代第二种~

时间: 2024-10-14 05:42:55

log4j中日志输出文件指定相对路径的方法的相关文章

IOS中获取各种文件的目录路径的方法

iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. documents,tmp,app,Library. (NSHomeDirectory()), 手动保存的文件在documents文件里 Nsuserdefaults保存的文件在tmp文件夹里 1.Documents 目录:您应该将所有de应用程序数据文件写入到这个目录下.这个目录用于存储用户数据或其它应该定期备份的信息. 2.AppName.app 目录:这是应用程序的程序包目录,

(转)IOS中获取各种文件的目录路径的方法

iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. documents,tmp,app,Library. (NSHomeDirectory()), 手动保存的文件在documents文件里 Nsuserdefaults保存的文件在tmp文件夹里 1.Documents 目录:您应该将所有de应用程序数据文件写入到这个目录下.这个目录用于存储用户数据或其它应该定期备份的信息. 2.AppName.app 目录:这是应用程序的程序包目录,

IOS中获取各个文件的目录路径的方法和NSFileManager类

转自:http://blog.sina.com.cn/s/blog_5fb39f910101di92.html IOS中获取各种文件的目录路径的方法 iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. documents,tmp,app,Library. (NSHomeDirectory()), 手动保存的文件在documents文件里 Nsuserdefaults保存的文件在tmp文件夹里 1.Documents 目录:您应该将所有

log4j:特定类的日志输出到指定的日志文件中

问题描述:我有一个类foo.bar.Baz,我想让Baz这个类的日志输出到指定的日志文件中,其它的就使用默认的配置. log4j.rootLogger=ERROR, logfile log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender log4j.appender.logfile.datePattern='-'dd'.log' log4j.appender.logfile.File=log/radius-prod.log

Windows平台下Oracle监听服务启动过程中日志输出

Windows平台下Oracle监听服务启动过程中日志输出记录. 日志目录:D:\app\Administrator\diag\tnslsnr\WIN-RU03CB21QGA\listener\trace\listener.log 日志输出内容: Sat Aug 06 20:38:44 2016 系统参数文件为D:\app\Administrator\product\11.2.0\dbhome_1\network\admin\listener.ora 写入d:\app\administrator

Windows平台下Oracle实例启动过程中日志输出

Windows平台下Oracle实例启动过程中日志输出记录. 路径:D:\app\Administrator\diag\rdbms\orcl\orcl\trace\alert_orcl.log 输出内容: Sat Aug 06 20:39:55 2016 Starting ORACLE instance (normal) LICENSE_MAX_SESSION = 0 LICENSE_SESSIONS_WARNING = 0 Picked latch-free SCN scheme 3 Usin

linux中快速清空文件内容的几种方法

这篇文章主要介绍了linux中快速清空文件内容的几种方法,需要的朋友可以参考下 $ : > filename $ > filename $ echo "" > filename $ echo > filename $ cat /dev/null > filename 原文地址:https://www.cnblogs.com/lxwphp/p/9565572.html

JAVA中自定义日志输出到指定文件

虽然JAVA日志包提供的功能已经很方便,但是假如我们有新的需求如:将日志文件保存到我们希望的位置并在日志文件名中添加日期且保存指定时间内的日志文件:按照自己希望的格式输出日志内容.对于这些需求我们只要扩展java.util.logging.StreamHandler(Handler的子类),java.util.logging.Formatter创建自定义的处理器及格式化器即可以实现.下面是个例子,它分别创建了Handler及Formatter的子类,以便实现将日志文件保存到我们需要的位置,及在日

LOG4J中日志级别的使用

<logger name="demo-log" additivity="false"> <level value="${log.level}" /> <appender-ref ref="LOG-FILE" /> </logger> LOG4J中分为OFF.FATAL.ERROR.WARN.INFO.DEBUG.TRACE.ALL或者您定义的级别.Log4j建议仅仅使用四个级别.