一.日志家族

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. Android(java)学习笔记233: 远程服务的应用场景(移动支付案例)

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

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

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

  3. Java IO学习笔记六:NIO到多路复用

    作者:Grey 原文地址:Java IO学习笔记六:NIO到多路复用 虽然NIO性能上比BIO要好,参考:Java IO学习笔记五:BIO到NIO 但是NIO也有问题,NIO服务端的示例代码中往往会包 ...

  4. Java IO学习笔记五:BIO到NIO

    作者:Grey 原文地址: Java IO学习笔记五:BIO到NIO 准备环境 准备一个CentOS7的Linux实例: 实例的IP: 192.168.205.138 我们这次实验的目的就是直观感受一 ...

  5. Java IO学习笔记七:多路复用从单线程到多线程

    作者:Grey 原文地址:Java IO学习笔记七:多路复用从单线程到多线程 在前面提到的多路复用的服务端代码中, 我们在处理读数据的同时,也处理了写事件: public void readHandl ...

  6. 20145213《Java程序设计学习笔记》第六周学习总结

    20145213<Java程序设计学习笔记>第六周学习总结 说在前面的话 上篇博客中娄老师指出我因为数据结构基础薄弱,才导致对第九章内容浅尝遏止地认知.在这里我还要自我批评一下,其实我事后 ...

  7. [原创]java WEB学习笔记95:Hibernate 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. java JDK8 学习笔记——助教学习博客汇总

    java JDK8 学习笔记——助教学习博客汇总 1-6章 (by肖昱) Java学习笔记第一章——Java平台概论 Java学习笔记第二章——从JDK到IDEJava学习笔记第三章——基础语法Jav ...

  9. java JDK8 学习笔记——第16章 整合数据库

    第十六章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API中的接口会有数据库厂商操作,称为JDBC驱动程 ...

随机推荐

  1. [Tool] Open Live Writer插件开发

    一 前言 Windows Live Writer(简称 WLW)开源之后变成 Open Live Writer(简称 OLW),原先 WLW 的插件在 OLW 下都不能用了,原因很简单,WLW 插件开 ...

  2. 【Java每日一题】20161226

    package Dec2016; public class Ques1226 { static{ num = 1; } public static int num = 2; public static ...

  3. GJM : Unity3D HIAR -【 快速入门 】 三、导入 SDK

    导入 SDK 本文将向您介绍如何在 Unity 工程中导入 HiAR SDK for Unity.在开始之前,请先访问 HiAR 官网下载最新版本的 SDK. 下载 HiAR SDK for Unit ...

  4. 5.6 JS中基本包装类型

    为了便于操作基本类型值,ES还提供了三种特殊的引用类型,即(基本包装类型):Number,String,Boolean.这三种类型与前面介绍的引用类型相似,但同时也拥有基本数据类型的一些特性. 平时经 ...

  5. JavaScript 常用代码

    未知对象 对象类型名称:xobject.constructor.name 对象成员键名:Object.keys(xobject) 枚举对象成员及其值:for(var propertyName in r ...

  6. ArcGIS Engine开发之书签加载

    ArcGIS中书签是保存特定视图范围的快捷方式.使用书签保存关注的视图范围,可在需要时快速定位.查看与浏览.书签功能主要用到IMapBookmarks.ISpatialBookmark和IAOIBoo ...

  7. 网络安全——Base64编码、MD5、SHA1-SHA512、HMAC(SHA1-SHA512)哈希

    据说今天520是个好日子,为什么我想起的是502.500.404这些?还好服务器没事! 一.Base64编码 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之 ...

  8. swift-运算符

    运算符:+ , - , * , / ,%, ++,-- OC和swiftch除了取模运算符,其他用法都一样 可以检测 //var num:UInt8 = 255 + 1 不可以检测 var num1: ...

  9. seL4环境配置

      转载声明:希望大家能够从这里收获知识之外,也能够体会到博主撰写博客的辛苦.个人博客势单力薄,对于强转甚至转载博客访问量高于原文的例子不在少数. 希望能够得到大家关注的同时,也能够稍微体谅一下博主的 ...

  10. Redis五种基本数据结构

    1.字符串 示例: 2.列表 示例: 3.集合 示例: 4.散列 示例: 5.有序集合 待续...