Log4j使用中遇到的问题及解决

 

具体基本知识介绍:见 http://gyfmp5.iteye.com/blog/103253 有非常详细介绍

 

实际中碰到的问题:

 

1. 如何让不同的类或包的日志输入不同的目的地(文件、 db 等)

比如:按照业务不同输入不同的日志文件,宽带业务、预付费业务输入不同的日志文件

解决:

log4j.logger.com.ht.ibms.orderadmin.service.tache.adsl = debug ,FILE_ADSL

log4j.logger. xxx.yyy.zzz = info , FILE_UORSS

这里把包 com.ht.ibms.orderadmin.service.tache.adsl 下的类的日志写入 FILE_ADSL 文件 级别为 debug ;

 

2.  如何让不同级别的日志级别输入不同的目的地(文件、 db 等)

errinfodebug 输入不同的日志文件;这样方便使用查找

解决:

log4j.logger.com.ht.ibms.orderadmin.service.tache.adsl = debug ,FILE_ADSL

log4j.logger.com.ht.ibms.orderadmin.service.tache.adsl = info ,FILE_ADSL_2

也可以配置 这样

log4j.logger.com.ht.ibms.orderadmin.service.tache.adsl = debug ,FILE_ADSL

log4j.logger.com.ht.ibms.orderadmin.service.tache.adsl = debug,FILE_ADSL_2

appender FILE_ADSL_2 要设置最低接受级别 log4j.appender.FILE_ADSL_2.Threshold= info

 

3. 日志配置文件实时加载

不想重启服务器而想重新加载日志的配置文件

解决见下文

 

4.  日志配置 File 的相对路径配置

日志 File 方式的相对路径怎么配置;相对路径能是软件真正的跨平台跨路径使用

解决见下文

 

分析:

其实, log4j 在加载的时候会在 class 路径里找 log4j.properties 文件,如果找到了就会赋给 PropertyConfigurator 配置

PropertyConfigurator.configure(props);// 装入 log4j 配置信息

PropertyConfigurator.configure(xxxFilePath);// 装入 log4j 配置信息

在实时加载的时候就要重新配置加载下 ~

 

log4j 中配置日志文件相对路径

http://www.whitehouse.net.cn/blog/Article/log4j_config.html

 

法一、 解决的办法自然是用相对路径代替绝对路径,其实 log4jFileAppender 本身就有这样的机制,如: log4j.appender.logfile.File=${WORKDIR}/logs/app.log
其 中 “${WORKDIR}/” 是个变量,会被 System Property 中的 “WORKDIR” 的值代替。这样,我们就可以在 log4j 加载配置文件之前,先用 System.setProperty ("WORKDIR", WORKDIR); 设置好根路径,此操作可通过一初始的 servlet 进行。


法二、可以使用服务器环境变量
log4j
的配置文件支持服务器的 vm 的环境变量,格式类似 ${catalina.home}
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=${catalina.home}/logs/logs_tomcat.log
log4j.appender.R.MaxFileSize=10KB
其 中的 ${catalina.home} 并非 windows 系统的环境变量,这个环境变量就不需要在 Windows 系统的环境变量中设置。之所以这样,你可 以看看 tomcat\bin\catalina.bat(startup,shutdown 都是调用这个 ) 里面自带有 -Dcatalina.home= "%CATALINA_HOME%" 。继承这个思想,所以你也可以自己设定一个参数 -Dmylog.home="D:/abc/log" 到对应的服务器 java 启动的 vm 参数中


法三、通过 servlet 初始化 init() 方法中加载 file 属性实现相对路径
具 体实现 : 做一个 servlet, 在系统加载的时候 , 就把 properties 的文件读到一个 properties 文件中 . 那个 file 的属性值 ( 我使用的 是相对目录 ) 改掉 ( 前面加上系统的根目录 ), 让后把这个 properties 对象设置到 propertyConfig 中去 , 这样就初始化了 log 的设置 . 在后面的使用中就用不着再配置了
一般在我们开发项目过程中 ,log4j 日志输出路径固定到某个文件夹 , 这样如果我换一个环境 , 日志路径又需要重新修改 , 比较不方便 , 目前我采用了动态改变日志路径方法来实现相对路径保存日志文件
(1).
在项目启动时 , 装入初始化类 :

public class Log4jInit extends HttpServlet {
         static Logger logger = Logger.getLogger(Log4jInit.class);
         public Log4jInit() {
         }

         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();
             try {
                 FileInputStream istream = new FileInputStream(filePath);
                 props.load(istream);
                 istream.close();
                 //toPrint(props.getProperty("log4j.appender.file.File"));
                 String logFile = prefix + props.getProperty("log4j.appender.file.File");// 设置路径 
                 props.setProperty("log4j.appender.file.File",logFile);
                 PropertyConfigurator.configure(props);// 装入 log4j 配置信息 
             } catch (IOException e) {
                 toPrint("Could not read configuration file [" + filePath + "].");
                 toPrint("Ignoring configuration file [" + filePath + "].");
                 return;
             }
         }

         public static void toPrint(String content) {
             System.out.println(content);
         }
}

 
实 际上 log4j 的配置文件 log4j.properties 如为默认名,可放置在 JVM 能读到的 classpath 里的任意地方,一般是放在 WEB- INF/classes 目录下。当 log4j 的配置文件不再是默认名,则需要另外加载并给出参数,如上 “ropertyConfigurator.configure(props);// 装入 log4j 配置信息

(2).Web.xml
中的配置

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

 

注意:上面的 load-on-startup 设为 0 ,以便在 Web 容器启动时即装入该 Servletlog4j.properties 文件放在根的 properties 子目录中,也可以把它放在其它目录中。应该把 .properties 文件集中存放,这样方便管理。
(3).log4j.properties
中即可配置 log4j.appender.file.File 为当前应用的相对路径。

 

+

_

)

(

*

*

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值