`
fantaxy025025
  • 浏览: 1250172 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

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 等)

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

解决:

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

 

法一、 解决的办法自然是用相对路径代替绝对路径,其实 log4j FileAppender 本身就有这样的机制,如: 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 容器启动时即装入该 Servlet log4j.properties 文件放在根的 properties 子目录中,也可以把它放在其它目录中。应该把 .properties 文件集中存放,这样方便管理。
(3).log4j.properties
中即可配置 log4j.appender.file.File 为当前应用的相对路径。

 

+

_

)

(

*

*

 

分享到:
评论

相关推荐

    Log4j 基本原理

    就像 JUnit 一样,虽然很多人都在用,但我没有遇到什么问题需要用这个东西来解决,也就不觉得它有什么用了。但前段时间第一次用 struts 2 整合 hibernate 写一个小小的书店租赁管理系统时出了好些问题,输出语句添了...

    eclipse log4j 插件

    安装ophone 开发环境时遇到了 log4j插件未找到的问题。安装该包后解决

    Oracle9i安装OCS4J.properties问题解决

    在安装Oracle9i,遇到“File not found D: \oracle\ora92\ocs4j\admin\OCS4J.properties”,点击忽略也能完成安装,但是又担心有不妥,于是四处查找答 案,不过也没有看到对这个东东的解释。 经过反复尝试,终于找到...

    log4Net详解(共2讲)

    如何才能很好地利用目前公认最好的调试工具FireBug发现并解决开发中遇到的各种BUG 国讯OA工作流管理实现基本功能 1、定义任意形式的工作流程 国讯OA强大的自定义功能可以满足企业对复杂工作流程的定义,包括请假...

    tomcat部署java web项目遇到的问题及解决方法

    主要介绍了tomcat部署java web项目遇到的问题及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    logging-log4cxx:Apache Log4cxx是Apache Log4j的C ++端口

    默认情况下,问题是在中维护的,因此在发布拉取请求之前,请先查看是否存在与您的问题/功能/ ...相关的问题。 如果没有,通常可以在IF代码可用的情况下直接创建拉取请求,但是请有些冗长:提供一些有关PR解决的实际...

    Java日志体系全解析:架构师必掌握的关键技术和最佳实践

    为解决这些问题,SLF4J(Simple Logging Facade for Java)应运而生。它不仅提供了一个更为简洁高效的日志门面,还通过各种适配器支持了众多日志实现,如log4j、logback等。SLF4J通过解耦日志API和具体实现,提高了...

    日志管理

    文章目录日志管理传统方式日志管理获取日志存在问题解决方法log4j日志管理特点使用流程配置文件日志格式参考 练习源码 日志管理   日志是系统运行过程中后台的输出信息,方便程序员进行系统运行的管控以及Bug的...

    JNDI-Inject-Exploit

    &gt; 本工具用于解决 Fastjson、log4j2、原生JNDI注入等场景中针对高版本JDK无法加载远程恶意类,通过LDAP服务器返回原生Java反序列化数据,受害者(客户端)在具备反序列化Gadget依赖的情况下可达到命令执行、代码执行...

    SpringMvc+Spring+Mybatis+Maven整合 源码

    花了我一天半学着写着 ....4. log4j log4j的格式都是一样的 写好一个 以后都通用了 5.spring_mybatis.xml里配置问题 有的时候它明明没有错 但是 就是说错了 你就clear一下项目 或者关闭再打开项目 就好了 .

    短信猫西门子TC35测试

    那是因为没有把log4j-1.2.13.jar倒入到工程中。 2、如果报了如下错误: org.smslib.GatewayException: Comm library exception: java.lang.RuntimeException:javax.comm.NoSuchPortException C:\Program Files\Java...

    maven下ssm框架整合

    myeclipse+maven+ssm+log4j+junit4+oracle框架搭建。适合学习这个框架的初学者学习,都是本人亲自搭建测试,在搭建中遇到了很多问题,本人都一一解决并成功完成测试。...3:log4j在springmvc中的使用

    elasticgeo:用于弹性搜索的 Geotools 数据存储

    在 Geoserver 2.1.1 中安装ES 和 GeoServer(二进制分发版)中不同的日志实现存在问题作为一种解决方法,我在 {GEOSERVER_HOME}/lib 和 {GEOSERVER_HOME}/webapps/geoserver/WEB-INF/lib 中升级到 SLF4J 1.6.1 ....

    lrucacheleetcode-leetcode:leetcode问题的数量每周都在增加。我会不断地寻找和总结更好的解决问题的方法并不断更新

    我会不断地寻找和总结更好的解决问题的方法并不断更新。 算法 其他 大批 # 标题 解决方案 时间 空间 困难 001 上) 上) 简单的 015 O(j*k) 上) 中等的 016 中等的 018 $O(n^2)$ 上) 中等的 026 $O(n^2)$ O(1) ...

    NCMoney:MS Money的免费替代品-开源

    2.1.0-2.1.5摆脱log4j库。 因此,如果升级到此版本:1.您可以删除log4j.jar文件和log4j.properties文件。 2. logger.properties现在替换了旧的log4j.properties。3. .bat(Windows用户)和.command(Mac用户)...

    springboot-:记录实现高并发的解决方案

    1.springboot整合druid多数据源和log4j2 (1)实现数据源,主数据库(写),从数据库(读),读写分离的方案之一 (2)mysql主从复制,保持数据一致性 (3)使用druid的监控功能 (4)log4j2日志介绍和配置说明 2....

    具有大量胶子的BFKL方程的半经典解

    事先在数值上计算了t通道分波的j平面奇异谱和BFKL方程在超前log(1 / x)逼近中的对应本征函数。 在这里,我们开发了一种半经典方法来研究此模型中存在的冲击参数依赖性的指数下降对散射振幅的高能量渐近行为的影响...

    MySQL 5.1参考手册

    5.12.3. 在多服务器环境中使用客户端程序 5.13. MySQL查询高速缓冲 5.13.1. 查询高速缓冲如何工作 5.13.2. 查询高速缓冲SELECT选项 5.13.3. 查询高速缓冲配置 5.13.4. 查询高速缓冲状态和维护 6. MySQL中的复制 6.1....

    LINGO软件的学习

    在LINGO模型中使用集之前,必须在集部分事先定义。集部分以关键字“sets:”开始,以“endsets”结束。一个模型可以没有集部分,或有一个简单的集部分,或有多个集部分。一个集部分可以放置于模型的任何地方,但是一...

    findConflicts:冲突的Maven插件(查找Maven项目冲突的Maven插件)

    我们都知道,java的日志包多种,象log4j,logback,slf4j,通用日志,log4j-over-slf4j,slf4j-over-log4j12等。这些包非常容易混在一起。最终的后果是,突然有一天你的应用系统就打印不出来日志了,更糟糕的是,你...

Global site tag (gtag.js) - Google Analytics