log4j 整理 从入门到熟悉到使用

写在前面、最近没事想起来看看log4j、将从网上荡下来的资料整理一下、顺便自己搭个项目试试、、意在自己给自己写个入门教程。

log4j 整理 从入门到熟悉到使用

一:入门

二话不说,先弄个能看出效果的项目来(最下方有ssh2中使用log4j项目下载链接)

1、新建java项目(不会的 ctrl+w)

2、引入log4j.jar包 下载链接:http://logging.apache.org/log4j/1.2/download.html

3、在src下新建名为:log4j.properties文件

4、打开log4j.properties文件、选择下方Source编辑(先可直接贴过去):

log4j.rootLogger=DEBUG, console, file
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c-%M:%L] [%p] - %m%n

log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=D:/log/Log4jIntroduction.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss,SSS} [%t] [%c-%M\:%L] [%p] - %m%n
5、新建一个Log4jIntroduction测试类、代码:

package com.chy.log4j;

import org.apache.log4j.Logger;

public class Log4jIntroduction {
	public static void main(String[] args) {
		Logger logger = Logger.getLogger(Log4jIntroduction.class);
		logger.debug("log4j debug level info");
		logger.info("log4j info level info");
		logger.warn("log4j warn level info");
		logger.error("log4j error level info");
	}
}

以上步骤完成后项目结构:


运行测试类效果

控制台:

2013-10-17 15:15:28,187 [main] [com.chy.log4j.Log4jIntroduction-main:8] [DEBUG] - log4j debug level info
2013-10-17 15:15:28,203 [main] [com.chy.log4j.Log4jIntroduction-main:9] [INFO] - log4j info level info
2013-10-17 15:15:28,203 [main] [com.chy.log4j.Log4jIntroduction-main:10] [WARN] - log4j warn level info
2013-10-17 15:15:28,218 [main] [com.chy.log4j.Log4jIntroduction-main:11] [ERROR] - log4j error level info

D:/log/Log4jIntroduction.log:
2013-10-17 15:15:28,187 [main] [com.chy.log4j.Log4jIntroduction-main:8] [DEBUG] - log4j debug level info
2013-10-17 15:15:28,203 [main] [com.chy.log4j.Log4jIntroduction-main:9] [INFO] - log4j info level info
2013-10-17 15:15:28,203 [main] [com.chy.log4j.Log4jIntroduction-main:10] [WARN] - log4j warn level info
2013-10-17 15:15:28,218 [main] [com.chy.log4j.Log4jIntroduction-main:11] [ERROR] - log4j error level info

简单解释:

1、java项目中、运行时会自动加载src下的log4j.properties资源文件

2、在项目中通过Logger logger = Logger.getLogger(Log4jIntroduction.class);来获得记录日志的记录器、然后就可以在项目中通过logger.xxx(String Message)...随心所欲使用、记录不同级别日志信息。

这里的日志是什么意思?

日志指在程序中插入语句以提供调试信息。使用日志能够监视程序的执行。例如,用户利用日志可以获得关于应用程序故障的完整信息。用户可以将调试语句(如 System.out.println)插入到程序中以获得详细的调试信息。

为什么项目中要用到日志?

我们在编程时经常不可避免地要使用到一些日志操作,比如开发阶段的调试信息、运行时的日志记录及审计。通常大家可以简单地使用System.out.println()语句输出日志信息,但是往往会有一些判断,比如: 
 
	if (someCondition) {
 		 System.out.println("some information.");
	}

这些判断造成正常的程序逻辑中混杂了大量的输出语句。而在开发阶段写下的这些判断仅为了调试的语句,在开发完成时需要查找并移除。部署运行后,尤其是在一些企业应用系统中,还经常需要进一步调试,这时就遇到了更大的麻烦。所以,我们需要一套完备的、灵活的、可配置的日志工具log4J就是优秀的选择。

到这里也基本了解log4j是干什么的了?

通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、数据库、邮件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等等、但是常用的也就是控制台、文件、数据库;

我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最方便的是如果记录方式有变化、只需修改log4j的配置文件就行。

log4j资源文件如何配置?

要配置资源文件就要先了解log4j的组成以及他们代表的意义、Log4j 由 loggerappenderlayout三个组件组成。

Logger : 在执行应用程序时,接收日志语句生成的日志请求。它是一种重要的日志处理组件, 可以通过 log4j API 的 logger 类对其进行访问。它的方法有:debug、info、warn、error、fatal 和 log。这些方法用于记录消息。

所有的logger都有一个rootLogger用来指定全局的日志输出级别以及输出地的名称:exp:log4j.rootLogger=Level, appenderName1, appenderName2, ...

Appender : 管理日志语句的输出结果。执行日志语句时,Logger 对象将接收来自日志语句的记录请求。此请求是通过 logger 发送至 appender 的。然后,Appender 将输出结果写入到用户选择的目的地。对于不同的日志目 的地,提供不同的 appender 类型。这些 appender 包括:用于文件的 file appender、用于数据库的 JDBC appender 和用于 SMTP 服务器的 SMTP appender。 

Layout :用于指定 appender 将日志语句写入日志目的地所采用的格式。appender 可以用来格式化输出结果的各种布局包括:简单布局、模式布局和 HTML 布局。

还有一个日志等级的划分、优先级由高到低:OFF ,FATAL ,ERROR ,WARN ,INFO ,DEBUG ,ALL。   Log4j建议只使用FATAL ,ERROR ,WARN ,INFO ,DEBUG这五个级别。 指定某个级别之后、输出端只会输出优先级比指定级别高的日志信息、比如将上边的log4j.properties文件中rootLogger改为:log4j.rootLogger = warn, console  则INFO、DEBUG级别的日志信息不会被输出。

补充:

1、Logger 是用于特殊指定具体的package 或者class的输出日志的、后面说明,

2、Appender的一般使用选项(括号中为选项说明):

log4j.appender.appenderName = className 以下是className的取值
org.apache.log4j.ConsoleAppender(控制台),  
org.apache.log4j.FileAppender(文件),  
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),  
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),  
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)  
3、Layout的一般使用选项(括号中为选项说明)一般使用自定义样式、可以灵活指定输出格式:
log4j.appender.appenderName.layout=className 以下是className的取值
org.apache.log4j.HTMLLayout(以HTML表格形式布局),  
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),  
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),  
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)  
自定义样式(如开始项目中的 log4j.properties):

log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss,SSS} [%t] [%c-%M\:%L] [%p] - %m%n
上述配置参数详解及子配置信息: 

(1)ConsoleAppender选项:
Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。
ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。
Target=System.err:默认值是System.out。
(2)FileAppender选项:
Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。
ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。
Append=false:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。
File=D:/logs/logging.log4j:指定消息输出到logging.log4j文件中。
(3)DailyRollingFileAppender选项:
Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。
ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。
Append=false:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。
File=D:/logs/logging.log4j:指定当前消息输出到logging.log4j文件中。
DatePattern='.'yyyy-MM:每月滚动一次日志文件,即每月产生一个新的日志文件。当前月的日志文件名为logging.log4j,前一个月的日志文件名为logging.log4j.yyyy-MM。
另外,也可以指定按周、天、时、分等来滚动日志文件,对应的格式如下:
1)'.'yyyy-MM:每月
2)'.'yyyy-ww:每周
3)'.'yyyy-MM-dd:每天
4)'.'yyyy-MM-dd-a:每天两次
5)'.'yyyy-MM-dd-HH:每小时
6)'.'yyyy-MM-dd-HH-mm:每分钟
(4)RollingFileAppender选项:
Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。
ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。
Append=false:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。
File=D:/logs/logging.log4j:指定消息输出到logging.log4j文件中。
MaxFileSize=100KB:后缀可以是KB, MB 或者GB。在日志文件到达该大小时,将会自动滚动,即将原来的内容移到logging.log4j.1文件中。
MaxBackupIndex=2:指定可以产生的滚动文件的最大数,例如,设为2则可以产生logging.log4j.1,logging.log4j.2两个滚动文件和一个logging.log4j文件。


附:Log4j比较全面的配置

Log4j配置文件实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能。
log4j.rootLogger=DEBUG,console,dailyFile,im
log4j.additivity.org.apache=true
# 控制台(console)
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.ImmediateFlush=true
log4j.appender.console.Target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

# 日志文件(logFile)
log4j.appender.logFile=org.apache.log4j.FileAppender
log4j.appender.logFile.Threshold=DEBUG
log4j.appender.logFile.ImmediateFlush=true
log4j.appender.logFile.Append=true
log4j.appender.logFile.File=D:/logs/log.log4j
log4j.appender.logFile.layout=org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
# 回滚文件(rollingFile)
log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.Threshold=DEBUG
log4j.appender.rollingFile.ImmediateFlush=true
log4j.appender.rollingFile.Append=true
log4j.appender.rollingFile.File=D:/logs/log.log4j
log4j.appender.rollingFile.MaxFileSize=200KB
log4j.appender.rollingFile.MaxBackupIndex=50
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
# 定期回滚日志文件(dailyFile)
log4j.appender.dailyFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyFile.Threshold=DEBUG
log4j.appender.dailyFile.ImmediateFlush=true
log4j.appender.dailyFile.Append=true
log4j.appender.dailyFile.File=D:/logs/log.log4j
log4j.appender.dailyFile.DatePattern='.'yyyy-MM-dd
log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
# 应用于socket
log4j.appender.socket=org.apache.log4j.RollingFileAppender
log4j.appender.socket.RemoteHost=localhost
log4j.appender.socket.Port=5001
log4j.appender.socket.LocationInfo=true
# Set up for Log Factor 5
log4j.appender.socket.layout=org.apache.log4j.PatternLayout
log4j.appender.socket.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
# Log Factor 5 Appender
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
# 发送日志到指定邮件
log4j.appender.mail=org.apache.log4j.net.SMTPAppender
log4j.appender.mail.Threshold=FATAL
log4j.appender.mail.BufferSize=10
log4j.appender.mail.From = xxx@mail.com
log4j.appender.mail.SMTPHost=mail.com
log4j.appender.mail.Subject=Log4J Message
log4j.appender.mail.To= xxx@mail.com
log4j.appender.mail.layout=org.apache.log4j.PatternLayout
log4j.appender.mail.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
# 应用于数据库
log4j.appender.database=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.database.URL=jdbc:mysql://localhost:3306/test
log4j.appender.database.driver=com.mysql.jdbc.Driver
log4j.appender.database.user=root
log4j.appender.database.password=
log4j.appender.database.sql=INSERT INTO LOG4J (Message) VALUES('=[%-5p] %d(%r) --> [%t] %l: %m %x %n')
log4j.appender.database.layout=org.apache.log4j.PatternLayout
log4j.appender.database.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

# 自定义Appender
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = corlin@cybercorlin.net
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

log4j的强大功能无可置疑,但实际应用中免不了遇到某个功能需要输出独立的日志文件的情况,怎样才能把所需的内容从原有日志中分离,形成单独的日志文件呢?其实只要在现有的log4j基础上稍加配置即可轻松实现这一功能。
  先看一个常见的log4j.properties文件,它是在控制台和myweb.log文件中记录日志:
log4j.rootLogger=DEBUG, stdout, logfile
 
log4j.category.org.springframework=ERROR
log4j.category.org.apache=INFO
 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
 
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=${myweb.root}/WEB-INF/log/myweb.log
log4j.appender.logfile.MaxFileSize=512KB
log4j.appender.logfile.MaxBackupIndex=5
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
  
如果想对不同的类输出不同的文件(以cn.com.Test为例),先要在Test.java中定义:
private static Log logger = LogFactory.getLog(Test.class);
  然后在log4j.properties中加入:
log4j.logger.cn.com.Test= DEBUG, test
log4j.appender.test=org.apache.log4j.FileAppender
log4j.appender.test.File=${myweb.root}/WEB-INF/log/test.log
log4j.appender.test.layout=org.apache.log4j.PatternLayout
log4j.appender.test.layout.ConversionPattern=%d %p [%c] - %m%n
  也就是让cn.com.Test中的logger使用log4j.appender.test所做的配置。
 
  但是,如果在同一类中需要输出多个日志文件呢?其实道理是一样的,先在Test.java中定义:
private static Log logger1 = LogFactory.getLog("myTest1");
private static Log logger2 = LogFactory.getLog("myTest2");
  然后在log4j.properties中加入:
log4j.logger.myTest1= DEBUG, test1
log4j.appender.test1=org.apache.log4j.FileAppender
log4j.appender.test1.File=${myweb.root}/WEB-INF/log/test1.log
log4j.appender.test1.layout=org.apache.log4j.PatternLayout
log4j.appender.test1.layout.ConversionPattern=%d %p [%c] - %m%n
  
log4j.logger.myTest2= DEBUG, test2
log4j.appender.test2=org.apache.log4j.FileAppender
log4j.appender.test2.File=${myweb.root}/WEB-INF/log/test2.log
log4j.appender.test2.layout=org.apache.log4j.PatternLayout
log4j.appender.test2.layout.ConversionPattern=%d %p [%c] - %m%n
  也就是在用logger时给它一个自定义的名字(如这里的"myTest1"),然后在log4j.properties中做出相应配置即可。别忘了不同日志要使用不同的logger(如输出到test1.log的要用logger1.info("abc"))。
 
  还有一个问题,就是这些自定义的日志默认是同时输出到log4j.rootLogger所配置的日志中的,如何能只让它们输出到自己指定的日志中呢?别急,这里有个开关:
log4j.additivity.myTest1 = false
  它用来设置是否同时输出到log4j.rootLogger所配置的日志中,设为false就不会输出到其它地方啦!注意这里的"myTest1"是你在程序中给logger起的那个自定义的名字!
如果你说,我只是不想同时输出这个日志到log4j.rootLogger所配置的logfile中,stdout里我还想同时输出呢!那也好办,把你的log4j.logger.myTest1 = DEBUG, test1改为下式就OK啦!
log4j.logger.myTest1=DEBUG, test1
以上基本就是log4j一般使用方法、有这些之后、下面就是在s2sh项目中使用log4j的方式:

二:s2sh中使用log4j(交由spring管理)

1、引入commons-logging.jar、 log4j-1.2.14.jar
2、在WEB-INF下配置资源文件(不一定是必须在这里配置、后面可以指定资源文件位置)具体配置如下(注意其中的${webName.root}、是在web.xml中指定的项目所在的根目录):
#
# Log4J Settings for log4j 1.2.x (via jakarta-commons-logging)
#
# The five logging levels often used by Log are (in order):
#
#   1. DEBUG (the least serious)
#   2. INFO
#   3. WARN
#   4. ERROR
#   5. FATAL (the most serious)


# Set root logger level to DEBUG and append to stdout ,R
log4j.rootLogger=DEBUG, stdout ,R,DATABASE
#use log4j.logger.xxx.xxx=level , appenderName    just limit the specified package's or class's logs level.
#if you want to limit one more package or classes ,just list them like this:
log4j.logger.org=ERROR,R,stdout,DATABASE
log4j.logger.com.opensymphony.xwork2=WARN,R,stdout,DATABASE
log4j.logger.com.chy.ssh.web.action=WARN,R,stdout,DATABASE

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
#log4j.appender.stdout.layout.ConversionPattern=%d %5p (%c:%L) - %m%n
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%t] [%c-%M:%L] [%p] - %m%n

# Write Into LogFile
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=${webName.root}/WEB-INF/log/ssh.log
log4j.appender.R.MaxFileSize=10MB
log4j.appender.R.MaxBackupIndex=10
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} [%t] [%c-%M\:%L] [%p] - %m%n

#write into oracle    
log4j.appender.DATABASE = org.apache.log4j.jdbc.JDBCAppender     
log4j.appender.DATABASE.URL = jdbc\:oracle\:thin\:@192.168.30.57\:1521\:chen     
log4j.appender.DATABASE.driver = oracle.jdbc.OracleDriver     
log4j.appender.DATABASE.user = chen     
log4j.appender.DATABASE.password = chen    
log4j.appender.DATABASE.sql = INSERT INTO LOG4J (Message) VALUES ( ' [framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n ' )     
log4j.appender.DATABASE.layout = org.apache.log4j.PatternLayout     
log4j.appender.DATABASE.layout.ConversionPattern = [framework] % d - % c -%- 4r [ % t] %- 5p % c % x - % m % n    
3、web.xml 具体配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	
	<!--load all spring configuration and start with Tomcat server-->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/classes/applicationContext*.xml</param-value>
	</context-param>
    <listener>
  		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  	</listener>
  
   <!--the filter of struts2 intercept all request which end with .action-->
   <filter>
  		<filter-name>struts2</filter-name>
  		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
   </filter>
  
   <filter-mapping>
  		<filter-name>struts2</filter-name>
  		<url-pattern>/*</url-pattern>
   </filter-mapping>
  
   <!-- log4j configure -->
   <context-param>
   		<param-name>webAppRootKey</param-name>
   		<param-value>webName.root</param-value>
   </context-param>
   <!--由Sprng载入的Log4j配置文件位置-->
   <context-param>
   		<param-name>log4jConfigLocation</param-name>
   		<param-value>/WEB-INF/log4j.properties</param-value>
   </context-param>
   <context-param>
		<param-name>log4jRefreshInterval</param-name>
		<param-value>600000</param-value>
	</context-param>
	<listener>
		<listener-class>
			org.springframework.web.util.Log4jConfigListener
		</listener-class>
	</listener>	
	<!-- log4j end -->
  
	<!--project default home page-->
   <welcome-file-list>
    	<welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
</web-app>
运行项目、点击登录首页的登录按钮测试、登录Action——TestAction代码

package com.chy.ssh.web.action;


import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.Logger;
import com.chy.ssh.business.bean.UserDTO;
import com.chy.ssh.business.service.LoginService;
import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class TestAction extends ActionSupport {
	private LoginService loginService;
	private UserDTO user;
	private String username = "jack";
	//使用common-logging  记录
	private final Log log = LogFactory.getLog(TestAction.class);
	//使用log4j记录 (貌似没什么区别)
	private final Logger logger = Logger.getLogger(TestAction.class);
	public String execute(){
		log.info("base common-logging now to print userInfo");
		logger.info("now to print userInfo");
		
		
		System.out.println(user.getPassWord()+"========="+user.getUserName());
		
		UserDTO loginUser = loginService.login(user);
		logger.debug("now to check user is useful");
		if(loginUser != null){
			log.warn("base common-logging user is valid and username="+username);
			logger.warn("user is valid and username="+username);
			return "success";
		}else{
			log.warn("base common-logging user is invalid and username="+username);
			logger.error("user is invalid and username="+username);
			return "error";
		}
	}
	
	public LoginService getLoginService() {
		return loginService;
	}

	public void setLoginService(LoginService loginService) {
		this.loginService = loginService;
	}

	public UserDTO getUser() {
		return user;
	}

	public void setUser(UserDTO user) {
		this.user = user;
	}
	
}
上面写的比较乱、可将execute方法体改成只用logger记录一些信息查看效果即可!

到这里入门和使用就结束了(当然我说的只是简单的入门和在有spring的项目中的使用、在Servlet使用没有、在Servlet中使用可以用一个Servlet来加载log4j资源文件、将这个Servlet设置成随服务器启动就初始化。

深入一点:

概念:

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 机制更好兼容支持

commons-logging 与 log4j 的区别与联系:

区别:
  Log4j的强大也可以从它的普及之广可以看出,多少程序员对它的推崇,而它的处理能力确实也深受爱戴。而在这里面commons-logging给我们带来的更是Log4j的封装。

         1、commons-logging能把日志处理的log4j或其他的处理工具与项目进行解耦,解耦带来的好处,相信大家都知道,它便于我们更新技术,更改使用的方式。而不去涉及太多的改到。避免过度的紧密结合带来的许多问题

         2、commons-logging可以自动的选择日志实现的系统,它甚至不需要配置

总结区别 :Log4j是一个强大的日志实现的系统,而commons-logging是一个十分便利的接口,对Log4j的优势的封装,使日志实现系统与项目做到解耦的效果。

ps: commons-logging 不仅仅对Log4j的封装,还有着其他的日志实现系统,包括它自身简单的日志实现系统

联系: 联系就是两者的结合使用!
private static Log logger = LogFactory.getLog(CommonsLoggingTest.class);

LogFactory装载日志流程:

1.   首先,寻找org.apache.commons.logging.LogFactory 属性配置

2.   否则,利用JDK1.3 开始提供的service 发现机制,会扫描classpah 下的META-INF/services/org.apache.commons.logging.LogFactory 文件,若找到则装载里面的配置,使用里面的配置。

3.   否则,从Classpath 里寻找commons-logging.properties ,找到则根据里面的配置加载。

4.   否则,使用默认的配置:如果能找到Log4j 则默认使用log4j 实现,如果没有则使用JDK14Logger 实现,再没有则使用commons-logging 内部提供的SimpleLog 实现。

从上述加载流程来看,如果没有做任何配置,只要引入了log4j 并在classpath 配置了log4j.xml ,则commons-logging 就会使log4j 使用正常,而代码里不需要依赖任何log4j 的代码。

如果有任意两个实现slf4j 的包同时出现,那就有可能酿就悲剧,你可能会发现日志不见了、或都打到控制台了。原因是这两个jar 包里都有各自的org.slf4j.impl.StaticLoggerBinder ,编译时候绑定的是哪个是不确定的。这个

方要特别注意!

==========================================================================================================================================================================先整理到这里、碰到具体需求再具体处理、、、去看看能不能把项目放上去、、、下载链接:http://download.csdn.net/detail/chenghuaying/6413575






















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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值