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");
    }
}

Log4JTest.java

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

log4j.properties

运行结果如下:

控制台输出:

[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类图分析

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

其中: leve表示日志优先级别,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日志的内容

输出结果没有debug

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

把某些appender级别设置为debug级别

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

rootLogger的最低级别为info

解决方案:

1.更改实时logger的级别:

logger.setLevel(Level.DEBUG);

2.更改rootLogger的最低级别

log4j.rootLogger=all,appender1,logFile,appender2

总结

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352