`

log4j使用整理材料(3)

阅读更多

(2) log4j.xml中如下配置:

<appender name="PROJECT" class="org.apache.log4j.FileAppender">
    <param name="file" value="${myApp.root}/logs/mylog.log"/>
    <param name="append" value="false"/>
    <param name="encoding" value="utf-8"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %p - %m%n"/>
    </layout>

</appender>

这样就可以实现日志输出目录的动态配置了!

如果配置的是配置文件,需要如下的配置:

log4j.appender.info.File=${myApp.root}/WEB-INF/logs/info.log

(3) 注意:要将log4j.xmllog4j.property放在WEB-INF目录下面,如果放在通常的classes下面的话会有一个问题,当Tomcat启动的时候,Log4j会到classes下面去找这个配置 文件,然后因为这时候还没有设置系统变量,那么就会报找不到对应文件的错误了!但其实这个错误是不会影响接下来的功能,就是为了避免出现这个异常将配置文件放到WEB-INF下面。

1.1.1           使用log4jlog写入mysql

log4j 1.2.8 apiJDBCAppender类的说明中有一段红字
WARNING: This version of JDBCAppender is very likely to be
completely replaced in the future. Moreoever, it does
not log exceptions.

1.
mysql中创建库logdb
create database;
2.
在库logdb中创建表muglog,
create table muglog{
   id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
   logdate DATE,
   logger VARCHAR(50),
   priority VARCHAR(50),
   message VARCHAR(255)
};
3.
修改log4j.properties
###
限制com.bob.digester(:dig)才会log on JDBCAppender ###
log4j.logger.com.bob.digester=info, dig

log4j.appender.dig=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.dig.URL=jdbc:mysql://localhost/logdb
log4j.appender.dig.driver=com.mysql.jdbc.Driver
log4j.appender.dig.user=root
log4j.appender.dig.password=
log4j.appender.dig.sql=INSERT INTO MUGLOG (LOGDATE, LOGGER, PRIORITY, MESSAGE) VALUES ('%d', '%c', '%p', '%m')
log4j.appender.dig.layout=org.apache.log4j.PatternLayout

4.
注意,这里mysqldrivermysql-connector-java-3.0.14-production-bin.jar里的com.mysql.jdbc.Driver
  
所以,把它放到classpath, 如在Eclipse测试,需放到projectjava build pathLibraries

1. log4j的一个简单例子
把日志输出到MySQL数据库
Hello.java

import org.apache.log4j.*;
public class Hello {
     static Logger logger = Logger.getLogger(Hello.class);
     public static void main(String[] args) {
        PropertyConfigurator.configure("
log4j.properties");
         logger.info("Entering Application");
         for(int i = 1; i < 10; i++) {
       logger.debug("" + i);
     }
         logger.info("Exit Application");
   }
}

log4j.properties

log4j.rootLogger=DEBUG,DATABASE
log4j.addivity.org.apache=true
########################
# JDBC Appender
#######################
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.URL=jdbc:mysql://127.0.0.1:3306/JAVA002?characterEncoding=utf8
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=username
log4j.appender.DATABASE.password=123
log4j.appender.DATABASE.sql=INSERT INTO log4j(DATE, THREAD, LEVEL, CLASS, MESSAGES) VALUES ('%d{yyyy-MM-dd HH:mm:ss}', '%t', '%p', '%l', '%m')

四、log4jCommons-logging的结合

1.1.1           Commons-logging简介

Jakarta Commons Logging (JCL)提供的是一个日志(Log)接口(interface),同时兼顾轻量级和不依赖于具体的日志实现工具。它提供给中间件/日志工具开发者一个简单的日志操作抽象,允许程序开发人员使用不同的具体日志实现工具。用户被假定已熟悉某种日志实现工具的更高级别的细节。JCL提供的接口,对其它一些日志工具,包括Log4J, Avalon LogKit, and JDK 1.4等,进行了简单的包装,此接口更接近于Log4JLogKit的实现。

log4jcommons-logging两个包,都是记日志的,为什么要两个一起用呢? commons-logging是为"所有的Java日志实现"提供一个统一的接口,它自身的日志功能平常弱,log4j功能非常强大全面,所以拿两者配合使用。

强调一点,同时使用commons-loggingLog4j”,与单独使用Log4j”相比,并不会带来更大的学习、配置和维护成本,反而更加简化了我们的工作。

1.1.2           Commons-logging工作原理

Commons-logging提供一个统一的日志接口,简单了操作,同时避免项目与某个日志实现系统紧密耦合,很贴心的帮开发者自动选择适当的日志实现系统,它甚至不需要配置。

commons-logging工作原理:

1. 首先在classpath下寻找自己的配置文件commons-logging.properties中当前factory中名叫org.apache.commons.logging.Log配置属性的值,如果找到,则使用其中定义的Log实现类。

2. 如果找不到commons-logging.properties文件,则在查找是否已定义系统环境变量org.apache.commons.logging.Log对应的值,找到则使用其定义的Log实现类。

建立一个叫 CATALINA_OPTS 的环境变量
给他的值 - Dorg.apache.commons.logging.Log = org.apache.commons.logging.impl.SimpleLog - Dorg.apache

.commons.logging.simplelog.defaultlog = warn

3. 查看classpath中是否有Log4j的包,如果发现,则自动使用Log4j作为日志实现类则,使用相关的包装(wrapper)(Log4JLogger)

4. 使用JDK自身的日志实现类(JDK1.4以后才有日志实现类) ,使用相关的包装类(Jdk14Logger)

5. 使用commons-logging自己提供的一个简单的日志实现类SimpleLog

org.apache.commons.logging.Log的具体实现有如下:

-org.apache.commons.logging.impl.Jdk14Logger  //使用JDK1.4

-org.apache.commons.logging.impl.Log4JLogger  //使用Log4J

-org.apache.commons.logging.impl.LogKitLogger //使用 avalon-Logkit

-org.apache.commons.logging.impl.SimpleLog 

common-logging自带日志实现类。它实现了Log接口,把日志消息都输出到系统错误流System.err 中。 

-org.apache.commons.logging.impl.NoOpLog common-logging自带日志实现类。它实现了Log接口。 其输出日志的方法中不进行任何操作。

总之,commons-logging总是能找到一个日志实现类,并且尽可能找到一个"最合适"的日志实现类。

1、可以不需要配置文件。

2、自动判断有没有Log4j,有则自动使用之。

3、最悲观的情况下也总能保证提供一个日志实现(SimpleLog)

为了简化配置commons-logging,一般不使用commons-logging的配置文件,也不设置与commons-logging相关的系统环境变量,而只需将Log4jJar包放置到classpash中就可以了。这样就很简单地完成了commons-loggingLog4j的融合。如果不想用Log4j了怎么办?只需将classpath中的Log4jJar包删除即可。

1.1.3           使用JCL开发

因为Log4j的强大,同时开发者又不希望对Log4j的依赖性太强。所以目前比较流行的是Commons-loggingLog4j结合使用。

1. 部署日志器

下载commons-logging.jarlog4j.jar包,能后把它们放到工程的lib目录下,引入工程中。

2. 指定日志器

在属性文件common-logging.properties中设置实现接口的类。如下(这里设置Log4j为所使用的日志包)

#commons-logging.properties文件配置信息

#org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog

# Must be one of ("trace", "debug", "info", "warn", "error", or "fatal").

#利用log4j为输出介质

org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog

#JDK5 Logger

#org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger

3org.apache.commons.logging.Log接口中定义的方法,按严重性由高到低的顺序有:

log.fatal(Object message);

log.fatal(Object message, Throwable t);

log.error(Object message);

log.error(Object message, Throwable t);

log.warn(Object message);

log.warn(Object message, Throwable t);

log.info(Object message);

log.info(Object message, Throwable t);

log.debug(Object message);

log.debug(Object message, Throwable t);

log.trace(Object message);

log.trace(Object message, Throwable t);

除此以外,还提供下列方法以便代码保护。

log.isFatalEnabled();

log.isErrorEnabled();

log.isWarnEnabled();

log.isInfoEnabled();

log.isDebugEnabled();

log.isTraceEnabled();

4.信息级别

确保日志信息在内容上和反应问题的严重程度上的恰当,是非常重要的。

1fatal非常严重的错误,导致系统中止。期望这类信息能立即显示在状态控制台上。

2error其它运行期错误或不是预期的条件。期望这类信息能立即显示在状态控制台上。

3warn使用了不赞成使用的API、非常拙劣使用API, '几乎就是'错误, 其它运行时不合需要和不合预期的状态但还没必要称为 "错误"。期望这类信息能立即显示在状态控制台上。

4info运行时产生的有意义的事件。期望这类信息能立即显示在状态控制台上。

5debug系统流程中的细节信息。期望这类信息仅被写入log文件中。

6trace更加细节的信息。期望这类信息仅被写入log文件中。

  通常情况下,记录器的级别不应低于info.也就是说,通常情况下debug的信息不应被写入log文件中。

分享到:
评论

相关推荐

    老生常谈Log4j和Log4j2的区别(推荐)

    然后使用Logger.getLogger()方法获取日志记录器,而Log4j2需要import org.apache.logging.log4j.Level、org.apache.logging.log4j.LogManager和org.apache.logging.log4j.Logger,使用LogManager.getLogger()方法...

    log4j使用教程(详解)

    3. **Log4j的组件** - Logger:日志记录器,负责实际的日志记录工作,可以按照类名或自定义名称创建多个Logger。 - Appender:日志输出器,定义日志信息输出的目标和格式,如ConsoleAppender(控制台)、...

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

    Log4j是一个广泛使用的Java日志记录框架,它允许开发者在应用程序中轻松地记录各种级别的日志信息,如DEBUG、INFO、WARN、ERROR等。在2021年底,一个重大的安全漏洞(CVE-2021-44228)被发现在Log4j2的早期版本中,...

    logging-log4j2-log4j-2.15.0-rc2.zip maven 资源库

    针对Log4j 2 远程代码执行漏洞,需要用到的升级资源包,适用于maven资源库,包括log4j,log4j-core,log4j-api,log4j-1.2-api,log4j-jpa等全套2.15.0 maven资源库jar包。如果是maven本地仓库使用,需要将zip包解压...

    log4j简单使用

    - `log4j-1.2.14.jar`: 这是Log4j 1.2.14版本的jar包,包含了Log4j的全部类和方法,是使用Log4j进行日志记录的核心组件。 - `commons-logging-1.0.4.jar`: 这是Apache Commons Logging库,它是Java日志API的一个抽象...

    Log4j2简介及与Log4j效率对比

    3. **强大的异步日志功能**:Log4j2提供了基于LMAX Disruptor库的强大异步日志处理能力,显著提高了日志记录的性能。 4. **插件式架构**:Log4j2采用了插件式的软件架构,这使得框架易于扩展而无需修改其核心代码。...

    Log4j2结合Slf4j配置使用

    Log4j2 结合 Slf4j 配置使用 Log4j2 是一个功能强大且广泛使用的日志记录工具,它提供了灵活的日志记录机制和高性能的日志记录能力。Slf4j 则是一个简单的日志记录门面,提供了统一的日志记录接口。今天,我们将...

    log4j.jar各个版本

    apache-log4j-1.2.15.jar, apache-log4j-extras-1.0.jar, apache-log4j-extras-1.1.jar, apache-log4j.jar, log4j-1.2-api-2.0.2-javadoc.jar, log4j-1.2-api-2.0.2-sources.jar, log4j-1.2-api-2.0.2.jar, log4j-...

    SpringBoot框架配置log4j和log4j2的配置代码

    Log4j和Log4j2是两种广泛使用的Java日志框架,它们提供了灵活的日志配置和高性能的日志处理能力。本文将详细介绍如何在SpringBoot项目中配置Log4j和Log4j2。 ### SpringBoot与Log4j Log4j是Apache的一个开源项目,...

    log4j使用详解log4j使用详解

    ### Log4j 使用详解 #### 一、Log4j简介 Log4j 是 Apache 的一个开源项目,通过使用 Log4j,开发者能够控制日志信息的输出等级及去向,从而更加灵活地处理日志信息。它具有强大的功能,简单的配置,并且能够支持...

    Log4j2、Fastjson、Log4j的BurpSuite插件亲测有效

    Log4j、Log4j2和Fastjson的安全性问题在过去曾引起广泛关注,例如Log4j2的CVE-2021-44228(也被称为Log4Shell漏洞),这是一个远程代码执行漏洞,影响了许多使用Log4j2的系统。这个插件可能就是为了检测和利用这些...

    log4j+slf4j实现 log4j测试代码,log4j+slf4j实现 log4j测试代码

    Log4j和SLF4J(Simple Logging Facade for Java)是两个广泛使用的日志框架,它们各有优势并常被一起使用以提供更灵活的日志解决方案。本文将详细探讨如何通过SLF4J接口来使用Log4j进行日志记录,并展示一个测试代码...

    Log4j使用实例

    ### Log4j 使用实例详解 #### 一、Log4j简介 Log4j 是一个开源的日志记录框架,由 Apache 软件基金会提供。它允许开发者根据需求配置日志等级,并灵活选择日志信息的输出方式。Log4j 的核心组件包括 Logger、...

    Log4j2学习用到的jar包及apache-log4j-2.19.0-bin.zip

    分别有disruptor-3.3.4.jar(Log4j2异步日志的底层实现)、log4j-api-2.19.0.jar(log4j门面)、log4j-core-2.19.0.jar(log4j实现)、log4j-slf4j-impl-2.19.0.jar(SLF4J与Log4j绑定)、slf4j-api-1.7.30.jar(SLF...

    SSM整合中的Log4j日志的配置详情

    四、在 Maven 项目中引入 Log4j 依赖 在 Maven 项目中,需要引入 Log4j 依赖项,以便使用 Log4j。下面是一个基本的 Maven 依赖项配置: ``` &lt;groupId&gt;log4j &lt;artifactId&gt;log4j &lt;version&gt;1.2.16 ``` 这个配置...

    log4j使用详解 j2EE

    ### log4j使用详解 #### 一、log4j简介 Log4j是Apache的一个开源项目,用于实现日志功能,被广泛应用于各种基于Java的应用系统中。它提供了一个非常强大的框架来定制日志信息的生成方式,允许开发人员根据需要调整...

    log4j使用与java中log4j记录日志如何写入数据库

    本文将详细介绍如何在Java中使用Log4j来记录日志,并将其写入数据库。 首先,我们需要了解Log4j的基本结构。一个简单的Log4j项目通常包含以下几个部分: 1. **配置文件**:Log4j的配置文件通常是`log4j.properties...

    log4j-2.18.0

    3. 配置更新后的log4j2,禁用可能导致问题的JNDI查找功能,增强系统安全。 4. 对系统进行全面的安全检查,确保没有遗留的漏洞或风险。 5. 实施持续的安全监控,以便及时发现并处理任何异常行为。 总的来说,log4j2...

    log4j-api-2.12.4.ja和log4j-core-2.12.4.jar

    使用这两个JAR文件时,需要确保在应用程序的类路径中同时包含它们,以便正确运行Log4j 2框架。配置Log4j通常通过一个XML或JSON格式的配置文件完成,例如`log4j2.xml`或`log4j2.json`,这个文件定义了日志的输出级别...

    log4j-2.17.1的jar包,导入即可使用

    3. **导入使用**:在Java项目中使用Log4j非常简单,只需要将`log4j-2.17.1.jar`文件添加到项目的类路径(Classpath)中。对于Maven或Gradle项目,可以在依赖管理中添加相应的依赖条目。 4. **配置文件**:Log4j 的...

Global site tag (gtag.js) - Google Analytics