java日志篇(3)-Log4j(log for java)

 慢慢来比较快,虚心学技术

前言:Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

 一、Log4j基本使用示例

import org.apache.log4j.Level;
import org.apache.log4j.Logger;

public class Log4JTest {
    public static void main(String arg[]){
        //获取根logger
        Logger rootLogger = Logger.getRootLogger();
        //获取当前对象为名的logger
        Logger logger = Logger.getLogger(Log4JTest.class);
        
        rootLogger.info("root-info");
        logger.info("Log4j-INFO");
        logger.error("Log4j-ERROR");
        logger.debug("Log4j-DEBUG");
        rootLogger.debug("root-debug");
        logger.warn("Log4j-WARN");
    }
}

 log4j.properties(与Log4JTest.java同级目录)

#配置rootLogger
log4j.rootLogger=info,appender1,logFile,appender2

#配置第一个appender
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
#指定该appender输出所有DEBUG以上的日志
log4j.appender.appender1.Threshold=DEBUG
#选择比较方便的的日志输出格式-包含日志产生的时间、线程、类别等等信息
log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout

#配置第二个appender
log4j.appender.appender2=org.apache.log4j.ConsoleAppender
#指定该appender输出所有WARN以上的日志
log4j.appender.appender2.Threshold=WARN
#指定该appender通过控制台的err输出日志
log4j.appender.appender2.Target=System.err
#配置该appender的输出格式
log4j.appender.appender2.layout = org.apache.log4j.PatternLayout
#其中 %d表示日志时间点的日期或时间,默认格式为 ISO8601,也可以在其后指定格,
#    %l表示输出日志事件的发生位置,包括类目名、发生的线程,以及行数。
#    %-5p 输出日志信息优先级,占5个字符
#    %m 输出代码中指定的消息,产生的日志具体信息
#    %n 输出一个回车换行符
log4j.appender.appender2.layout.ConversionPattern =%d %l %-5p %m %n
log4j.appender.appender2.ImmediateFlush = true

#配置文件输出appender,
log4j.appender.logFile = org.apache.log4j.FileAppender
#配置文件输出样式
log4j.appender.logFile.layout = org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n
#指定仅记录ERROR以上级别的日志
log4j.appender.logFile.Threshold = ERROR
log4j.appender.logFile.ImmediateFlush = TRUE
#指定将日志累加到日志文件末尾
log4j.appender.logFile.Append = TRUE
#指定日志文件
log4j.appender.logFile.File = ./Log4J/log/log4j.log
log4j.appender.logFile.Encoding = UTF-8

 运行结果如下:

控制台输出:

[main] INFO root - root-info
[main] INFO Log4JTest - Log4j-INFO
[main] ERROR Log4JTest - Log4j-ERROR
2019-01-30 15:22:16,052 Log4JTest.main(Log4JTest.java:13) ERROR Log4j-ERROR 
[main] WARN Log4JTest - Log4j-WARN
2019-01-30 15:22:16,054 Log4JTest.main(Log4JTest.java:16) WARN  Log4j-WARN 

Process finished with exit code 0



log4j.log内容:

[ERROR][2019/01/30 15:22:1652 ][Log4JTest.main(Log4JTest.java:13)]
Log4j-ERROR

 

二、Log4j使用浅析

log4j类图分析

            1.Logger

                           日志写出器,供程序员输出日志信息 (可控制日志输出级别)

 

            2.Appander

                            日志目的地,把格式化好的日志信息输出到指定的地方去(指定了日志将打印到控制台还是文件中)

  •                           ConsoleAppender  --------------目的地为控制台的 Appender
  •                           FileAppender ---------------------目的地为文件的 Appender 
  •                           RollingFileAppender ------------目的地为大小受限的文件的 Appender  

            3.Layout

                             日志格式化器,用来把程序员的 logging request 格式化成字符串(控制日志信息的显示格式)

            4.log4j.properties

                              log4j对于程序控制的配置文件,目前支持xml以及java的properties格式

            5.log4j日志优先级 

                              ALL < DEBUG < INFO <WARN < ERROR < FATAL < OFF 


三、Log4j配置详解(使用properties方式)

                虽然我们可以像上一篇文章java日志篇(2)-JUL(java.util.logging)一样在java程序代码中去控制log4j的日志级别和输出样式等参数,但是基于灵活性和可扩展性的需求,我们最好选择在配置文件中设置log4j的基本参数,下面我们了解一下log4j配置文件的基本内容

1.配置根Logger(上述实例中的rootLogger)

语法:log4j.rootLogger = level,appenderName1,appenderName2

        其中:level表示日志优先级别,appenderName1,appenderName2表示配置的一个个appender的名称

        示例:log4j.rootLogger=info,appender1,appender2

            注:rootLogger是所有logger的超类,在配置文件中对rootLogger的所有属性设置,都会被系统内所有logger所默认继承(包括级别,appender等)

2.配置日志信息输出目的地 Appender

语法:

log4j.appender.appender名 = Log4j 提供的 appender 类   

log4j.appender.appender名.属性名 = 属性值 
......

log4j.appender.appender名.属性名 = 属性值

 其中,上一节中的log4j类图所示,log4j提供的appender类主要有以下用的比较多的几个:

org.apache.log4j.ConsoleAppender(控制台),  

org.apache.log4j.FileAppender(文件),  

org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),  

org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),

org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方) 

其中,对应主要几个appender的属性列表如下:

ConsoleAppender:

Threshold=level     指定日志消息的输出最低层次

ImmediateFlush=true/false        所有的消息是否立即输出,默认true

Target=System.err/System.out     指定输出到控制台的形式,默认System.out

 

FileAppender:

Threshold=同上

ImmediateFlush=同上

File=mylog.txt               指定消息输出到 mylog.txt 文件。  

Append=true/false        是否将内容添加到日志文件的末尾,默认为true,false代表覆盖日志文件原有内容 

 

RollingFileAppender:

Threshold=同上

ImmediateFlush=同上

File=同上  

Append=同上

MaxFileSize=100KB:     在日志文件到达该大小时,将会自动滚动, 即将原来的内容移到 mylog.log.1 文件。后缀可以是 KB, MB 或者是 GB.

MaxBackupIndex=2         指定可以产生的滚动文件的最大数

 

DailyRollingFileAppender :

Threshold=同上

ImmediateFlush=同上

File=同上  

Append=同上

DatePattern=''.''yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。

当然也可以指定按月、周、天、时和分。即对应的格式如下:  

1)''.''yyyy-MM: 每月  

2)''.''yyyy-ww: 每周  

3)''.''yyyy-MM-dd: 每天  

4)''.''yyyy-MM-dd-a: 每天两次  

5)''.''yyyy-MM-dd-HH: 每小时  

6)''.''yyyy-MM-dd-HH-mm: 每分钟  

3.配置日志信息的格式(布局)

语法:
log4j.appender.appender名.layout = Log4j 提供的 layout类

log4j.appender.appender名.layout.属性 = 值 
。。。。。。。。
log4j.appender.appender名.layout.属性 = 值 

其中,log4j提供的layout类主要有以下几个:

org.apache.log4j.HTMLLayout(以 HTML 表格形式布局)

org.apache.log4j.PatternLayout(可以灵活地指定布局模式)

org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)

org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

通用属性

LocationInfo=true/false             是否输出 java 文件名称和行号,默认为false

PatternLayout:

ConversionPattern= %d %l %-5p %m %n  指定输出格式

-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: 输出日志信息所属的类目,配置文件中的名字,通常就是所在类的全名(若使用 rootLogger)

%t: 输出产生该日志事件的线程名  %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及行数。 举例:Testlog4.main(TestLog4.java:10)  

%x: 输出和当前线程相关联的 NDC(嵌套诊断环境),尤其用到像 java servlets 这样的多客户多线程的应 用中。  

%%: 输出一个"%"字符  

%F: 输出日志消息产生时所在的文件名称  

%L: 输出代码中的行号  

%m: 输出代码中指定的消息,产生的日志具体信息  

%n: 输出一个回车换行符,Windows 平台为"\r\n",Unix 平台为"\n"输出日志信息换行

%M: 输出日志信息所属的方法


所遇问题:

            如上述实例中配置,我们得到的输出里面都没有debug日志的内容

          查看了日志文件,虽然我把某些appender级别设置为debug级别,依旧没有输出

后经查看原来是因为设置了rootLogger的最低级别为info,其下子logger无法越级输出

解决方案:

            1.更改实时logger的级别:

logger.setLevel(Level.DEBUG);

            2.更改rootLogger的最低级别

log4j.rootLogger=all,appender1,logFile,appender2

总结

      1.通过配置文件log4j.properties或者log4j.xml对程序日志进行控制的方式比JUL更为方便灵活

      2.可以通过设置不同的appender和级别控制哪个级别的日志输出到何处,大大增强了日志管理的针对性

       注:本文参考文档:log4j 入门、详解 -雪飘零,纯属笔记,多多担待

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值