简介:
在应用程序中添加日志记录的目的:
监视代码中变量的情况,周期性的记录到文件中共其他应用进行统计分析工作。
跟踪代码运行时轨迹,作为日后审计的依据;
担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息。
通过log4j我们可以红纸日志信息输送的目的地是控制台,文件,GUI组件,甚至是套接口服务器,NT的事件记录器,UNIX Syslog守护进程等;我们也可以控制每一条日志的树池格式;通过定义每一条日志信息的级别,我们能够更细致的控制日志的生成过程。最令人感兴趣的就是这些个亿通过一个配置文件来灵活的进行配置二不需要修改应用代码。
编写测试文件:
创建web项目 导入log4j的jar包
2.编写properties文件 要加载src下
结果
这样就完成了测试
(1)很明显我们在编写代码的时候有各种需要打印日志的需求,比如:我们调试代码的时候;我们的应用出现了问题,我们分析、定位、解决问题的时候;我们想将某些日志信息作为离线的业务数据分析的时候等等
(2)最简单的打印日志的方式就是使用系统本身的输出语句,不过对于大多数需求这种方式都是不能满足的
(3)于是我们的目光可能会向编写一个专门打印日志信息的工具类转移,不过有人更近了一步,写出了一个日志框架供我们使用
(4)使用日志框架的好处显而易见,方便、自在、功能强大能够满足各种需求,不好的地方也是有的,比如:如果你也进行了试验你会发现,程序变慢了,需要一定的时间和精力作为学习的成本
(5)日志框架都是能控制什么哪?那我们需要打印的日志都能满足什么样的需求哪?通常我们希望一个日志框架能够灵活的做到以下三点:
5-1:能够控制日志信息想往哪里打就往哪里打,比如:控制台、文件、邮箱、数据库等等
5-2:能够控制日志信息想怎么打就怎么打,比如:我想要打印时间、程序的名称、程序的方法名、程序的行号、线程的名称等等
5-3:能够控制日志信息想打什么打什么,不想打的就不打,日志信息是分级别的,有时候我只想看错误的信息或者警告的信息,有时候我想看到所有的信息我想调试程序等等
(6)如果有这么个框架,不是太难使用我也是非常乐意玩玩的,尤其是当程序出现问题的时候,项目负责人让你赶紧解决问题,这时候有一份日志文件可供分析就好了!
log4j是这样的一个框架吗(很明显它是,要不然我不就白玩了嘛!)?
Logger <-------- Appender <------------------ Layout
| |
| |
AppebderSkeleton PatternLayout
|
|
WriterAppender
|
___________ |___________
| |
| |
ConsoleAooender FileAppender
Logger --- 日志写出器,共程序员输出日志
Appender ---日志目的地。把格式化的日志信息输出到指定的地方去
ConsoleAppender --目的地为控制台的Appender
FileAppender ---目的地为文件的Appender
RollingFileAppender --目的地为大小受限的文件的Appender
Layout --日志格式化器 ,用来把程序员的logging request 格式化成字符串
PatternLayout --用来指定 pattern 格式化 logging request 的layout
properties配置文件详解
也可不使用配置文件,而是在代码中配置log4h环境。但是配置文件可以使应用程序更加灵活。log4j支持两种配置文件格式 。xml和properties文件。
(1)配置根Logger。
log4j.rootLogger=level,appenderName1,appenderName2.....
其中level是日志记录的优先级,分为off,fatal,error,warn,info,debug,all或者自定的级别。建议使用四个级别,优先级从高到低 分别是 error,warn,info,debug。通过定义级别可以控制到应用程序中相应级别的日志信息的开关,比如 在这里定义了info级别,则程序中debug级别的日志信息将不被打印出来。appenderName就是指B日志信息输出带那个地方。可以同时指定多个输出目的地。优先级别 all<debug<info<warn<error<fatal<off
(2)配置日志信息输出目的地 appender。
log4j.appender.appenderName=Log4j提供的appedner类
log4j.appender.appenderName.属性名=属性值
.......
log4j.appender.appenderName.属性名=属性值
其中 log4j提供的appedner有以下几种:
org.apacha.log4j.ConsoleAppender(控制台);
org.apacha.log4j.FileAppender(文件);
org.apacha.log4j.DailyRollingFileAppender(每天产生一个日志文件);
org.apacha.log4j.RollingFileAppender(文件大小到达指定尺寸时产生一根新的文件);
org.apacha.log4j..WriterAppender(将日志信息以流的格式发送到任意指定的地方);
配置日志信息的格式(布局)
log4j.appender.appenderName.layout=log4j提供的layout类
log4j.appender.appenderName.layout.属性=值
...............
log4j.appender.appenderName.layout.属性=值
layout有以下几种
org.apache.log4j.HTMLLayout (
以html表格形式布局
);
org.apache.log4j.PatternLayout (
可以灵活的指定布局模式);
org.apache.log4j.SimpleLayout (
包含日志信息的级别和信息字符串);
org.apache.log4j.TTCCLayout (
包含日志产生的时间,线程,类别等信息)
xml配置文件详解
xml配置文件的头部包括两个部分:xml声明和dtd声明。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>
<!-- 将日志信息输出到控制台 -->
<appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
<!-- 设置日志输出的样式 -->
<layout class="org.apache.log4j.PatternLayout">
<!-- 设置日志输出的格式 -->
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
</layout>
<!--过滤器设置输出的级别-->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<!-- 设置日志输出的最小级别 -->
<param name="levelMin" value="WARN" />
<!-- 设置日志输出的最大级别 -->
<param name="levelMax" value="ERROR" />
<!-- 设置日志输出的xxx,默认是false -->
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>
<!-- 将日志信息输出到文件,但是当文件的大小达到某个阈值的时候,日志文件会自动回滚 -->
<appender name="RollingFileAppender" class="org.apache.log4j.RollingFileAppender">
<!-- 设置日志信息输出文件全路径名 -->
<param name="File" value="D:/log4j/RollingFileAppender.log" />
<!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
<param name="Append" value="true" />
<!-- 设置保存备份回滚日志的最大个数 -->
<param name="MaxBackupIndex" value="10" />
<!-- 设置当日志文件达到此阈值的时候自动回滚,单位可以是KB,MB,GB,默认单位是KB -->
<param name="MaxFileSize" value="10KB" />
<!-- 设置日志输出的样式 -->
<layout class="org.apache.log4j.PatternLayout">
<!-- 设置日志输出的格式 -->
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
</layout>
</appender>
<!-- 将日志信息输出到文件,可以配置多久产生一个新的日志信息文件 -->
<appender name="DailyRollingFileAppender" class="org.apache.log4j.DailyRollingFileAppender">
<!-- 设置日志信息输出文件全路径名 -->
<param name="File" value="D:/log4j/DailyRollingFileAppender.log" />
<!-- 设置日志每分钟回滚一次,即产生一个新的日志文件 -->
<param name="DatePattern" value="'.'yyyy-MM-dd-HH-mm'.log'" />
<!-- 设置日志输出的样式 -->
<layout class="org.apache.log4j.PatternLayout">
<!-- 设置日志输出的格式 -->
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
</layout>
</appender>
<!--
注意:
1:当additivity="false"时,root中的配置就失灵了,不遵循缺省的继承机制
2:logger中的name非常重要,它代表记录器的包的形式,有一定的包含关系,试验表明
2-1:当定义的logger的name同名时,只有最后的那一个才能正确的打印日志
2-2:当对应的logger含有包含关系时,比如:name=test.log4j.test8 和 name=test.log4j.test8.UseLog4j,则2-1的情况是一样的
2-3:logger的name表示所有的包含在此名的所有记录器都遵循同样的配置,name的值中的包含关系是指记录器的名称哟!注意啦!
3:logger中定义的level和appender中的filter定义的level的区间取交集
4:如果appender中的filter定义的 levelMin > levelMax ,则打印不出日志信息
-->
<!-- 指定logger的设置,additivity指示是否遵循缺省的继承机制-->
<logger name="test.log4j.test8.UseLog4j" additivity="false">
<level value ="WARN"/>
<appender-ref ref="DailyRollingFileAppender"/>
</logger>
<!--指定logger的设置,additivity指示是否遵循缺省的继承机制 -->
<logger name="test.log4j.test8.UseLog4j_" additivity="false">
<level value ="ERROR"/>
<appender-ref ref="RollingFileAppender"/>
</logger>
<!-- 根logger的设置-->
<root>
<level value ="INFO"/>
<appender-ref ref="ConsoleAppender"/>
<!--<appender-ref ref="DailyRollingFileAppender"/>-->
</root>
</log4j:configuration>
<log4j:configuration>(root element)
子节点:
xmlns:log4j [#FIXED attribute] : 定义log4j的名字空间,取定值"http://jakarta.apache.org/log4j/"
appender[*child]:一个appedner子元素定义一个日志输出目的地
logger[*child]:一个logger子元素定义一个日志写出器
root[? child]:root元素定义了 root logger
appender元素定义一个日志输出目的地
<appender name="DailyRollingFileAppender" class="org.apache.log4j.DailyRollingFileAppender">
name:定义appender的名字,以便被后文引用
class:定义appender对象所属的类的全名
param:创建appender对象是传递给类构造方法的参数
layout:该appender使用layout对象
layout: layout元素定义与某一个appender相联系的日志格式化器
class:定义layout对象所属的类的全名
param:创建layout对象时传递给类构造方法的参数
<layout class="org.apache.log4j.PatternLayout">
<!-- 设置日志输出的格式 -->
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
</layout>
------------------------------------------------
logger: logger元素定义一个日志输出器。
* name [#REQUIRED attribute] : 定义logger的名字,以便被后文引用
* additivity [#ENUM attribute] : 取值为"true"(默认)或者"false",是否继承父logger的属性
* level [? child] : 定义该logger的日志级别
* appender-ref [* child] : 定义该logger的输出目的地
<!--指定logger的设置,additivity指示是否遵循缺省的继承机制 -->
<logger name="test.log4j.test8.UseLog4j_" additivity="false">
<level value ="ERROR"/>
<appender-ref ref="RollingFileAppender"/>
</logger>
level: level元素定义logger对象的日志级别。
* class [#IMPLIED attribute] : 定义level对象所属的类,默认情况下是"org.apache.log4j.Level类
* value [#REQUIRED attribute] : 为level对象赋值。可能的取值从小到大依次为"all"、"debug"、"info"、"warn"、"error"、"fatal"和"off"。当值为"off"时表示没有任何日志信息被输出
* param [* child] : 创建level对象时传递给类构造方法的参数
appender-ref
appender-ref元素引用一个appender元素的名字,为logger对象增加一个appender。
* ref [#REQUIRED attribute] : 一个appender元素的名字的引用
* appender-ref元素没有子元素
param:----------param元素在创建对象时为类的构造方法提供参数。它可以成为appender、layout、filter、errorHandler、level、categoryFactory和root等元素的子元素。
* name and value [#REQUIRED attributes] : 提供参数的一组名值对
* param元素没有子元素
log4j.properties 配置日志生成a.text文件
log4j.rootLogger=debug,appender1,D
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = E://springMVC/lib/a.txt
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n