我们在实际开发中需要使用控制台打印出每一步的请求的sql语句,方便调试,同时也需要部署到服务器之后,需要每天生成log文件,这样若是有问题就可以直接去查看,对于一些不常见的问题不用费尽心思去重现。首先需要了解Commons-logging,log4j,slf4j的区别
以上三个都是针对日志的,但是有什么区别呢?
Commons-logging : apache最早提供的日志的门面接口。避免和具体的日志方案直接耦合。类似于JDBC 的api 接口,具体的的JDBC driver 实现由各数据库提供商实现。通过统一接口解耦,不过其内部也实现了一些简单日志方案。
Log4j : 经典的一种日志解决方案。内部把日志系统抽象封装成Logger 、appender 、pattern 等实现。我们可以通过配置文件轻松的实现日志系统的管理和多样化配置。
Slf4j : 全称为Simple Logging Facade for JAVA:java简单日志门面。 是对不同日志框架提供的一个门面封装。可以在部署的时候不修改任何配置即可接入一种日志实现方案。和commons-loging 应该有一样的初衷。个人感觉设从计上更好一些,没有commons 那么多潜规则。同时有两个额外特点:
1. 能支持多个参数,并通过{} 占位符进行替换,避免老写logger.isXXXEnabled 这种无奈的判断,带来性能提升见:http://www.slf4j.org/faq.html#logging_performance 。
2.OSGI 机制更好兼容支持
总的来说就是slf4j是日志的接口(只定义了一些方法而没有去实现),和commons-logging一样。而log4j是具体的实现(即怎么来打印日志等),和logback是一样的。slf4j与commons-logging只是一个日志门面,实际还是要依赖真正的日志库log4j,属于log4j最强大,不需要依赖其他包
Log4j支持两种配置文件格式,一种是XML(标准通用标记语言下的一个应用)格式的文件,一种是Java特性文件log4j.properties(键=值)。
第一种:
slf4j+log4j组合使用模式:
1.log4j-1.2.14.jar
2.slf4j-api-1.6.1.jar
3.slf4j-jdk14-1.6.1.jar
4. log4j.properties(也可以是 log4j.xml)
import org.slf4j.Logger; import org.slf4j.LoggerFactory; Logger logger = LoggerFactory.getLogger(xx.class);
第二种:
JCL+Log4J组合使用模式(即commons-logging+log4j):
1. commons-logging-1.1.jar
2. log4j-1.2.15.jar
3. log4j.properties(也可以是 log4j.xml)
import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; private static Log log = LogFactory.getLog(xx.class);
第三种:
log4j:
import org.apache.log4j.Logger; Logger logger= Logger.getLogger(xx.class);
1.首先是struts2+myBatis的组合,我们采用第三种的方式来实现,4个jar包均有,log4j的properties
/** * 此句为将等级为INFO的日志信息输出到stdout和R这两个目的地,stdout和R的定义在下面的代码,可以任意起名。等级可分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,如果配置OFF则不打出任何信息,如果配置为INFO这样只显示INFO, WARN, ERROR的log信息,而DEBUG信息不会被显示. */ log4j.rootCategory=info,STDOUT,R /** * 此句为定义名为stdout的输出端是哪种类型,可以是 org.apache.log4j.ConsoleAppender(控制台), org.apache.log4j.FileAppender(文件), org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件), org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件) org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方) */ log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender /** * 此句为定义名为stdout的输出端的layout是哪种类型,可以是 org.apache.log4j.HTMLLayout(以HTML表格形式布局), org.apache.log4j.PatternLayout(可以灵活地指定布局模式), org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串), org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息) */ log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout /** * 如果使用pattern布局就要指定的打印信息的具体格式ConversionPattern,打印参数如下: %m 输出代码中指定的消息 %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL %r 输出自应用启动到输出该log信息耗费的毫秒数 %c 输出所属的类目,通常就是所在类的全名 %t 输出产生该日志事件的线程名 %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n” %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。 */ log4j.appender.STDOUT.layout.ConversionPattern=%d %-5p %c.%M:%L - %m%n /** * 定义名为R的输出端的类型为每天产生一个日志文件。 */ log4j.appender.R=org.apache.log4j.DailyRollingFileAppender /** * 定义名为R的输出端的文件名为${catalina.base}/logs/travel/travel.log可以自行修改。总之实在tomcat的log中即可 */ log4j.appender.R.File=${catalina.base}/logs/travel/travel.log log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%d %-5p %c.%M:%L - %m%n /** * mybaties的log配置,也就是能让mybaties的sql输出在控制台上 */ log4j.logger.com.ibatis=debug log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug log4j.logger.java.sql.Connection=debug log4j.logger.java.sql.Statement=debug log4j.logger.java.sql.PreparedStatement=debug
感兴趣的可以看看http://mybatis.github.io/mybatis-3/zh/logging.html这篇文章讲的很详细
2.struts2+hibernate的
使用的是xml的形式,但是要先引入log4j的dtd
<?xml version="1.0" encoding="UTF-8" ?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <!-- Authors: Chris Taylor, Ceki Gulcu. --> <!-- Version: 1.2 --> <!-- A configuration element consists of optional renderer elements,appender elements, categories and an optional root element. --> <!ELEMENT log4j:configuration (renderer*, appender*,plugin*, (category|logger)*,root?, (categoryFactory|loggerFactory)?)> <!-- The "threshold" attribute takes a level value below which --> <!-- all logging statements are disabled. --> <!-- Setting the "debug" enable the printing of internal log4j logging --> <!-- statements. --> <!-- By default, debug attribute is "null", meaning that we not do touch --> <!-- internal log4j logging settings. The "null" value for the threshold --> <!-- attribute can be misleading. The threshold field of a repository --> <!-- cannot be set to null. The "null" value for the threshold attribute --> <!-- simply means don't touch the threshold field, the threshold field --> <!-- keeps its old value. --> <!ATTLIST log4j:configuration xmlns:log4j CDATA #FIXED "http://jakarta.apache.org/log4j/" threshold (all|trace|debug|info|warn|error|fatal|off|null) "null" debug (true|false|null) "null" reset (true|false) "false" > <!-- renderer elements allow the user to customize the conversion of --> <!-- message objects to String. --> <!ELEMENT renderer EMPTY> <!ATTLIST renderer renderedClass CDATA #REQUIRED renderingClass CDATA #REQUIRED > <!-- Appenders must have a name and a class. --> <!-- Appenders may contain an error handler, a layout, optional parameters --> <!-- and filters. They may also reference (or include) other appenders. --> <!ELEMENT appender (errorHandler?, param*, rollingPolicy?, triggeringPolicy?, connectionSource?, layout?, filter*, appender-ref*)> <!ATTLIST appender name CDATA #REQUIRED class CDATA #REQUIRED > <!ELEMENT layout (param*)> <!ATTLIST layout class CDATA #REQUIRED > <!ELEMENT filter (param*)> <!ATTLIST filter class CDATA #REQUIRED > <!-- ErrorHandlers can be of any class. They can admit any number of --> <!-- parameters. --> <!ELEMENT errorHandler (param*, root-ref?, logger-ref*, appender-ref?)> <!ATTLIST errorHandler class CDATA #REQUIRED > <!ELEMENT root-ref EMPTY> <!ELEMENT logger-ref EMPTY> <!ATTLIST logger-ref ref CDATA #REQUIRED > <!ELEMENT param EMPTY> <!ATTLIST param name CDATA #REQUIRED value CDATA #REQUIRED > <!-- The priority class is org.apache.log4j.Level by default --> <!ELEMENT priority (param*)> <!ATTLIST priority class CDATA #IMPLIED value CDATA #REQUIRED > <!-- The level class is org.apache.log4j.Level by default --> <!ELEMENT level (param*)> <!ATTLIST level class CDATA #IMPLIED value CDATA #REQUIRED > <!-- If no level element is specified, then the configurator MUST not --> <!-- touch the level of the named category. --> <!ELEMENT category (param*,(priority|level)?,appender-ref*)> <!ATTLIST category class CDATA #IMPLIED name CDATA #REQUIRED additivity (true|false) "true" > <!-- If no level element is specified, then the configurator MUST not --> <!-- touch the level of the named logger. --> <!ELEMENT logger (level?,appender-ref*)> <!ATTLIST logger name CDATA #REQUIRED additivity (true|false) "true" > <!ELEMENT categoryFactory (param*)> <!ATTLIST categoryFactory class CDATA #REQUIRED> <!ELEMENT loggerFactory (param*)> <!ATTLIST loggerFactory class CDATA #REQUIRED> <!ELEMENT appender-ref EMPTY> <!ATTLIST appender-ref ref CDATA #REQUIRED > <!-- plugins must have a name and class and can have optional parameters --> <!ELEMENT plugin (param*, connectionSource?)> <!ATTLIST plugin name CDATA #REQUIRED class CDATA #REQUIRED > <!ELEMENT connectionSource (dataSource?, param*)> <!ATTLIST connectionSource class CDATA #REQUIRED > <!ELEMENT dataSource (param*)> <!ATTLIST dataSource class CDATA #REQUIRED > <!ELEMENT triggeringPolicy ((param|filter)*)> <!ATTLIST triggeringPolicy name CDATA #IMPLIED class CDATA #REQUIRED > <!ELEMENT rollingPolicy (param*)> <!ATTLIST rollingPolicy name CDATA #IMPLIED class CDATA #REQUIRED > <!-- If no priority element is specified, then the configurator MUST not --> <!-- touch the priority of root. --> <!-- The root category always exists and cannot be subclassed. --> <!ELEMENT root (param*, (priority|level)?, appender-ref*)> <!-- ==================================================================== --> <!-- A logging event --> <!-- ==================================================================== --> <!ELEMENT log4j:eventSet (log4j:event*)> <!ATTLIST log4j:eventSet xmlns:log4j CDATA #FIXED "http://jakarta.apache.org/log4j/" version (1.1|1.2) "1.2" includesLocationInfo (true|false) "true" > <!ELEMENT log4j:event (log4j:message, log4j:NDC?, log4j:throwable?, log4j:locationInfo?, log4j:properties?) > <!-- The timestamp format is application dependent. --> <!ATTLIST log4j:event logger CDATA #REQUIRED level CDATA #REQUIRED thread CDATA #REQUIRED timestamp CDATA #REQUIRED time CDATA #IMPLIED > <!ELEMENT log4j:message (#PCDATA)> <!ELEMENT log4j:NDC (#PCDATA)> <!ELEMENT log4j:throwable (#PCDATA)> <!ELEMENT log4j:locationInfo EMPTY> <!ATTLIST log4j:locationInfo class CDATA #REQUIRED method CDATA #REQUIRED file CDATA #REQUIRED line CDATA #REQUIRED > <!ELEMENT log4j:properties (log4j:data*)> <!ELEMENT log4j:data EMPTY> <!ATTLIST log4j:data name CDATA #REQUIRED value CDATA #REQUIRED >
xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %-5p %c.%M:%L - %m%n"/> </layout> </appender> <appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="${catalina.base}/logs/gzyManage/manage"/> <param name="DatePattern" value="'.'yyyy-MM-dd'.log'"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %-5p %c.%M:%L - %m%n"/> </layout> </appender> <root> <priority value="INFO"/> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE"/> </root> </log4j:configuration>
相关推荐
### Java Log4j 使用详解 #### 一、Java 日志管理概述 在Java应用程序中,良好的日志管理对于系统的维护和故障排查至关重要。本篇文章旨在详细介绍如何在Java中使用Log4j来管理日志,包括其配置方法以及与其他日志...
**日志框架Log4j详解** 在Java编程中,日志记录是不可或缺的一部分,它用于追踪应用程序的运行状态,帮助开发者在出现问题时定位错误、调试程序。Log4j是一款广泛使用的开源日志框架,由Apache软件基金会开发。本文...
**Java日志框架Log4j详解** 在Java编程中,日志记录是一项至关重要的任务,它可以帮助开发者跟踪程序运行过程中的错误、调试信息以及其他关键事件。Log4j是一款广泛使用的开源日志框架,由Apache软件基金会开发,为...
### Log4j 使用详解 #### 一、Log4j简介 Log4j 是 Apache 的一个开源项目,通过使用 Log4j,开发者能够控制日志信息的输出等级及去向,从而更加灵活地处理日志信息。它具有强大的功能,简单的配置,并且能够支持...
在Java代码中使用Log4j非常简单,只需要按照以下步骤操作: 1. 导入`org.apache.log4j.Logger`类。 2. 创建一个静态的`Logger`对象。 3. 使用`Logger`对象的方法(如`debug`、`info`、`warn`、`error`等)记录日志...
Log4j 详解 Log4j 是一款功能强大的日志记录工具,广泛应用于 Java 应用程序中。它可以帮助开发人员调试和分析程序,记录程序的运行情况,并提供了灵活的配置方式来控制日志的输出。 Log4j 的概念 Log4j 中有三个...
#### 四、在代码中使用Log4j 要在代码中使用Log4j,首先需要获取一个Logger实例。 - **语法**:`public static Logger getLogger(String name)` - **示例**: ```java import org.apache.log4j.Logger; ...
Java程序log4j配置详解 log4j是一个流行的Java日志记录工具,提供了灵活的日志记录和管理功能。在Java程序中,log4j配置正确是非常重要的,本文将详细介绍log4j配置的各个方面。 一、log4j配置文件 log4j的配置...
总结来说,Log4j是一个强大且灵活的日志框架,它的广泛使用证明了其在Java应用日志管理中的价值。通过深入理解和正确配置,Log4j可以帮助开发者更好地监控程序状态,定位和解决问题,从而提升软件的稳定性和可靠性。...
`logging-log4j-1.2.9.jar`是log4j 1.2.9版本的可执行JAR包,包含了所有必要的类和资源,以便在Java应用程序中引入log4j功能。开发者只需将这个JAR文件添加到项目的类路径中,就可以开始使用log4j进行日志记录。 **...
在Java开发中,日志记录是一项不可或缺的工作,它能够帮助开发者追踪程序运行状态,定位错误,优化性能。而log4j作为一款强大的日志框架,广泛应用于各种Java项目中。本文将详细介绍如何配置和使用log4j.properties...
部分代码示例展示了如何在Java环境中不使用Log4j的情况下进行基本的日志记录,分别在客户端(ClientWithoutLog4j)和服务器端(ServerWithoutLog4j)两个类中实现。这些示例通过控制台输出的方式,模拟了简单的请求响应...
### Log4j.properties配置详解 #### 一、Log4j配置文件基本概念 Log4j是一种广泛应用于Java应用程序的日志框架,它可以帮助开发者轻松管理应用程序的日志记录过程。Log4j支持多种配置方式,其中.properties文件...
**日志系统在软件开发中扮演着至关重要的角色,它能帮助开发者跟踪程序运行状态,定位错误和异常,便于调试和优化。Log4j作为Java领域广泛应用的日志框架,提供了强大的日志记录功能和灵活的配置。本文将深入探讨log...
#### 四、log4j的核心组件 log4j的核心组件主要包括**Loggers(记录器)**、**Appenders(输出源)**和**Layouts(布局)**。 1. **Loggers (记录器)**:负责生成日志信息,并决定是否发送日志信息到Appenders。记录器...
总结,Log4j作为Java开发中的常用日志工具,其强大的配置能力使得开发者能够根据项目需求灵活管理日志。理解并熟练使用Log4j,不仅能提升代码可读性,还有助于问题排查和系统监控。同时,关注安全更新,确保日志框架...
Log4j和Log4j2是两种广泛使用的Java日志框架,它们提供了灵活的日志配置和高性能的日志处理能力。本文将详细介绍如何在SpringBoot项目中配置Log4j和Log4j2。 ### SpringBoot与Log4j Log4j是Apache的一个开源项目,...
在Java开发中,日志记录是一项非常重要的功能,它有助于跟踪程序运行时的状态并帮助开发者进行问题定位和性能优化。Log4j作为一款优秀的日志管理工具,被广泛应用于各种Java应用中。本文将基于给定文件信息中的描述...