人啊,总是在学习中发现不足,不足中学习,学习中成长。
今天来系统记录一下对于常用日志组件的理解、配置、使用。 仅供参考, 错误之处请各路好汉不吝笔墨批评指正。
转载请注明出处
Log4j日志框架是Apache 的一款用来记录程序运行中的异常、结果数据以及各种你想要看到的数据都可以自己控制打印到具体的目的地是控制台、文件、GUI组件甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等来查看。 同时也可以控制日志打印的格式,这样就能够打印出符合自己阅读习惯的日志格式。
并且Log4j是开源的日志框架,发展到如今已是相当的成熟;非常流行的java框架 Spring、Hibernate、Struts2都是用该工具来当做日志工具。
组件介绍:log4j组件大概有Append、Logger、Layout
Append:日志输出器,可以配置日志输出目的地、输出格式、输出级别等
目的地分别有以下几个类,配置时写在append的class属性以org.apache.log4j.xxx全限定名来写:
ConsoleAppender: 输出到控制台
FileAppender:输出到文件
RollingFileAppender:输出到文件,当达到一定阈值时自动备份文件。
DailyRollingAppender:可定期备份日志文件,默认为一天一个,也可以设置一小时一次,一分钟一次。
WriterAppender: 自定义日志输出位置
输出级别有以下几种:ALL、DEBUG、INFO、WARN、ERROR、FATAL、OFF
OFF:为最高等级 关闭了日志信息
FATAL:为可能导致应用中止的严重事件错误
ERROR:为严重错误,主要是程序的错误
WARN:为一般警告,如session丢失
INFO:为一般要显示的信息,比如登录登出
DEBUG:程序的调试
TRACE:为比DEBUG更细粒度的事件信息
ALL:为最低等级,将打开所有级别日志输出
输出格式:最常用的输出格式类为:org.apache.log4j.PatternLayOut 主要参数为
-X号: X信息输出时左对齐;
%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%r: 输出自应用启动到输出该log信息耗费的毫秒数
%c: 输出日志信息所属的类目,通常就是所在类的全名
%t: 输出产生该日志事件的线程名
%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main (TestLog4.java:10)
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%: 输出一个"%"字符
%F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。
3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边较远输出的字符截掉。
Logger:可以理解为获得输出器的方式,可以配置多个。逻辑为:logger为root节点的子节点,log4j会根据代码中的日志查找logger的配置标签,如果没有匹配的就一直向上直至root标签。
name属性:要配置的类的全限定名,也即是要专门的配置哪个类中的日志打印。 比如有的时候想单独的把某个类的日志单独打印到一个文件,那么就可以配置一个Logger
additivity属性:是否遵循默认的继承机制,也即是如果找不到Logger是否使用root。配置为false,标识不遵循继承机制。
Root:日志输出获得器的根节点,有且仅有一个,无属性配置。开启默认继承机制的如果找不到对应Logger都会使用Root
示例配置:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <!-- 日志输出到控制台 --> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <!-- 日志输出格式 --> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%p][%d{yyyy-MM-dd HH:mm:ss SSS}][%c]-[%m]%n"/> </layout> <!--过滤器设置输出的级别--> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <!-- 设置日志输出的最小级别 --> <param name="levelMin" value="INFO"/> <!-- 设置日志输出的最大级别 --> <param name="levelMax" value="ERROR"/> </filter> </appender> <!-- 输出日志到文件 --> <appender name="fileAppender" class="org.apache.log4j.FileAppender"> <!-- 输出文件全路径名--> <param name="File" value="/data/applogs/own/fileAppender.log"/> <!--是否在已存在的文件追加写:默认时true,若为false则每次启动都会删除并重新新建文件--> <param name="Append" value="false"/> <param name="Threshold" value="INFO"/> <!--是否启用缓存,默认false--> <param name="BufferedIO" value="false"/> <!--缓存大小,依赖上一个参数(bufferedIO), 默认缓存大小8K --> <param name="BufferSize" value="512"/> <!-- 日志输出格式 --> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%p][%d{yyyy-MM-dd HH:mm:ss SSS}][%c]-[%m]%n"/> </layout> </appender> <!-- 输出日志到文件,当文件大小达到一定阈值时,自动备份 --> <!-- FileAppender子类 --> <appender name="rollingAppender" class="org.apache.log4j.RollingFileAppender"> <!-- 日志文件全路径名 --> <param name="File" value="/data/applogs/RollingFileAppender.log" /> <!--是否在已存在的文件追加写:默认时true,若为false则每次启动都会删除并重新新建文件--> <param name="Append" value="true" /> <!-- 保存备份日志的最大个数,默认值是:1 --> <param name="MaxBackupIndex" value="10" /> <!-- 设置当日志文件达到此阈值的时候自动回滚,单位可以是KB,MB,GB,默认单位是KB,默认值是:10MB --> <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="dailyRollingAppender" class="org.apache.log4j.DailyRollingFileAppender"> <!-- 文件文件全路径名 --> <param name="File" value="/data/applogs/own/dailyRollingAppender.log"/> <param name="Append" value="true" /> <!-- 设置日志备份频率,默认:为每天一个日志文件 --> <param name="DatePattern" value="‘.‘yyyy-MM-dd‘.log‘" /> <!--每分钟一个备份--> <!--<param name="DatePattern" value="‘.‘yyyy-MM-dd-HH-mm‘.log‘" />--> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%p][%d{HH:mm:ss SSS}][%c]-[%m]%n"/> </layout> <!-- 1. 指定logger的设置,additivity是否遵循缺省的继承机制 2. 当additivity="false"时,root中的配置就失灵了,不遵循缺省的继承机制 3. 代码中使用Logger.getLogger("logTest")获得此输出器,且不会使用根输出器 --> <logger name="logTest" additivity="false"> <level value ="INFO"/> <appender-ref ref="dailyRollingAppender"/> </logger> <!-- 根logger的设置,若代码中未找到指定的logger,则会根据继承机制,使用根logger--> <root> <appender-ref ref="console"/> <appender-ref ref="fileAppender"/> <appender-ref ref="rollingAppender"/> <appender-ref ref="dailyRollingAppender"/> </root> </appender>
代码中通过 private static final Logger logger = Logger.getLogger(TestMain.class); 来拿到对应的Logger。 log4j就是通过类名来与Logger的name相匹配进行日志输出。
往年京城始相知,半载瞬逝情却萌。年少不知愁滋味,犹读红豆生南国。别离方知相思苦,心田红豆根已固。
原文:https://www.cnblogs.com/qiaoyutao/p/10995895.html