1、Log4j2的使用教程

1.1 简介

Log4j的1.x版本虽然已经被广泛使用于很多应用程序中,但由于出现内存泄漏等bug,代码难以维护,以及需要使用老版本的jdk等劣势,在2015年8月已经玩完。它的替代品,SLF4J,Logback,Log4j2对日志框架做了很多必要的改进。

历史上出现了很多的日记框架,如:

Log4j:Apache Log4j是一个基于Java的日志记录工具。它是由Ceki Gülcü首创的,现在则是Apache软件基金会的一个项目。 Log4j是几种Java日志框架之一。

Log4j2:Apache Log4j 2是apache开发的一款Log4j的升级产品。

Commons Logging:Apache基金会所属的项目,是一套Java日志接口,之前叫Jakarta Commons Logging,后更名为Commons Logging。

Slf4j:类似于Commons Logging,是一套简易Java日志门面,本身并无日志的实现。(Simple Logging Facade for Java,缩写Slf4j)。

Logback:一套日志组件的实现(Slf4j阵营)。

Jul(Java Util Logging):自Java1.4以来的官方日志实现。

1.2 安装

在开发中使用Log4j2日志记录框架需要引入的jar包如下:

log4j-api-2.13.0.jar
log4j-core-2.13.0.jar

这里使用Maven进行安装,pom.xml配置文件如下:

<properties><logging.log4j.version>2.13.0</logging.log4j.version>
</properties><dependencies><!-- Log4j2日志记录框架 --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>${logging.log4j.version}</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>${logging.log4j.version}</version></dependency>
</dependencies>

1.3 配置文件

在项目的src根目录下,创建log4j2.xml配置文件。配置信息如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- log4j2 配置文件 -->
<!-- 日志级别 trace<debug<info<warn<error<fatal -->
<configuration status="debug"><!-- 自定义属性 --><Properties><!-- 日志格式(控制台) --><Property name="pattern1">[%-5p] %d %c - %m%n</Property><!-- 日志格式(文件) --><Property name="pattern2">=========================================%n 日志级别:%p%n 日志时间:%d%n 所属类名:%c%n 所属线程:%t%n 日志信息:%m%n</Property><!-- 日志文件路径 --><Property name="filePath">logs/myLog.log</Property></Properties><appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="${pattern1}"/></Console><RollingFile name="RollingFile" fileName="${filePath}"filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz"><PatternLayout pattern="${pattern2}"/><SizeBasedTriggeringPolicy size="5 MB"/></RollingFile></appenders><loggers><root level="debug"><appender-ref ref="Console"/><appender-ref ref="RollingFile"/></root></loggers>
</configuration>

日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出。对于Loggers中level的定义同样适用。

下面是Appender配置,Appender可以理解为日志的输出目的地,这里配置了一个类型为Console的Appender,也就是输出到控制台。Console节点中的PatternLayout定义了输出日志时的格式。

Log4j提供的转换模式:

%m 输出代码中指定的消息。

%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。

%r 输出自应用启动到输出该log信息耗费的毫秒数。

%c 输出所属的类目,通常就是所在类的全名。

%t 输出产生该日志事件的线程名。

%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”。

%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,如:%d{dd MMM yyyy HH:mm:ss,SSS},输出类似:02 Nov 2012 14:34:02,781)。

%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数, 如:Testlog.main(TestLog.java:10)。

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

%L 输出代码中的行号。

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

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

最后是Logger的配置,这里只配置了一个Root Logger。

1.4 测试代码

public static void main(String[] args)
{Logger logger = LogManager.getLogger(LogFunction.class);logger.trace("trace level");logger.debug("debug level");logger.info("info level");logger.warn("warn level");logger.error("error level");logger.fatal("fatal level");
}

2、Log4j2配置文件log4j2.xml 详解

以下内容转载至:阿豪聊干货编写的《聊一聊 log4j2 配置文件 log4j2.xml》

2.1 配置全解

1. 关于配置文件的名称以及在项目中的存放位置

log4j 2.x版本不再支持像1.x中的.properties后缀的文件配置方式,2.x版本配置文件后缀名只能为".xml",".json"或者".jsn"。系统选择配置文件的优先级(从先到后)如下:

(1).classpath下的名为log4j2-test.json 或者log4j2-test.jsn的文件。

(2).classpath下的名为log4j2-test.xml的文件。

(3).classpath下名为log4j2.json 或者log4j2.jsn的文件。

(4).classpath下名为log4j2.xml的文件。

我们一般默认使用log4j2.xml进行命名。如果本地要测试,可以把log4j2-test.xml放到classpath,而正式环境使用log4j2.xml,则在打包部署的时候不要打包log4j2-test.xml即可。

2.缺省默认配置文件

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<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="error"><AppenderRef ref="Console" /></Root>
</Loggers>
</Configuration>

3.配置文件节点解析    

(1)根节点Configuration有两个属性:status和monitorinterval,有两个子节点:Appenders和Loggers(表明可以定义多个Appender和Logger)。

status用来指定log4j本身的打印日志的级别。

monitorinterval用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s。

(2)Appenders节点,常见的有三种子节点:Console、RollingFile、File。

Console节点用来定义输出到控制台的Appender。

        name:指定Appender的名字。

        target:SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认:SYSTEM_OUT。

        PatternLayout:输出格式,不设置默认为:%m%n。

File节点用来定义输出到指定位置的文件的Appender。

        name:指定Appender的名字。

        fileName:指定输出日志的目的文件带全路径的文件名。

        PatternLayout:输出格式,不设置默认为:%m%n。

RollingFile节点用来定义超过指定大小自动删除旧的创建新的的Appender。

        name:指定Appender的名字。

        fileName:指定输出日志的目的文件带全路径的文件名。

        PatternLayout:输出格式,不设置默认为:%m%n。

        filePattern:指定新建日志文件的名称格式。

        Policies:指定滚动日志的策略,就是什么时候进行新建日志文件输出日志。

        TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am。

        SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小。

        DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)。

(3)Loggers节点,常见的有两种:Root和Logger。

Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出。

        level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。

        AppenderRef:Root的子节点,用来指定该日志输出到哪个Appender。

Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。

        level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。

        name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点。

        AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity="false"只在自定义的Appender中进行输出。

(4)关于日志level。

共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。

        All:最低等级的,用于打开所有日志记录。

        Trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出。

        Debug:指出细粒度信息事件对调试应用程序是非常有帮助的。

        Info:消息在粗粒度级别上突出强调应用程序的运行过程。

        Warn:输出警告及warn以下级别的日志。

        Error:输出错误信息日志。

        Fatal:输出每个严重的错误事件将会导致应用程序的退出的日志。

        OFF:最高等级的,用于关闭所有日志记录。

程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少

4.比较完整的log4j2.xml配置模板

配置模板一:

<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="WARN" monitorInterval="30"><!--先定义所有的appender--><appenders><!--这个输出控制台的配置--><console name="Console" target="SYSTEM_OUT"><!--输出日志的格式--><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%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><!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--><RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log"filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log"><!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--><ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/><Policies><TimeBasedTriggeringPolicy/><SizeBasedTriggeringPolicy size="100 MB"/></Policies></RollingFile><RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log"filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log"><ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/><Policies><TimeBasedTriggeringPolicy/><SizeBasedTriggeringPolicy size="100 MB"/></Policies><!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 --><DefaultRolloverStrategy max="20"/></RollingFile><RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log"filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log"><ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/><Policies><TimeBasedTriggeringPolicy/><SizeBasedTriggeringPolicy size="100 MB"/></Policies></RollingFile></appenders><!--然后定义logger,只有定义了logger并引入的appender,appender才会生效--><loggers><!--过滤掉spring和mybatis的一些无用的DEBUG信息--><logger name="org.springframework" level="INFO"></logger><logger name="org.mybatis" level="INFO"></logger><root level="all"><appender-ref ref="Console"/><appender-ref ref="RollingFileInfo"/><appender-ref ref="RollingFileWarn"/><appender-ref ref="RollingFileError"/></root></loggers>
</configuration>

配置模板二:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN"><!--全局参数--><Properties><Property name="pattern">%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n</Property><Property name="logDir">/data/logs/dust-server</Property></Properties><Loggers><Root level="INFO"><AppenderRef ref="console"/><AppenderRef ref="rolling_file"/></Root></Loggers><Appenders><!-- 定义输出到控制台 --><Console name="console" target="SYSTEM_OUT" follow="true"><!--控制台只输出level及以上级别的信息--><ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout><Pattern>${pattern}</Pattern></PatternLayout></Console><!-- 同一来源的Appender可以定义多个RollingFile,定义按天存储日志 --><RollingFile name="rolling_file"fileName="${logDir}/dust-server.log"filePattern="${logDir}/dust-server_%d{yyyy-MM-dd}.log"><ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout><Pattern>${pattern}</Pattern></PatternLayout><Policies><TimeBasedTriggeringPolicy interval="1"/></Policies><!-- 日志保留策略,配置只保留七天 --><DefaultRolloverStrategy><Delete basePath="${logDir}/" maxDepth="1"><IfFileName glob="dust-server_*.log" /><IfLastModified age="7d" /></Delete></DefaultRolloverStrategy></RollingFile></Appenders>
</Configuration>

2.2 自定义配置文件位置

log4j2默认在classpath下查找配置文件,可以修改配置文件的位置。在非web项目中:

public static void main(String[] args) throws IOException
{File file = new File("D:/log4j2.xml");BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));final ConfigurationSource source = new ConfigurationSource(in);Configurator.initialize(null, source);Logger logger = LogManager.getLogger("mylog");
}

如果是web项目,在web.xml中添加:

<context-param><param-name>log4jConfiguration</param-name><param-value>/WEB-INF/conf/log4j2.xml</param-value>
</context-param><listener><listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
</listener>

推荐教程

推荐几篇我在网上找到的,写的很好的学习教程:

学习资料1:《详解log4j2(上) - 从基础到实战》

学习资料2:《详解log4j2(下) - Async/MongoDB/Flume Appender 按日志级别区分文件输出》

学习资料3:《聊一聊 log4j2 配置文件 log4j2.xml》

学习资料4:《Log4j2日志记录框架的使用教程与简单实例》

3、Log4j2的简单实例

(1)编写pom.xml配置文件,引入Log4j2的jar包文件,完整配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.pjb</groupId><artifactId>log4j2-demo</artifactId><version>1.0-SNAPSHOT</version><properties><logging.log4j.version>2.13.0</logging.log4j.version></properties><dependencies><!-- Log4j2日志记录框架 --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>${logging.log4j.version}</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>${logging.log4j.version}</version></dependency></dependencies></project>

(2)在项目的src根目录下,创建log4j2.xml配置文件。配置信息如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- log4j2 配置文件 -->
<!-- 日志级别 trace<debug<info<warn<error<fatal -->
<configuration status="debug"><!-- 自定义属性 --><Properties><!-- 日志格式(控制台) --><Property name="pattern1">[%-5p] %d %c - %m%n</Property><!-- 日志格式(文件) --><Property name="pattern2">=========================================%n 日志级别:%p%n 日志时间:%d%n 所属类名:%c%n 所属线程:%t%n 日志信息:%m%n</Property><!-- 日志文件路径 --><Property name="filePath">logs/myLog.log</Property></Properties><appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="${pattern1}"/></Console><RollingFile name="RollingFile" fileName="${filePath}"filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz"><PatternLayout pattern="${pattern2}"/><SizeBasedTriggeringPolicy size="5 MB"/></RollingFile></appenders><loggers><root level="debug"><appender-ref ref="Console"/><appender-ref ref="RollingFile"/></root></loggers>
</configuration>

(3)创建日志功能测试类(LogFunction.java)。

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;/*** 日志功能测试类* @author pan_junbiao**/
public class LogFunction
{public static void main(String[] args){Logger logger = LogManager.getLogger(LogFunction.class);logger.trace("trace level");logger.debug("debug level");logger.info("info level");logger.warn("warn level");logger.error("error level");logger.fatal("fatal level");}
}

执行结果:

Log4j2日志记录框架的使用教程与简单实例相关推荐

  1. JUnit5单元测试框架的使用教程与简单实例

    1.JUnit5的使用教程 1.1 简介 JUnit是一个Java语言的单元测试框架.它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最 ...

  2. TinyLog –轻量级Java日志记录框架教程

    TinyLog is a simple and lightweight logging framework for Java. We can use tinylog with Java, Kotlin ...

  3. apache log4j_Apache log4j是领先的日志记录框架

    apache log4j 根据 零周转的调查中, Apache log4j是领先的Java日志记录框架. 这实际上是一个非常有趣的调查. 它显示SLF4J最常用作伐木外墙,占61%. 但是,它似乎最常 ...

  4. Apache log4j是领先的日志记录框架

    根据 从零周转开始的调查中, Apache log4j是领先的Java日志记录框架. 这实际上是一个非常有趣的调查. 它显示SLF4J最常用作伐木外墙,占61%. 但是,它似乎最常与Apache Lo ...

  5. asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程...

    最近在学习张善友老师的NanoFabric 框架的时了解到Exceptionless : https://exceptionless.com/ !因此学习了一下这个开源框架!下面对Exceptionl ...

  6. Net Core平台灵活简单的日志记录框架NLog+Mysql组合初体验

    Net Core平台灵活简单的日志记录框架NLog初体验 前几天分享的"[Net Core集成Exceptionless分布式日志功能以及全局异常过滤][https://www.cnblog ...

  7. Net Core平台灵活简单的日志记录框架NLog+SqlServer初体验

    Net Core平台灵活简单的日志记录框架NLog+SqlServer初体验 前几天分享的"[Net Core平台灵活简单的日志记录框架NLog+Mysql组合初体验][http://www ...

  8. 如何配置log4j2日志记录至数据库

    log4j2可灵活的将日志打印在控制台.通过SMTP邮件发送.记录至文件.保存至数据库.本文介绍如何配置log4j2将日志记录至数据库 建立用于保存日志的数据库表: CREATE TABLE `sys ...

  9. 使用log4j记录日志_使用log4j2免费分配日志记录

    使用log4j记录日志 介绍 最近,我正在为一个客户端工作,试图为大型精心制作的Java系统消除一些GC暂停. 经过分析后,我意识到大部分垃圾都是通过日志记录产生的! 是否有一种简单的方法来删除所有分 ...

最新文章

  1. 10个linux awk文本处理经典案例,关于AWK的10个经典案例
  2. 阿里巴巴2018年纳税516亿元,稳居行业第一名,大家怎么看?
  3. K-Means算法的10个有趣用例
  4. 【OpenGL从入门到精通(一)】Windows搭建OpenGL的渲染环境,并初始化一个OPenGL窗口
  5. HistCite 的使用方法
  6. docker卸载 windows版本_DevOps系列 006 - Docker安装
  7. Windows编译环境搭建(VS2010)
  8. 【C++ STL】priority_queue自定义排序函数
  9. 2016021902 - linux解压缩命令
  10. java生成word带多级标题,word文档怎样设置自动生成多级标题
  11. JAVA编译器的作用
  12. 数据挖掘第三版课后习题
  13. 推荐16个国外的源码下载网站
  14. Hadoop原理简介
  15. Win32窗口--XBox游戏手柄--C++--方向轮和按键捕获
  16. 圣天诺LDK能做什么?
  17. 线性代数学习之线性系统
  18. android 以太网(ethernet)获取静态信息和动态信息.IP.子网掩码.getaway(以太网 一)
  19. CISCO ASA5520 与SMTP问题
  20. android动态唤醒网络,如何使用局域网唤醒功能通过Android手机打开PC | MOS86

热门文章

  1. Codeforces Round #599 (Div. 2) B2. Character Swap (Hard Version)
  2. 如何快速不借用转换工具将FLV格式视频转换成MP4
  3. ADPRL - 近似动态规划和强化学习 - Note 1 - Introduction
  4. 两年多工作心得和体会
  5. App开发者如何选择移动广告平台1 - 开发者规模分析
  6. NepCTF2021一些web题目的总结与复现
  7. python处理微信消息导入excel_使用python读取excel中的数据,并重新写入到新的excel中...
  8. vba学习系列(2)--以文本存储的数字转为数字格式
  9. 中国世界500强数量首超美国,但别高兴得太早
  10. C++源文件到可执行程序