`
fantaxy025025
  • 浏览: 1309741 次
  • 性别: 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乱码问题解决办法

    ### log4j乱码问题解决办法 #### 一、引言 在开发过程中,日志记录是必不可少的一个环节。良好的日志系统可以帮助开发者快速定位问题并进行调试。Log4j作为一款广泛使用的Java日志框架,在很多项目中扮演着重要...

    若依框架使用的log4j2.16.0,修复log4j漏洞log4j2下载最新log4j2.16.0下载

    总结来说,Log4j2.16.0是一个关键的安全更新,解决了Log4j2框架中的“Log4Shell”漏洞。对于使用若依框架或其他依赖Log4j2的项目,升级到这个版本至关重要,可以避免系统遭受恶意攻击。用户需要下载并正确安装这个...

    log4j日志报错解决办法

    然而,如果你在运行应用时仍然收到同样的警告,可能是因为在某些类中使用了Log4j,但没有正确初始化。要解决这个问题,你需要在每个需要用到日志的类中,通过以下方式获取logger实例: ```java import org.apache....

    Log4j2简介及与Log4j效率对比

    与Log4j 1.x相比,Log4j2在设计上进行了重大改进,并解决了Logback等其他日志框架中存在的某些体系结构问题。 #### 特性概述 1. **审计功能**:Log4j2设计时考虑到了审计需求,这意味着即使在配置更新过程中,它也...

    使用Slf4j集成Log4j2构建项目日志系统的完美解决方案.docx

    删除项目中存在的Log4j1.x所必须的log4j和slf4j-log4j12等依赖可以使用以下命令: mvn dependency:tree &gt; tree.log cat tree.log | grep log4j 添加Slf4j和Log4j2的依赖可以使用以下配置: &lt;groupId&gt;org.slf4j ...

    log4j各个版本

    Log4j是Apache组织开发的一款广泛使用的Java日志框架,它为Java应用程序提供了一种灵活且强大的日志记录机制。Log4j的各个版本在功能、性能和安全性方面都有所不同,下面将详细介绍这些版本及其特点。 1. Log4j ...

    新版本与旧版本log4j.jar包下载,附使用说明----.zip

    IntelliJ IDEA(简称IDEA)是一款流行的Java集成开发环境,它支持将log4j集成到项目中,通过配置pom.xml或build.gradle文件添加依赖,或者手动将log4j.jar添加到项目的类路径下,以便在IDEA中直接使用Log4j进行日志...

    log4j中文手册(中文版)

    ### log4j中文手册知识点概览 ...综上所述,`log4j`是一款强大且灵活的日志记录工具,通过上述知识点的学习,我们不仅可以快速掌握其基础使用方法,还能深入理解其内部机制,更好地应用于实际项目中。

    tomcat9 slf4j+log4j2 写日志.zip

    本教程主要关注如何在Tomcat 9环境中使用SLF4J(Simple Logging Facade for Java)和Log4j2进行日志记录,并解决可能出现的日志不写入问题。 首先,SLF4J是一个日志门面,它为各种日志框架提供了抽象层,如Logback...

    log4j使用实例.zip

    这个"log4j使用实例.zip"压缩包包含了关于如何在Java项目中配置和使用Log4j的示例代码,非常适合Java后端初学者学习。 首先,Log4j的核心组件包括Logger、Appender和Layout。Logger是日志信息的生产者,负责生成...

    日志版本-log4j2版本jar

    Log4j是Apache的一个开源项目,提供了一套强大的日志API,而Log4j2是其升级版,旨在解决Log4j1.x存在的性能问题和设计缺陷。 Log4j2的核心改进在于其引入了全新的API——Log4j 1.2 API,文件`log4j-1.2-api-2.8.2....

    log4j2.17.2

    4. 回溯修复:除了直接修复漏洞,log4j2.17.2还回溯修复了之前版本中可能存在的相关问题,以确保整体的安全性。 对于使用Java和Log4j2的开发者和管理员来说,升级到log4j2.17.2是必须且紧迫的任务。为了确保无缝...

    apache-log4j-1.2.16.rar_apache log4j 1.2.16_log4j source code_lo

    通过分析和学习Log4j的源代码,开发者可以更好地理解和利用这个强大的工具,解决在实际项目中遇到的日志问题,定制自己的日志解决方案,或者为开源社区贡献新的特性或修复已知问题。总之,熟悉并掌握Log4j的内部工作...

    log4j2漏洞检测工具

    为了解决这个问题,专门的Log4j2漏洞检测工具应运而生。 **Log4j2漏洞概述** Log4j2是Apache软件基金会的一个项目,它提供了一个灵活且高性能的日志记录API。然而,在2021年12月初,研究人员发现Log4j2的一个严重...

    log4j漏洞扫描工具

    “log4j漏洞扫描工具”是指用于检测和识别Apache Log4j框架中存在安全漏洞的专用软件。Log4j是Java编程语言中的一个流行日志记录库,2021年曝光的重大安全漏洞(被称为CVE-2021-44228或Log4Shell)使得恶意攻击者...

    无法打出log4j日志的问题排查

    当我们遇到“无法打出log4j日志的问题”,这通常是由于配置、环境或代码实现中的某些错误导致的。这篇长文将深入探讨如何排查和解决这类问题。 首先,我们要理解Log4j的基本工作原理。Log4j通过配置文件(通常是log...

    Java Log4j使用详解

    本篇文章旨在详细介绍如何在Java中使用Log4j来管理日志,包括其配置方法以及与其他日志框架(如Commons Logging和JDK自带Logger)的对比。 #### 二、Jakarta Commons Logging (JCL) ##### 2.1 概述 Jakarta ...

    log4j-2.7api+core包

    这里特别提到了两个关键文件:`log4j-core-2.7.jar`和`log4j-api-2.7.jar`,它们是Log4j 2.7版本的核心实现和API接口,用于修复可能存在的与Struts2集成时的日志相关问题。此外,还提及了`log4j2.xml`,这是一个配置...

    eclipse log4j 插件

    在安装Log4j插件后,可以解决开发环境中找不到Log4j的问题,从而顺利进行ophone应用的开发和调试。 总的来说,Eclipse Log4j插件是Java开发中提高日志管理效率的重要工具,它不仅简化了日志的输出,还提供了与IDE...

    log4j相关jar包

    在实际项目中,可能同时存在log4j、SLF4J和log4j2的依赖,这时桥接包就显得尤为重要。例如,如果项目原本使用log4j,但希望迁移到SLF4J或log4j2,桥接包可以提供兼容性,避免日志混乱。`log4j-slf4j-impl.jar`是将...

Global site tag (gtag.js) - Google Analytics