log4j

Log4j 是什么?

            Log4j Log for java 的简写。

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

Log4j 的版本

   当前有两个常用版本:

 

版本

稳定版本

核心jar

1.x

log4j-1.2.18.jar

log4j-1.2.18.jar

2.x

Log4j-x-2.1.jar

log4j-api-2.1.jar

log4j-core-2.1.jar

 

2.x 1.x的变化还是很大的,一些核心的API都做了些许的调整。

 

Log4j 组件

     Log4j由三个重要的组件构成: 日志信息的优先级(Loggers)、日志信息的输出目的地(Appdenders)、日志信息的输出格式(Layouts) 其中日志信息的优先级别从高到低有: OFFà FATALàERRORàWARNà

INFOàDEBUGàTRACEàALL,分别代表这条日志信息的重要程度。

         日志信息的输出目的地制定了日志将打印到控制台、文件或者数据库中。而输出格式则控制了日志信息的显示内容。

Log4j优先级(Loggers)

日志级别

1.x版本

2.x版本

OFF

Y

Y

FATAL

Y

Y

ERROR

Y

Y

WARN

Y

Y

INFO

Y

Y

DEBUG

Y

Y

TRACE

N

Y

ALL

Y

Y

 

其中OFF是关闭日志记录,ALL是开启所有级别的日志记录,不推荐使用OFFALL这两种日志级别。

OFF: 用户关闭日志记录。

FATAL: 系统发生严重错误,将会导致程序退出。

ERROR:系统发生错误,但是不影响系统的继续运行。

WARN: 警告,潜在的危险。

INFO: 程序的正常的输出信息,用于突出强调程序的运行过程。

DEBUG: 调试程序时的输出消息。

TRACE: 主要是输出调试时堆栈信息,一般使用debug模式替代。

ALL: 输出所有级别日志。

 

 2.x版本新添加了一个TRACE级别的日志信息。

 

Log4j 输出目的地(Appdenders)

Addenders也叫做Log4j的适配器

org.apache.log4j.ConsoleAppender (控制台)
org.apache.log4j.FileAppender
(文件)
org.apache.log4j.DailyRollingFileAppender
(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender
(文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender
(将日志信息以流格式发送到任意指定的地方)

 

Log4j 日志格式(Layouts)

org.apache.log4j.HTMLLayout (以HTML 表格形式布局),
org.apache.log4j.PatternLayout
(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout
(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout
(包含日志产生的时间、线程、类别等等信息)

 

如果使用PatternLayou布局就要指定的打印信息的具体格式ConversionPattern,打印参数如下:
%m
输出代码中指定的消息
%p
输出优先级,即DEBUGINFOWARNERRORFATAL
%r
输出自应用启动到输出该log信息耗费的毫秒数
%c
输出所属的类目,通常就是所在类的全名
%t
输出产生该日志事件的线程名
%n
输出一个回车换行符,Windows平台为“rn”,Unix平台为“n
%d
输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss,SSS},输出类似:20021018 221028921
%l
输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
[QC]
log信息的开头,可以为任意字符,一般为项目简称。

Log4j配置文件

Log4j 1.x 的配置文件主要有:

 log4j.properties

 log4j.xml

本例 主要以log4j.properties

#INFO表示日志级别,stdout,R表示日志适配器的别名

log4j.rootLogger=INFO, stdout , R

###################

# stdout Appender

###################

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=[QC]   %p [%t] %C.%M(%L) | %m%n

###################

# R Appender

###################

log4j.appender.R=org.apache.log4j.DailyRollingFileAppender

log4j.appender.R.File=D:\Tomcat   5.5\logs\qc.log

log4j.appender.R.layout=org.apache.log4j.PatternLayout

log4j.appender.R.layout.ConversionPattern=%d-[TS]   %p %t %c - %m%n

 Log4j 1.x 默认文件名为log4j 默认路径是src目录下(classpath根目录)

Log4j 2.x 的配置文件主要有以下格式:

log4j2.xml,log4j2.json log4j2.yaml(jsonyaml格式的没有搞懂,也没有见到过这种配置,主要是依据官方文档中的一段话)

Through a configuration file written in XML,JSON or YAML.

 

注意: 配置文件默认存放的目录是src,路径是classpath

默认的文件名有两个log4j2或者log4j2-test(json 文件可以简写成后缀名为jsn)

 

下面主要是以xml格式为例:

log4j2.xml

<?xml version="1.0"   encoding="UTF-8"?>

<configuration status="error">

    <!--先定义所有的appender-->

      <appenders>

        <!--这个输出控制台的配置,target是输出目的地-->

          <Console name="Console" target="SYSTEM_OUT">

              <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch-->

              <ThresholdFilter level="trace" onMatch="ACCEPT"   onMismatch="DENY"/>

              <!--这个都知道是输出日志的格式-->

              <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level   %class{36} %L %M - %msg%xEx%n"/>

          </Console>

        <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->

        <File   name="log" fileName="log/test.log"   append="false">

              <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36}   %L %M - %msg%xEx%n"/>

          </File>

 

        <!--这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档,这儿不知道是bug还是设定好的,每个目录下最多只能生成7个压缩文件,循环覆盖-->

          <RollingFile name="RollingFile"   fileName="log/app.log"

                       filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">

              <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z}   %-5level %class{36} %L %M - %msg%xEx%n"/>

              <SizeBasedTriggeringPolicy size="20MB"/>

          </RollingFile>

      </appenders>

    <!--然后定义logger,只有定义了logger并引入的appenderappender才会生效-->

      <loggers>

        <!--建立一个默认的rootlogger-->

        <root   level="trace">

              <appender-ref ref="RollingFile"/>

              <appender-ref ref="Console"/>

              <appender-ref ref="log"></appender-ref>

          </root>

      </loggers>

</configuration>

 

上面的xml配置文件的层级为:

<configuration>

<appenders></appenders>

<loggers>

   <root level=”日志级别”>

  <appender-ref  ref=”” />

</root>

</loggers>

</configuration>

 

首先分析appenders 节点:

<appdenders>

    <!--    Console控制台输出-- >

    <Console></Console>

    <!--    File文件输出-- >

    <File></File>

    <!--    固定大小文件输出-- >

    <RollingFile></RollingFile>

</appenders>

 

 

 

 

<appenders> 中可以定义很多的日志适配器,但是只有配置在<loggers><root>中,才会生效。

Log4j 编程

 

     上面罗嗦了那么多主要是为了铺垫,主要是在程序中的应用。下面分别介绍下log4j1.x log4j 2.x 的使用方法。

 

Log4j 1.x

/**

  Log4j 1.x的日志记录器

*/

Import org.apache.log4j.Logger;

 

 

/**

   申明一个日志记录常量

*/

Private static   final Logger LOGGER=Logger.getLogger(this.getClass());

 

 

/**

   使用INFO,DEBUG 日志之前需要做判断,是否是开启了该级别的日志记录,否则正式上线后,日志过多影响系统的性能

*/

If(LOGGER.isInfoEnabled()){

    LOGGER.info(“ this is a info message”);

}

If(LOGGER.isDebugEnabled()){

      LOGGER.debug(“this is a debug message”);

}

 

 

 

Log4j 2.x

/**

  Log4j 2.x的日志记录器,日志管理器

*/

import   org.apache.logging.log4j.LogManager;

Import org.apache.logging.log4j.Logger;

 

/**

   申明一个日志记录常量

*/

Private static   final Logger LOGGER= LogManager.getLogger(this.getClass());

 

/**

   使用INFO,DEBUG 日志之前需要做判断,是否是开启了该级别的日志记录,否则正式上线后,日志过多影响系统的性能

*/

if(LOGGER.isDebugEnabled())

{

    LOGGER.debug("this is a debug   message,my name is {}","King-pan");

}

if(LOGGER.isInfoEnabled())

{

    LOGGER.debug("this is a info   message,my age is {}","25");

}

 

注意: log4j 2.x 版本 在日志输出时,可以使用{}占位符来传入参数. 学过c的同学可以回想下printf方法。


你可能感兴趣的:(log4j,log4j2)