Z么不?/span>System.out.println()?
功能太弱Q不易于控制。如果暂时不惌Z怎么办?如果惌出到文g怎么办?如果想部分输出怎么办?……
Z么同时?/span>commons-logging?/span>Log4j?Z么不仅用其中之一Q?br /> Commons-loggin的目的是?#8220;所有的Java日志实现”提供一个统一的接口,它自w的日志功能q_弱(只有一个简单的SimpleLog?Q,所以一般不会单独用它?/span>
Log4j的功能非常全面强大,是目前的首选。我发现几乎所有的Java开源项目都会用?/span>Log4jQ但我同时发玎ͼ所有用?/span>Log4j的项目一般也同时会用?/span>commons-loggin。我惻I大家都不希望自己的项目与Log4jl定的太紧密吧。另外一个我能想到的“同时使用commons-logging?/span>Log4j”的原因是Q简化用和配置?/span>
一点,“同时使用commons-logging?/span>Log4j”Q与“单独使用Log4j”相比Qƈ不会带来更大的学习、配|和l护成本Q反而更加简化了我们的工作?/span>我想q也是ؓ什?#8220;所有用?/span>Log4j的项目一般也同时会用?/span>commons-loggin”的原因之一吧?/span>
Commons-logging能帮我们做什么?
l 提供一个统一的日志接口,单了操作Q同旉免项目与某个日志实现pȝ紧密a耦合
l 很脓心的帮我们自动选择适当的日志实现系l(q一炚w常好Q)
l 它甚至不需要配|?/span>
q里看一下它怎么“‘很脓心的’帮我?#8216;自动选择’‘适当?#8217;日志实现pȝ”Q?/span>
1) 首先?/span>classpath下寻找自q配置文gcommons-logging.propertiesQ如果找刎ͼ则用其中定义的Log实现c;
2) 如果找不?/span>commons-logging.properties文gQ则在查找是否已定义pȝ环境变量org.apache.commons.logging.LogQ找到则使用其定义的Log实现c;
3) 否则Q查?/span>classpath中是否有Log4j的包Q如果发玎ͼ则自动?/span>Log4j作ؓ日志实现c;
4) 否则Q?/span>JDK自n的日志实现类Q?/span>JDK1.4以后才有日志实现c)Q?/span>
5) 否则Q?/span>commons-logging自己提供的一个简单的日志实现c?/span>SimpleLogQ?/span>
Q以上顺序不保证完全准确Q请参考官Ҏ档)
可见Q?/span>commons-loggingL能找C个日志实现类Qƈ且尽可能扑ֈ一?#8220;最合?#8221;的日志实现类。我说它“很脓?#8221;实际上是因ؓQ?/span>1、可以不需要配|文Ӟ2、自动判断有没有Log4j包,有则自动使用之;3、最悲观的情况下也总能保证提供一个日志实玎ͼSimpleLogQ?/span>
可以看到Q?/span>commons-logging对编E者和Log4j都非常友好?/span>
Z化配|?/span>commons-loggingQ一般不使用commons-logging的配|文Ӟ也不讄?/span>commons-logging相关的系l环境变量,而只需?/span>Log4j?/span>Jar包放|到classpash中就可以了。这样就很简单地完成?/span>commons-logging?/span>Log4j的融合?/span>如果不想?/span>Log4j了怎么办?只需?/span>classpath中的Log4j?/span>Jar包删除即可?br />
p么简单!
代码应该怎么写?
我们在需要输出日志信息的“每一?#8221;cM做如下的三个工作Q?/span>
1、导入所有需?/span>commongs-loggingc:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
如果愿意化的话,q可以两行合Z行:
import org.apache.commons.logging.*;
2、在自己的类中定义一?/span>org.apache.commons.logging.LogcȝU有静态类成员Q?/span>
private static Log log = LogFactory.getLog(YouClassName.class);
注意q里定义的是static成员Q以避免产生多个实例?/span>
LogFactory.getLog()Ҏ的参C用的是当前类?/span>classQ这是目前被普通认为的最好的方式。ؓ什么不写作LogFactory.getLog(this.getClass())Q因?/span>staticcL员访问不?/span>this指针Q?/span>
3、?/span>org.apache.commons.logging.Logcȝ成员Ҏ输出日志信息Q?/span>
log.debug("111");
log.info("222");
log.warn("333");
log.error("444");
log.fatal("555");
q里?/span>logQ就是上面第二步中定义的cL员变量,其类型是org.apache.commons.logging.LogQ通过该类的成员方法,我们可以将不同性质的日志信息输出到目的圎ͼ目的地是哪里Q视配置可定Q可能是stdoutQ也可能是文Ӟq可能是发送到邮gQ甚臛_送短信到手机……详见下文?/span>log4j.properties的介l)Q?/span>
l debug() 输出“调试”U别的日志信息;
l info() 输出“信息”U别的日志信息;
l warn() 输出“警告”U别的日志信息;
l error() 输出“错误”U别的日志信息;
l fatal() 输出“致命错误”U别的日志信息;
Ҏ不同的性质Q日志信息通常被分成不同的U别Q从低到高依ơ是Q?#8220;调试Q?/span>DEBUGQ?#8221;“信息Q?/span>INFOQ?#8221;“警告Q?/span>WARNQ?#8221;“错误Q?/span>ERRORQ?#8221;“致命错误Q?/span>FATALQ?#8221;?/span>Z么要把日志信息分成不同的U别呢?q实际上是方便我们更好的控制它。比如,通过Log4j的配|文Ӟ我们可以讄“输出‘调试’及以上别的日志信息”Q即“调试”“信息”“警告”“错误”“致命错误”Q,q对目开发h员可能是有用的;我们q可以设|?#8220;输出“警告”及以上别的日志信息”Q即“警告”“错误”“致命错误”Q,q对目最l用户可能是有用的?/span>
仅从字面上理解,也可以大致得出结论:最常用的应该是debug()?/span>info()Q?/span>warn()?/span>error()?/span>fatal()仅在相应事g发生后才使用?/span>
从上面三个步骤可以看出,使用commons-logging的日志接口非常的单,不需要记忆太多东西:仅仅用到了两个类Log, LogFactoryQƈ且两个类的方法都非常(后者只用到一个方法,前者经常用到的也只是上面第三步中列出的几个Q,同时参数又非常简单?/span>
上面所介绍的方法是目前被普通应用的Q可以说是被标准化了的方法,几乎所有的人都是这么用。如果不信,或想认一下,去下蝲几个知名?/span>Java开源项目源代码看一下吧?/span>
下面l出一个完整的Javacȝ代码Q?/span>
package liigo.testlog;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class TestLog {
private static Log log = LogFactory.getLog(TestLog.class);
public void test() {
log.debug("111");
log.info("222");
log.warn("333");
log.error("444");
log.fatal("555");
}
public static void main(String[] args) {
TestLog testLog = new TestLog();
testLog.test();
}
}
只要保证commons-logging?/span>jar包在classpath中,上述代码肯定可以很顺利的~译通过。那它的执行l果是怎么L呢?恐怕会有很大的不同Q请l箋往下看?/span>
Log4j在哪里呢Q它发挥作用了吗Q?/span>
应该注意刎ͼ我们上面l出的源代码Q完全没有涉及到Log4j——这正是我们所希望的,q也正是commons-logging所要达到的目标之一?/span>
可是Q怎么才能?/span>Log4j发挥它的作用呢?{案很简单,只需满“classpath中有Log4j?/span>jar?#8221;。前面已l说q了Q?/span>commons-logging会自动发现ƈ应用Log4j。所以只要它存在Q它发挥作用。(它不存在呢?自然׃发挥作用Q?/span>commons-logging会另行选择其它的日志实现类。)
注意Q配|文?/span>log4j.properties?/span>Log4j来说是必ȝ。如?/span>classpath中没有该配置文gQ或者配|不对,会引发q行时异常?/span>
q样Q要正确地应?/span>Log4j输出日志信息Q?/span>log4j.properties的作用就很重要了。好在该文g有通用的模板,复制一份(E加修改Q就可以使用。几乎每一?/span>Java目目录内都会有一?/span>log4j.properties文gQ可下蝲几个Java开源项目源代码查看。本文最后也附一个模板性质?/span>log4j.properties文gQ直接复制过d可以用,或者根据自q需要稍加修攏V后文将?/span>log4j.properties文g适当作一些介l?/span>
LOG4J的配|之单它遍及于来多的应用中了:Log4J配置文g实现了输出到控制台、文件?/span>
回滚文g、发送日志邮件、输出到数据库日志表、自定义标签{全套功能。择其一二用就够用?/span>
log4j.rootLogger=DEBUG,CONSOLE,A1,im
log4j.addivity.org.apache=true
# 应用于控制台
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n
#应用于文?/font>
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=file.log
log4j.appender.FILE.Append=false
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# Use this layout for LogFactor 5 analysis
# 应用于文件回?/font>
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB
log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%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 Facter 5
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n
# Log Factor 5 Appender
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
# 发送日志给邮g
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=web@www.wuset.com
log4j.appender.MAIL.SMTPHost=www.wusetu.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=web@www.wusetu.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# 用于数据?/font>
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 ('[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
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=SampleMessages.log4j
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
#自定义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 =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1545873