一.日志家族

Log4j一开始就很强大,在jdk自带日志系统之前,apache就曾经尝试把log4j划为java的一部分,不知为何没能成功,sun还是用了自己很弱的日志系统。为了兼容各个日志系统,apache又推出了commons-logging,来对多个日志系统进行封装。Commons-logging本身不是日志系统,它只是一个日志系统大管家,来决定到底叫哪一个日志系统出马。由于它使用了ClassLoader寻找和载入底层的日志库,导致了象OSGI这样的框架无法正常工作,因为OSGI的不同的插件使用自己的ClassLoader。OSGI的这种机制保证了插件互相独立,然而却使Apache Common-Logging无法工作。为此人们创造了slf4j,它在编译时静态绑定真正的Log库,因此可以在OSGI中使用。所以,commons-logging跟slf4j是同一类东西,他们之间存在竞争。Log4j的创始人又整了一个logback,性能超越了log4j,但是log4j 2.0似乎又反超了logback。Log4j 2.0相对于log4j变化很多,最突出的一点就是配置文件有多种配置方式,包括xml,json,yaml,properties,其中xml又有strict(严格版)和concise(简易版)两种模式。虽然commons-logging与slf4j都只相当于一个大管家,但他们给人的感觉像是一种独立的日志系统,除了使用第三方的日志系统,这两个大管家也拥有自带的简易日志系统,一般只做测试用。于是人们编写了很多jar包作为这些日志系统之间转换的桥梁,把上面所提到的这些日志系统当做节点,可以画出一个图来,每一个jar包相当于一条边。
从网上下载的日志库,目录下有好多jar文件,要有选择的使用,不要全部导入,重则出错,轻则占用空间白费事。推荐使用log4j 2.0+slf4j组合,log4j2.0 包括api和core两个包,为了兼容过去的log4j,有一个兼容包log4j-1.2-api-2.5.jar;slf4j核心只包括一个包api,为了让它跟log4j 2.0搭配,需要slf4j到log4j的桥梁包(因为这个桥梁包可能只应用于log4j1.x,所以也要用log4j2.0的兼容包log4j-1.2-api-2.5.jar);如果让slf4j跟它自带的简易的日志系统搭配就要导入simple包。总之,以后一提日志系统,优先采用组合slf4j+log4j2.0.
现在许多框架使用的日志系统都不再直接依赖log4j而是依赖slf4j这个日志大管家,比如mybatis.只配置log4j-core和log4j-api,mybatis是不会输出日志的,必须要配置slf4j才可以.

<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.6.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.6.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j-impl -->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>2.6.2</version>
</dependency>

Log4j2.0典型代码:

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
static Logger logger = LogManager.getLogger(Hello.class.getName());

Log4j的典型代码:

import org.apache.log4j.Logger;
private static Logger logger = Logger.getLogger(Test.class); 

Log4j2.0的典型配置文件:

<?xml version="1.0" encoding="UTF-8"?>  <configuration status="OFF">  <appenders>  <Console name="Console" target="SYSTEM_OUT">          <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>  </Console>  </appenders>  <loggers>  <root level="trace">  <appender-ref ref="Console"/>  </root>  </loggers>
</configuration>

slf4j典型代码(需要的jar包slf-api和slf-simple就够了):

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {final Logger logger = LoggerFactory.getLogger(Main.class);Integer t;Integer oldT;public void setTemperature(Integer temperature) {oldT = t;t = temperature;logger.error(" Temperature set to {}. Old temperature was {}. ", t,oldT);if (temperature.intValue() > 50) {logger.info(" Temperature has risen above 50 degrees. ");}}public static void main(String[] args) {Main wombat = new Main();wombat.setTemperature(1);wombat.setTemperature(55);}
}

二.Log4j系统三大部分

Log4j由三个重要的组成构成:日志记录器(Loggers),输出端(Appenders)和日志格式化器(Layout)。
level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定 义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。
appenderName就是指B日志信息输出到哪个地方。Log4j提供的appender有以下几种:

  • org.apache.log4j.ConsoleAppender(控制台),
  • org.apache.log4j.FileAppender(文件),
  • org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
  • org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
  • org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
    Log4j提供的layout有以下几种:
  • org.apache.log4j.HTMLLayout(以HTML表格形式布局),
  • org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
  • org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
  • org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

三.输出格式

  • %m 输出代码中指定的消息
  • %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
  • %r 输出自应用启动到输出该log信息耗费的毫秒数
  • %c 输出所属的类目,通常就是所在类的全名
  • %t 输出产生该日志事件的线程名
  • %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
  • %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
  • %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。

四.关于log4j官网

官网很重要,那里有原汁原味的log4j教程.

  • Build目录讲了各个jar包的作用;
  • Guidlines讲了log4j项目各成员的分工与职责;
  • StyleGuide描述了log4j的编程规范,详尽而美好,以后编程规范完全可以照抄这个;
  • RunTimeDependencies说log4j的对外依赖,主要是解析配置文件时,需要用到一些第三方库,比如解析yaml,xml,json等;

接下来就是用户手册了,用户手册不用全看,就看Configuration这一章就可以了,文档有pdf版可供下载。

java日志学习笔记相关推荐

  1. 可能是最全面的 Java G1学习笔记

    转载自 可能是最全面的 Java G1学习笔记 引子 最近遇到很多朋友过来咨询G1调优的问题,我自己去年有专门学过一次G1,但是当时只是看了个皮毛,因此自己也有不少问题.总体来讲,对于G1我有几个疑惑 ...

  2. 深入浅出 Java CMS 学习笔记

    转载自  深入浅出 Java CMS 学习笔记 引子 带着问题去学习一个东西,才会有目标感,我先把一直以来自己对CMS的一些疑惑罗列了下,希望这篇学习笔记能解决掉这些疑惑,希望也能对你有所帮助. 1. ...

  3. 转载:mongoDB java驱动学习笔记

    http://www.blogjava.net/watchzerg/archive/2012/09/22/388346.html mongoDB java驱动学习笔记 指定新mongo实例: Mong ...

  4. 尚学堂JAVA高级学习笔记_1/2

    尚学堂JAVA高级学习笔记 文章目录 尚学堂JAVA高级学习笔记 写在前面 第1章 手写webserver 1. 灵魂反射 2. 高效解析xml 3. 解析webxml 4. 反射webxml 5. ...

  5. Android(java)学习笔记176: 远程服务的应用场景(移动支付案例)

    一. 移动支付:       用户需要在移动终端提交账号.密码以及金额等数据 到 远端服务器.然后远端服务器匹配这些信息,进行逻辑判断,进而完成交易,返回交易成功或失败的信息给移动终端.用户提交账号. ...

  6. 黑马程序员Java教程学习笔记(五)

    学习视频:https://www.bilibili.com/video/BV1Cv411372m 如侵权,请私信联系本人删除 文章目录 黑马程序员Java教程学习笔记(五) 日期时间:Date.Sim ...

  7. java web学习笔记(持续更新)

    java web学习笔记 一.Java Web简介 二.认识Servlet 1.什么是Servlet? 2.请求路径 3.tomcat 4.Servlet的使用 三.Servlet简单应用 1.创建S ...

  8. Java NIO 学习笔记(三)----Selector

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  9. Java NIO学习笔记之图解ByteBuffer

    转载自 Java NIO学习笔记之图解ByteBuffer ByteBuffer前前后后看过好几次了,实际使用也用了一些,总觉得条理不够清晰. <程序员的思维修炼>一本书讲过,主动学习,要 ...

最新文章

  1. 网闸与防火墙的区别_网关和网闸、防火墙的区别?
  2. Swift for循环:用于索引,数组中的元素?
  3. asp.net Web API 身份验证 不记名令牌验证 Bearer Token Authentication 简单实现
  4. SMTP 通过 ssh 通道发送垃圾邮件
  5. python怎么读文件后删去空格以行为单位进行排序-文件操作
  6. C 语言Hello world
  7. 深圳市灯谜学会的近三百条“深圳原创灯谜”引的市民激智抢麦
  8. Vue-router(二) 子路由(嵌套路由)
  9. 通过反射突破private访问修饰符获取私有和公共的属性,设置和获取值
  10. python123测验9程序题答案_Django ORM 练习题及答案_python_脚本之家
  11. SpaceVim 1.1.0 发布,模块化 Vim IDE
  12. Vsphere日记01.ESXi5.5.install
  13. qt emit是什么意思_2020年12月12日 无赞赏QT吗哪 :如天上的星星永远发光的信仰...
  14. 六度分离 弗洛伊德算法
  15. 抖音浏览量的作用是什么?
  16. 怎么选聚氨酯减震弹簧万向轮
  17. 题目 1180: 不容易系列
  18. VS2019调试功能学习
  19. A* 流程+代码详细注释
  20. oracle清理aud问来哦,咨询下oracle11gr2清理aud的问题

热门文章

  1. 如何提高强化学习的可靠性?
  2. 一年过去了,25万月薪的AI工程师还存在吗?
  3. 最短路问题的原始对偶算法形式
  4. 神经网络支持大脑是「预测机器」,预测是节能的
  5. 清华本科、港科大准博士被指论文抄袭,网友:这是有技巧的“洗稿”
  6. 数字孪生等前沿技术,将如何解码未来交通?
  7. “期待已久的UFO报告”公布了
  8. A股光刻胶飙涨背后:仅一家可供应高端光刻胶
  9. 生物,AI,心理:目前的大脑/认知/意识/AGI/DRL模型
  10. MEMS传感器科普文