log4j日志使用实例及配置过程中问题的解决(图解)。
一、介绍
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务 器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式。日志信息的优先级从高到低有ERROR、WARN、 INFO、DEBUG,分别用来指定这条日志信息的重要程度;日志信息的输出目的地指定了日志将打印到控制台还是文件中;而输出格式则控制了日志信息的显示内容。
要下载和了解更详细的内容请访问官方网站:http://jakarta.apache.org/log4j
二、配置文件
①下载所需的JAR包(我这边是myEclipse9开发的有些包已经有了,这里为了方便大家把官方地址给找好了)
1:CommoLogging:commons-logging-1.1.1.jar
2:log4j:log4j-1.2.16.jar
3:JavaMail:mail-1.4.4.jar
4:JavaBeans Activation Framework (JAF):activation.jar
以上Jar包复制到WebRoot\WEB-INF\lib目录下。
②添加日志配置文件
simplelog.properties是CommoLogging默认使用的SimpleLog日志组件的配置文件,这里我们用的是Log4j文件,所以就没有必要配置这个文件了。
在src目录下,新建commons-logging.properties和log4j.properties。
③配置commons-logging.properties
#set Log as Log4J
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
#set Log as JDK1.4
#org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger
#set Log as Avalon-Logkit
#org.apache.commons.logging.Log=org.apache.commons.logging.impl.LogKitLogger
#set Log as SimpleLog
#org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
#set Log as NoOpLog
#org.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog
④配置log4j.properties
1)输出到控制台ConsoleAppender
2)输出到文件FileAppender
3)按DatePattern输出到文件DailyRollingFileAppender
4)设定文件大小输出到文件RollingFileAppender
5)用Email发送日志
6)将日志登录到数据库
这里列出了6个日志输出方式,详尽配置文件请看另一篇:log4j.properties配置详解与实例-全部测试通过
⑤建一个JAVA文件作为输出日志测试用,写法看下图。
⑥工程目录结构
⑦执行第⑤步,得到各个输出效果(下图为日志登录到数据库)
三、以上测试时遇到问题
①发送邮件报错(原因:myEclipse9自带的发邮件包与JavaMail冲突)
log4j:WARN Error during default initialization
java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
解决办法:在安装(D:\Program Files\MyEclipse\Common\plugins\com.genuitec.eclipse.j2eedt.core_9.0.0.me201103181703\data\libraryset\EE_5)目录找到javaee.jar,用Winrar,7zip等工具删除里面的文件夹(mail,activation)
②发送邮件标题和正文乱码问题
解决办法:
标题:将文字用native2asii转换一下编码就可以。
正文:网上说是继承HTMLLayout然后重写getContentType(),本人测试过了不行。在继承了Layout,然后重写Layout里面的getContentType()是可以的。
调用方法:log4j.appender.logMail.layout = Source路径(com.sun.DefineLayOut)
③按照测试结果我们可以看出trace和debug属于同一级。
④在上面二的第⑤里面有个log.isDebugEnabled()这个意思是加上isDebugEnabled就可以避免执行debug pring1,如果不加,debug pring1是被执行了的,这样就白费功夫。
⑤大小写敏感问题。如:log4j.appender.systemOut.layout=xxx 这里的layout必须小写。