加拿大华人论坛 加拿大百科Commons-logging + Log4j 入门指南



在加拿大


[FONT=宋体]原创:庄晓立([/FONT]liigo[FONT=宋体])[/FONT]www.liigo.com2005-8-13 [FONT=宋体]为什么要用日志([/FONT]Log[FONT=宋体])[/FONT]?[FONT=宋体]这个……就不必说了吧。[/FONT][FONT=宋体]为什么不用[/FONT]System.out.println()?[FONT=宋体]功能太弱;不易于控制。如果暂时不想输出了怎么办?如果想输出到文件怎么办?如果想部分输出怎么办?……[/FONT][FONT=宋体]为什么同时使用[/FONT]commons-logging[FONT=宋体]和[/FONT]Log4j?[FONT=宋体]为什么不仅使用其中之一?[/FONT]Commons-loggin[FONT=宋体]的目的是为“所有的[/FONT]Java[FONT=宋体]日志实现”提供一个统一的接口,它自身的日志功能平常弱(只有一个简单的[/FONT]SimpleLog?[FONT=宋体]),所以一般不会单独使用它。[/FONT]Log4j[FONT=宋体]的功能非常全面强大,是目前的首选。我发现几乎所有的[/FONT]Java[FONT=宋体]开源项目都会用到[/FONT]Log4j[FONT=宋体],但我同时发现,所有用到[/FONT]Log4j[FONT=宋体]的项目一般也同时会用到[/FONT]commons-loggin[FONT=宋体]。我想,大家都不希望自己的项目与[/FONT]Log4j[FONT=宋体]绑定的太紧密吧。另外一个我能想到的“同时使用[/FONT]commons-logging[FONT=宋体]和[/FONT]Log4j[FONT=宋体]”的原因是,简化使用和配置。[/FONT] [FONT=宋体]强调一点,“同时使用[/FONT]commons-logging[FONT=宋体]和[/FONT]Log4j[FONT=宋体]”,与“单独使用[/FONT]Log4j[FONT=宋体]”相比,并不会带来更大的学习、配置和维护成本,反而更加简化了我们的工作。[/FONT][FONT=宋体]我想这也是为什么“所有用到[/FONT]Log4j[FONT=宋体]的项目一般也同时会用到[/FONT]commons-loggin[FONT=宋体]”的原因之一吧。[/FONT] Commons-logging[FONT=宋体]能帮我们做什么?[/FONT]l[FONT=&quot] [/FONT][FONT=宋体]提供一个统一的日志接口,简单了操作,同时避免项目与某个日志实现系统紧密[/FONT]a[FONT=宋体]耦合[/FONT]l[FONT=&quot] [/FONT][FONT=宋体]很贴心的帮我们自动选择适当的日志实现系统(这一点非常好!)[/FONT]l[FONT=&quot] [/FONT][FONT=宋体]它甚至不需要配置[/FONT] [FONT=宋体]这里看一下它怎么“‘很贴心的’帮我们‘自动选择’‘适当的’日志实现系统”:[/FONT]1)[FONT=&quot] [/FONT][FONT=宋体]首先在[/FONT]classpath[FONT=宋体]下寻找自己的配置文件[/FONT]commons-logging.properties[FONT=宋体],如果找到,则使用其中定义的[/FONT]Log[FONT=宋体]实现类;[/FONT]2)[FONT=&quot] [/FONT][FONT=宋体]如果找不到[/FONT]commons-logging.properties[FONT=宋体]文件,则在查找是否已定义系统环境变量[/FONT]org.apache.commons.logging.Log[FONT=宋体],找到则使用其定义的[/FONT]Log[FONT=宋体]实现类;[/FONT]3)[FONT=&quot] [/FONT][FONT=宋体]否则,查看[/FONT]classpath[FONT=宋体]中是否有[/FONT]Log4j[FONT=宋体]的包,如果发现,则自动使用[/FONT]Log4j[FONT=宋体]作为日志实现类;[/FONT]4)[FONT=&quot] [/FONT][FONT=宋体]否则,使用[/FONT]JDK[FONT=宋体]自身的日志实现类([/FONT]JDK1.4[FONT=宋体]以后才有日志实现类);[/FONT]5)[FONT=&quot] [/FONT][FONT=宋体]否则,使用[/FONT]commons-logging[FONT=宋体]自己提供的一个简单的日志实现类[/FONT]SimpleLog[FONT=宋体];[/FONT][FONT=宋体](以上顺序不保证完全准确,请参考官方文档)[/FONT] [FONT=宋体]可见,[/FONT]commons-logging[FONT=宋体]总是能找到一个日志实现类,并且尽可能找到一个“最合适”的日志实现类。我说它“很贴心”实际上是因为:[/FONT]1[FONT=宋体]、可以不需要配置文件;[/FONT]2[FONT=宋体]、自动判断有没有[/FONT]Log4j[FONT=宋体]包,有则自动使用之;[/FONT]3[FONT=宋体]、最悲观的情况下也总能保证提供一个日志实现([/FONT]SimpleLog[FONT=宋体])。[/FONT] [FONT=宋体]可以看到,[/FONT]commons-logging[FONT=宋体]对编程者和[/FONT]Log4j[FONT=宋体]都非常友好。[/FONT] [FONT=宋体]为了简化配置[/FONT]commons-logging[FONT=宋体],一般不使用[/FONT]commons-logging[FONT=宋体]的配置文件,也不设置与[/FONT]commons-logging[FONT=宋体]相关的系统环境变量,而只需将[/FONT]Log4j[FONT=宋体]的[/FONT]Jar[FONT=宋体]包放置到[/FONT]classpash[FONT=宋体]中就可以了。这样就很简单地完成了[/FONT]commons-logging[FONT=宋体]与[/FONT]Log4j[FONT=宋体]的融合。[/FONT][FONT=宋体]如果不想用[/FONT]Log4j[FONT=宋体]了怎么办?只需将[/FONT]classpath[FONT=宋体]中的[/FONT]Log4j[FONT=宋体]的[/FONT]Jar[FONT=宋体]包删除即可。[/FONT][FONT=宋体]就这么简单![/FONT][FONT=宋体]代码应该怎么写?[/FONT][FONT=宋体]我们在需要输出日志信息的“每一人”类中做如下的三个工作:[/FONT]1[FONT=宋体]、导入所有需的[/FONT]commongs-logging[FONT=宋体]类:[/FONT]import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;[FONT=宋体]如果愿意简化的话,还可以两行合为一行:[/FONT]import org.apache.commons.logging.*; 2[FONT=宋体]、在自己的类中定义一个[/FONT]org.apache.commons.logging.Log[FONT=宋体]类的私有静态类成员:[/FONT]private static Log log = LogFactory.getLog(YouClassName.class);[FONT=宋体]注意这里定义的是[/FONT]static[FONT=宋体]成员,以避免产生多个实例。[/FONT]LogFactory.getLog()[FONT=宋体]方法的参数使用的是当前类的[/FONT]class[FONT=宋体],这是目前被普通认为的最好的方式。为什么不写作[/FONT]LogFactory.getLog(this.getClass())[FONT=宋体]?因为[/FONT]static[FONT=宋体]类成员访问不到[/FONT]this[FONT=宋体]指针![/FONT] 3[FONT=宋体]、使用[/FONT]org.apache.commons.logging.Log[FONT=宋体]类的成员方法输出日志信息:[/FONT]log.debug("111");log.info("222");log.warn("333");log.error("444");log.fatal("555");[FONT=宋体]这里的[/FONT]log[FONT=宋体],就是上面第二步中定义的类成员变量,其类型是[/FONT]org.apache.commons.logging.Log[FONT=宋体],通过该类的成员方法,我们就可以将不同性质的日志信息输出到目的地(目的地是哪里?视配置可定,可能是[/FONT]stdout[FONT=宋体],也可能是文件,还可能是发送到邮件,甚至发送短信到手机……详见下文对[/FONT]log4j.properties[FONT=宋体]的介绍):[/FONT]l[FONT=&quot] [/FONT]debug() [FONT=宋体]输出“调试”级别的日志信息;[/FONT]l[FONT=&quot] [/FONT]info() [FONT=宋体]输出“信息”级别的日志信息;[/FONT]l[FONT=&quot] [/FONT]warn() [FONT=宋体]输出“警告”级别的日志信息;[/FONT]l[FONT=&quot] [/FONT]error() [FONT=宋体]输出“错误”级别的日志信息;[/FONT]l[FONT=&quot] [/FONT]fatal() [FONT=宋体]输出“致命错误”级别的日志信息;[/FONT][FONT=宋体]根据不同的性质,日志信息通常被分成不同的级别,从低到高依次是:“调试([/FONT]DEBUG[FONT=宋体])”“信息([/FONT]INFO[FONT=宋体])”“警告([/FONT]WARN[FONT=宋体])”“错误([/FONT]ERROR[FONT=宋体])”“致命错误([/FONT]FATAL[FONT=宋体])”。[/FONT][FONT=宋体]为什么要把日志信息分成不同的级别呢?这实际上是方便我们更好的控制它。比如,通过[/FONT]Log4j[FONT=宋体]的 配置文件,我们可以设置“输出‘调试’及以上级别的日志信息”(即“调试”“信息”“警告”“错误”“致命错误”),这对项目开发人员可能是有用的;我们 还可以设置“输出“警告”及以上级别的日志信息”(即“警告”“错误”“致命错误”),这对项目最终用户可能是有用的。[/FONT] [FONT=宋体]仅从字面上理解,也可以大致得出结论:最常用的应该是[/FONT]debug()[FONT=宋体]和[/FONT]info()[FONT=宋体];而[/FONT]warn()[FONT=宋体]、[/FONT]error()[FONT=宋体]、[/FONT]fatal()[FONT=宋体]仅在相应事件发生后才使用。[/FONT] [FONT=宋体]从上面三个步骤可以看出,使用[/FONT]commons-logging[FONT=宋体]的日志接口非常的简单,不需要记忆太多东西:仅仅用到了两个类[/FONT]Log, LogFactory[FONT=宋体],并且两个类的方法都非常少(后者只用到一个方法,前者经常用到的也只是上面第三步中列出的几个),同时参数又非常简单。[/FONT][FONT=宋体]上面所介绍的方法是目前被普通应用的,可以说是被标准化了的方法,几乎所有的人都是这么用。如果不信,或想确认一下,就去下载几个知名的[/FONT]Java[FONT=宋体]开源项目源代码看一下吧。[/FONT] [FONT=宋体]下面给出一个完整的[/FONT]Java[FONT=宋体]类的代码:[/FONT] 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(); }} [FONT=宋体]只要保证[/FONT]commons-logging[FONT=宋体]的[/FONT]jar[FONT=宋体]包在[/FONT]classpath[FONT=宋体]中,上述代码肯定可以很顺利的编译通过。那它的执行结果是怎么样的呢?恐怕会有很大的不同,请继续往下看。[/FONT] Log4j[FONT=宋体]在哪里呢?它发挥作用了吗?[/FONT][FONT=宋体]应该注意到,我们上面给出的源代码,完全没有涉及到[/FONT]Log4j[FONT=宋体]――这正是我们所希望的,这也正是[/FONT]commons-logging[FONT=宋体]所要达到的目标之一。[/FONT][FONT=宋体]可是,怎么才能让[/FONT]Log4j[FONT=宋体]发挥它的作用呢?答案很简单,只需满足“[/FONT]classpath[FONT=宋体]中有[/FONT]Log4j[FONT=宋体]的[/FONT]jar[FONT=宋体]包”。前面已经说过了,[/FONT]commons-logging[FONT=宋体]会自动发现并应用[/FONT]Log4j[FONT=宋体]。所以只要它存在,它就发挥作用。(它不存在呢?自然就不发挥作用,[/FONT]commons-logging[FONT=宋体]会另行选择其它的日志实现类。)[/FONT] [FONT=宋体]注意:配置文件[/FONT]log4j.properties[FONT=宋体]对[/FONT]Log4j[FONT=宋体]来说是必须的。如果[/FONT]classpath[FONT=宋体]中没有该配置文件,或者配置不对,将会引发运行时异常。[/FONT] [FONT=宋体]这样,要正确地应用[/FONT]Log4j[FONT=宋体]输出日志信息,[/FONT]log4j.properties[FONT=宋体]的作用就很重要了。好在该文件有通用的模板,复制一份(稍加修改)就可以使用。几乎每一个[/FONT]Java[FONT=宋体]项目目录内都会有一个[/FONT]log4j.properties[FONT=宋体]文件,可下载几个[/FONT]Java[FONT=宋体]开源项目源代码查看。本文最后也附一个模板性质的[/FONT]log4j.properties[FONT=宋体]文件,直接复制过去就可以用,或者根据自己的需要稍加修改。后文将会[/FONT]log4j.properties[FONT=宋体]文件适当作一些介绍。[/FONT] [FONT=宋体]这里顺便提示一点:如果不用[/FONT]commons-logging[FONT=宋体],仅仅单独使用[/FONT]Log4j[FONT=宋体],操作上反而要稍微麻烦一些,因为[/FONT]Log4j[FONT=宋体]需要多一点点的初始化代码(相比[/FONT]commons-logging[FONT=宋体]而言):[/FONT]import org.apache.log4j.Logger;import org.apache.log4j.PropertyConfigurator;public class TestLog4j { static Logger logger = Logger.getLogger(TestLog4j.class); //First step public static void main(String args[]) { PropertyConfigurator.configure("log4j.properties"); //Second step logger.debug("Here is some DEBUG"); //Third step logger.info("Here is some INFO"); logger.warn("Here is some WARN"); logger.error("Here is some ERROR"); logger.fatal("Here is some FATAL"); }}[FONT=宋体]不过也就多出一行。但这至少说明,引用[/FONT]commons-logging[FONT=宋体]并没有使问题复杂化,反而简单了一些。在这里[/FONT]1+1[FONT=宋体]就小于[/FONT]2[FONT=宋体]了。这也验证了前面的结论。[/FONT][FONT=宋体]总结[/FONT][FONT=宋体]将[/FONT]commons-logging[FONT=宋体]和[/FONT]Log4j[FONT=宋体]的[/FONT]jar[FONT=宋体]包都放置到[/FONT]classpath[FONT=宋体]下,同时也将[/FONT]Log4j[FONT=宋体]的配置文件放到[/FONT]classpath[FONT=宋体]中,两者就可以很好的合作。[/FONT] [FONT=宋体]采用[/FONT]Log4j[FONT=宋体]配合[/FONT]commons-logging[FONT=宋体]作为日志系统,是目前[/FONT]Java[FONT=宋体]领域非常非常流行的模式,使用非常非常的普遍。两者的结合带来的结果就是:简单[/FONT] + [FONT=宋体]强大。[/FONT]commons-logging[FONT=宋体]提供了简捷、统一的接口,不需要额外配置,简单;[/FONT]Log4j[FONT=宋体]功能非常全面、强大;[/FONT]commons-logging[FONT=宋体]仅仅对[/FONT]Log4j([FONT=宋体]当然还包括其它[/FONT]LOG[FONT=宋体]实现[/FONT])[FONT=宋体]作了一层包装,具体的日志输出还是在内部转交给身后的[/FONT]Log4j[FONT=宋体]来处理;而[/FONT]Log4j[FONT=宋体]虽然做了所有的事情,却甘作绿叶,从不以真身示人。[/FONT][FONT=宋体]两者堪称绝配。[/FONT] [FONT=宋体]对[/FONT]log4j.properties[FONT=宋体]的一点介绍[/FONT][FONT=宋体]下面对[/FONT]log4j.properties[FONT=宋体]文件内容作一点点介绍,以后文所附[/FONT]log4j.properties[FONT=宋体]文件为例:[/FONT][FONT=宋体]除去以[/FONT]#[FONT=宋体]开头的注释以及空行,第一行有用的内容是:[/FONT]log4j.rootLogger = DEBUG, CONSOLE,A1log4j.rootLogger[FONT=宋体]是最最重要的一个属性了,它定义日志信息的“输出级别”和“输出目的地”。[/FONT][FONT=宋体]关键看“[/FONT]=[FONT=宋体]”后面的值,“[/FONT]DEBUG, CONSOLE,A1[FONT=宋体]”[/FONT][FONT=宋体]这里我们要把它分成两部分:第一个逗号之前的是第一部分,指定“输出级别”;后面的是第二部分,指定“输出目的地”。可以同时指定多个“输出目的地”,以逗号隔开。[/FONT][FONT=宋体]具体到上面这一行:它指定的“输出级别”是“[/FONT]DEBUG[FONT=宋体]”;它指定的“输出目的地”是“[/FONT]CONSOLE[FONT=宋体]”和“[/FONT]A1[FONT=宋体]”。[/FONT][FONT=宋体]注意:[/FONT]l[FONT=&quot] [/FONT][FONT=宋体]“输出级别”有可选的五个值,分别是[/FONT]DEBUG[FONT=宋体]、[/FONT]INFO[FONT=宋体]、[/FONT]WARN[FONT=宋体]、[/FONT]ERROR[FONT=宋体]、[/FONT]FATAL[FONT=宋体],它们是由[/FONT]Log4j[FONT=宋体]系统定义的。[/FONT]l[FONT=&quot] [/FONT][FONT=宋体]“输出目的地”就是我们自己定义的了,就在[/FONT]log4j.properties[FONT=宋体]的后面部分,此文件定义的“输出目的地”有[/FONT]CONSOLE[FONT=宋体]、[/FONT]FILE[FONT=宋体]、[/FONT]ROLLING_FILE[FONT=宋体]、[/FONT]SOCKET[FONT=宋体]、[/FONT]LF5_APPENDER[FONT=宋体]、[/FONT]MAIL[FONT=宋体]、[/FONT]DATABASE[FONT=宋体]、[/FONT]A1[FONT=宋体]、[/FONT]im[FONT=宋体]。该文件之所以可作主模板,就是因为它比较全面地定义了各种常见的输出目的地(控制台、文件、电子邮件、数据库等)。[/FONT][FONT=宋体]好,下面详细解释“[/FONT]log4j.rootLogger=DEBUG, CONSOLE,A1[FONT=宋体]”[/FONT][FONT=宋体]这一行:[/FONT]l[FONT=&quot] [/FONT][FONT=宋体]指定“输出级别”是“[/FONT]DEBUG[FONT=宋体]”,即,仅输出级别大于等于“调试([/FONT]DEBUG[FONT=宋体])”的日志信息[/FONT][FONT=宋体]。如果此处指定的是“[/FONT]WARN[FONT=宋体]”则仅调用[/FONT]warn()[FONT=宋体]、[/FONT]error()[FONT=宋体]、[/FONT]fatal()[FONT=宋体]方法输出的日志信息才被输出到“输出目的地”,而调用[/FONT]debug()[FONT=宋体]、[/FONT]info()[FONT=宋体]方法输出的日志信息不被输出到“输出目的地”。明白了吗?[/FONT]Log4j[FONT=宋体]就是以这种方式来过滤控制日志信息的输出与否,这也是对日志信息进行级别分类的目的。[/FONT]l[FONT=&quot] [/FONT][FONT=宋体]指定“输出目的地”是“[/FONT]CONSOLE[FONT=宋体]”和“[/FONT]A1[FONT=宋体]”,即,将指定的日志信息(根据日志级别已进行了过滤)同时输出到的“控制台”和“[/FONT]SampleMessages.log4j[FONT=宋体]文件”。[/FONT] [FONT=宋体]为什么说“[/FONT]CONSOLE[FONT=宋体]”表示将日志信息输出到“控制台”呢?那就要看一下后文的定义了:[/FONT]# [FONT=宋体]应用于控制台[/FONT] 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=宋体]为什么说“[/FONT]A1[FONT=宋体]”表示将日志信息输出到[/FONT][FONT=宋体]“[/FONT]SampleMessages.log4j[FONT=宋体]文件”呢?还要看后文的定义:[/FONT]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 [FONT=宋体]注意:这里的定义没有指定输出文件的路径,它的路径实际上是[/FONT] java.user.path[FONT=宋体]的值。[/FONT] [FONT=宋体]您应该已经注意到,在定义“输出目的地”时,还可以指定日志格式、时间、布局等相关信息。略过。[/FONT] [FONT=宋体]好了,我可以根据需要,将这一行修改为:[/FONT]log4j.rootLogger = ERROR, CONSOLE,FILE,MAIL[FONT=宋体]将“错误([/FONT]ERROR[FONT=宋体])”及“致命错误([/FONT]FATAL[FONT=宋体])”级别的日志信息同时输出到控制台、文件,并且发电子邮件向系统管理员报告。是不是很爽?(如果将“调试([/FONT]DEBUG[FONT=宋体])”级别的日志信息邮件给管理员,恐怕迟早会把他[/FONT]/[FONT=宋体]她的邮箱涨爆,哪怕用的是[/FONT]Gmail[FONT=宋体]!再次理解了“将日志信息分为不同级别”的意图了吧?)[/FONT] [FONT=宋体]附:一个有用的[/FONT]log4j.properties[FONT=宋体]文件模板[/FONT]##Log4J[FONT=宋体]的配置之简单使它遍及于越来越多的应用中了[/FONT]##Log4J[FONT=宋体]配置文件实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能。择其一二使用就够用了。[/FONT]##[FONT=宋体]此文件([/FONT]log4j.properties[FONT=宋体])内容来自网络,非本文作者[/FONT]liigo[FONT=宋体]原创。[/FONT] log4j.rootLogger=DEBUG, CONSOLE,A1log4j.addivity.org.apache=true # [FONT=宋体]应用于控制台[/FONT] 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=宋体]应用于文件[/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=宋体]应用于文件回滚[/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 #[FONT=宋体]应用于[/FONT]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 # [FONT=宋体]发送日志给邮件[/FONT] log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender log4j.appender.MAIL.Threshold=FATAL log4j.appender.MAIL.BufferSize=10 [email protected] log4j.appender.MAIL.SMTPHost=www.wusetu.com log4j.appender.MAIL.Subject=Log4J Message [email protected] log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n # [FONT=宋体]用于数据库[/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 #[FONT=宋体]自定义[/FONT]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 = [email protected] log4j.appender.im.layout=org.apache.log4j.PatternLayout log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n # [FONT=宋体]结束[/FONT] [FONT=宋体]参考资料[/FONT]http://jakarta.apache.org/commons/logging/http://logging.apache.org/log4j/docs/www.baidu.com.cn [FONT=宋体]联系作者[/FONT][FONT=宋体]原名:庄晓立[/FONT][FONT=宋体]网名:[/FONT]liigo[FONT=宋体]邮件:[/FONT][email protected][FONT=宋体]网站:[/FONT]www.liigo.com [FONT=宋体]如有错误或不当之处,欢迎告知!不胜感激。[/FONT]Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=454336

评论
麻烦先看这里:配偶及小孩团聚资料 整理帖http://forum.iask.ca/showthread.php?t=59279 超赞 赏 palmerModerator 0$(VIP 0) 6,8542007-03-10#2 log4j.propertieslog4j.propertieslog4j.rootLogger = [DEBUG],CONSOLE# level=ERROR、WARN、INFO、DEBUGlog4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender#  org.apache.log4j.ConsoleAppender(控制台),#  org.apache.log4j.FileAppender(文件),#  org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),#  org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),#  org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)log4j.appender.Threshold=DEBUGlog4j.appender.CONSOLE.Target=System.outlog4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout#  org.apache.log4j.HTMLLayout(以HTML表格形式布局),#  org.apache.log4j.PatternLayout(可以灵活地指定布局模式),#  org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),#  org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)log4j.appender.CONSOLE.layout.ConversionPattern=-[%p]-[%l]- %m%n# %m:产生的日志具体信息# %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL#  %r 输出自应用启动到输出该log信息耗费的毫秒数#  %c 输出所属的类目,通常就是所在类的全名#  %t 输出产生该日志事件的线程名#  %n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”#  %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921#  %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)

  ·生活百科 地板、地砖、拖把,哪一种轻便好用?
·房产房屋 如果我想在瓷砖上钻孔,我应该购买什么样的钻孔工具?

加拿大百科-加拿大

不打游戏,我买了个游戏键盘

华人网原因无他,好键盘都是游戏键盘 我最基本的诉求是键帽字体清晰可见。我打字时虽然会盲打,但有些键还是要看的,例如数字/符号键、F功能键等。当把眼睛从屏幕转到键盘时,由于屏 ...

加拿大百科-加拿大

视频编辑器

华人网最近去百幕大,波士顿旅行,拍了不少视频。有的是用相机拍的,有的是用GoPro 拍的。想把这些视频根据日期,地点等加在一起。谷歌后发现微软Windows 11 带有 Clipchamp 这个视频编辑器, ...

加拿大百科-加拿大

开车的成本,我的10年Ford Edge

华人网我的福特开了10年,里程是85000公里,去养护时,问了一下这些年花费了多少维修费用?工作人员告诉我一共$4700,加上我前两年换了轮胎$1000,电池几百刀,合计6千多加元。在国内时我 ...

加拿大百科-加拿大

temu霸屏,怎么驱除?

华人网随便打开一个网页,发现temu的广告到处都是,上下左右,霸占了一大半面积,简直是强行抢占了别人的页面,非常离谱。我试图使用Google Report an ad/listing功能,填写Complaint on multiple ad ...

加拿大百科-加拿大

大家在拼多多上买东西了吗

华人网拼多多最近在加拿大开店了。 评论 拼多多app被Goolge下架了。Google suspends Chinas Pinduoduo app on security concernsAlphabet Incs Google suspended the Play version of PDD Holdings Incs Pinduoduo app for security concerns ...

加拿大百科-加拿大

请问抗焦虑症的替代药物

华人网家人在国内一直每天服用下面两种抗焦虑症的药,试过其他药都没有效果。准备回加拿大了,但是在加拿大的医保卡已经过期,另外不知道来加拿大有没有同样的替代药物?请问有没有 ...

加拿大百科-加拿大

亚马逊账号被黑记

华人网上来报个到,亚马逊账号被黑了,都不知道对方是怎么操作的...故事有点长,等有时间了再来更新。 评论 现在都有two step authentication,还能被黑,难道魔高一丈?最有效的解决途径是打 ...

加拿大百科-加拿大

大统华升职!!

华人网在大统华做supervisor要什么条件才可以升副主管,主管?薪水大约多少? 评论 大统华labor太卷了 评论 zxzwan2010 说:大统华labor太卷了点击展开...我问卷不卷了吗? 评论 赞!!! 太棒啦! ...

加拿大百科-加拿大

关于立遗书

华人网大家觉得有必要立遗嘱吗在安省 现在自住房想以后留给孩子独生子 评论 有比没有好, 没有的话万一有事真的很麻烦 评论 平安书有钱有业有孩子的必须做,如果大吉利是忽然走了,所 ...

加拿大百科-加拿大

世界十大最丑建筑。转帖

华人网互联网 榜首反而最具设计感? 评论 美学向来没有一定的準则,每个人的审美观各有不同,话虽如此,但当大多数人都认为一件事物是美或醜,总会有一定的参考价值。 评论 早前国外一 ...