java日志(四)–jcl和log4j及log4j2使用

文章目录

  • java日志(四)--jcl和log4j及log4j2使用
    • 一、简介
    • 二、log4j
      • 2.1 官网地址
      • 2.2 主要jar包
      • 2.3 日志级别
      • 2.4 配置文件
      • 2.5 关键类
      • 2.6 测试
    • 三、log4j2
      • 3.1 官网地址
      • 3.2 主要jar包
      • 3.3 关键类
      • 3.4 日志级别
      • 3.5 log4j2配置文件
        • 3.5.1 Configuration结点
        • 3.5.2 Properties结点
        • 3.5.3 appender结点
        • 4.5.4 filter结点
        • 3.5.5 layout结点
        • 3.5.6 Loggers结点
        • 3.5.7 log4j2.xml配置文件示例
      • 3.6 java调用示例
    • 四、jcl
      • 4.1 官网地址
      • 4.2 主要jar包
      • 4.3 日志级别
      • 4.4 核心类或接口
      • 4.5 日志实现加载顺序

一、简介

这里介绍java日志框架另一类,jcl(commons-logging)、log4j、log4j2的使用。其中jcl是定义的一组通用日志接口,
log4j是日志的实现,log4j2也是日志的实现,log4j2对是对log4j的重写,功能更完善。

二、log4j

log4j是apache推出的日志实现,于2015年停止更新了,目前最新版本为1.2.17,下面进行简要介绍。

2.1 官网地址

http://logging.apache.org/log4j/1.2/manual.html

2.2 主要jar包

log4j包为日志的实现包,maven依赖如下:

<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>

2.3 日志级别

日志级别有:OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,源码查看org.apache.log4j.Level类

2.4 配置文件

log4j的配置文件为log4j.properties,放在src/main/resources目录下。包含rootLogger(配置日志级别和输出目的地)、
appender(输出目的地配置)、layout(日志格式)等。示例如下:

#设置日志级别和appender(日志输出地,可多个)
log4j.rootLogger=info,stdout,file#输出到控制台
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#日志格式
log4j.appender.stdout.layout.ConversionPattern=%d %l [%t] %p %m%n#输出到文件
#直接输出到文件
#log4j.appender.file=org.apache.log4j.FileAppender
#日志文件达到一定大小时生产新文件
#log4j.appender.file=org.apache.log4j.RollingFileAppender
#每天产生新的日志文件
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=log4jStudy.log
log4j.appender.file.Threshold=warn
log4j.appender.file.layout=org.apache.log4j.PatternLayout
#日志格式
log4j.appender.file.layout.ConversionPattern=%d %l [%t] %p %m%n##输出到邮箱,在此略过
#log4j.appender.email=org.apache.log4j.net.SMTPAppender
#
##输出到数据库,在此略过
#log4j.appender.db=org.apache.log4j.jdbc.JDBCAppender

备注,layout参数如下:

%d:日期;
%M:日志所在方法名;
%p:日志优先级;
%c:日志所在类;
%t:日志所在线程;
%l:日志所在的类、线程及所在的行数;
%m:消息;
%n:换行;

2.5 关键类

org.apache.log4j.Logger:日志类,可通知Logger.getLogger()方法获取实例。

2.6 测试

import org.apache.log4j.Logger;
public class Log4jMain {private static final Logger logger = Logger.getLogger(Log4jMain.class);public static void main(String[] args) {logger.trace("trace log");logger.debug("debug log");logger.info("info log");logger.warn("warn log");logger.error("error log");logger.fatal("fatal log", new Exception("fatal exception"));}
}

结果生成log4jStudy.log日志及控制台输出:

2018-12-23 21:46:58,881 com.dragon.study.log.Log4jMain.main(Log4jMain.java:18) [main] INFO info log
2018-12-23 21:46:58,889 com.dragon.study.log.Log4jMain.main(Log4jMain.java:19) [main] WARN warn log
2018-12-23 21:46:58,889 com.dragon.study.log.Log4jMain.main(Log4jMain.java:20) [main] ERROR error log
Disconnected from the target VM, address: '127.0.0.1:50263', transport: 'socket'
2018-12-23 21:46:58,889 com.dragon.study.log.Log4jMain.main(Log4jMain.java:21) [main] FATAL fatal log
java.lang.Exception: fatal exceptionat com.dragon.study.log.Log4jMain.main(Log4jMain.java:21)

三、log4j2

log4j2是对log4j的重写,性能更好。

3.1 官网地址

https://logging.apache.org/log4j/2.x/manual/index.html

3.2 主要jar包

log4j-api和log4j-core。maven依赖如下:

<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.9.1</version>
</dependency>
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.9.1</version>
</dependency>

3.3 关键类

org.apache.logging.log4j.Logger:日志记录类;
org.apache.logging.log4j.LogManager:日志类工厂,生成Logger实例;

3.4 日志级别

和log4j类似,日志级别有:OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,源码查看
org.apache.logging.log4j.Level

3.5 log4j2配置文件

log4j2配置文件通常为log4j2.xml和log4j2-test.xml,加载顺序为log4j2-test.xml>log4j2.xml。下面列出配置文件中的关键
结点。

3.5.1 Configuration结点

Configuration结点是最外层结点,如:

<!--status表示log4j2自身的日志打印级别,如trace会打印出log4j2加载、运行等信息, monitorinterval监控间隔,单位为秒-->
<Configuration status="trace" monitorinterval="6">
</Configuration>
3.5.2 Properties结点

定义变量,如:

<Properties><Property name="nowDate">%date{yyyy-MM-dd}</Property><Property name="logDir">${sys:catalina.home}/logs/</Property>
</Properties>
3.5.3 appender结点

appender结点定义日志输出目的地,官网地址:https://logging.apache.org/log4j/2.x/manual/appenders.html
常用的appender示例如下,解释请查看注释:

<!--日志输出到控制台-->
<Console name="consoleAppender" target="SYSTEM_OUT"><PatternLayout pattern="%date %logger %processId %threadId %method %class %file %highlight{%level} : %green{%msg} %n" />
</Console><!--日志写入文件中-->
<File name="fileAppender" fileName="log4j2Study_${date:yyyy-MM}.log"><PatternLayout pattern="%date %logger %level : %msg%n" />
</File><!--日志写入文件中,和fileAppender(File)类似,只是RandomAccessFile加入了buffer缓存,且该缓存不可删除 -->
<RandomAccessFile  name="randomFileAppender" fileName="log4j2_randomFileAppender.log"><PatternLayout pattern="%date %logger %level : %msg%n" />
</RandomAccessFile ><!--日志写入文件,根据自定义的滚动策略归档文件,filePattern定义日志文件归档格式-->
<RollingFile name="rollingFileAppender" fileName="log4j2_rollingFileAppender.log"filePattern="$${date:yyyy-MM}/%d{MM-dd-yyyy}-%i.log.gz"><PatternLayout pattern="%date %logger %level : %msg%n" /><!--定义滚动策略--><Policies><!--基于cron表达式触发归档--><CronTriggeringPolicy schedule="0 0 * * * ?"/><!--基于时间触发归档,与上文filePattern配合使用,当filePattern不符合时,就归档--><TimeBasedTriggeringPolicy /><!--基于文件大小触发归档--><SizeBasedTriggeringPolicy size="100 MB" /></Policies><!--默认日志保留7天--><DefaultRolloverStrategy max="7" /><!--log4j 2.5引入,可更精细地控制删除日志策略--><DefaultRolloverStrategy><!--同时满足下述条件,进行删除--><Delete><!--文件名符合.log.gz后缀--><IfFileName glob="*.log.gz" /><!--超过60天--><IfLastModified age="60d" /></Delete></DefaultRolloverStrategy>
</RollingFile><!--和RollingFile类似,只是加入了buffer缓存,且该缓存不可删除-->
<RollingRandomAccessFile></RollingRandomAccessFile><!--异步记录日志,配合其它appender使用,不单独使用-->
<Async name="fileAsync" ><AppenderRef ref="fileAppender" />
</Async><!--日志写入cassandra库中,具体配置在此略过,详情请查看官网-->
<Cassandra></Cassandra><!--日志写入jdbc库中,具体配置在此略过,详情请查看官网-->
<JDBC></JDBC><!--日志写入消息队列中,具体配置在此略过,详情请查看官网-->
<JMS></JMS><!--日志写入kafka消息队列中,具体配置在此略过,详情请查看官网-->
<Kafka></Kafka><!--日志写入nosql库中,具体配置在此略过,详情请查看官网-->
<NoSql></NoSql><!--日志写入邮件中,具体配置在此略过,详情请查看官网-->
<SMTP></SMTP><!--日志写入socket中,具体配置在此略过,详情请查看官网-->
<Socket></Socket><!--日志写入http中,具体配置在此略过,详情请查看官网-->
<Http></Http><!--日志重写,具体配置在此略过,详情请查看官网-->
<Rewrite></Rewrite>
4.5.4 filter结点

filter结点用于过滤日志,官网地址:https://logging.apache.org/log4j/2.x/manual/filters.html,
常用的过滤器如下几类,解析请查看注释

<!--每秒平均允许的日志事件数为16,最大等待处理日志数为100,onMatch和onMismatch的值可以为ACCEPT、DENY、NEUTRAL-->
<BurstFilter level="info" rate="16" maxBurst="100"  onMatch="NEUTRAL" onMismatch="DENY"  /><!--基于特定值org.apache.logging.log4j.ThreadContext值,对特定key设置特定的日志级别,这里key为ThreadContext中的key名-->
<DynamicThresholdFilter key="tcKey" defaultThreshold="info" onMatch="ACCEPT" onMismatch="DENY" ><!--这里key为ThreadContext中的value值--><KeyValuePair key="tcVal1" value="info" /><KeyValuePair key="tcVal2" value="error" />
</DynamicThresholdFilter><!--针对info(Message msg)类似方法过滤, 使用如:MapMessage mm = new MapMessage()-->
<MapFilter onMatch="ACCEPT" onMismatch="DENY" ><KeyValuePair key="mmKey1" value="mmVal1" /><KeyValuePair key="mmKey2" value="mmVal2" />
</MapFilter><!--针对info(Marker marker, String message)类似方法过滤,使用如:Marker mk = MarkerManager.getMarker("mk1")-->
<MarkerFilter marker="mk1" onMatch="ACCEPT" onMismatch="DENY" /><!--正则过滤器,根据正则表达式对合要求的日志记录执行过滤-->
<RegexFilter regex=".*or.*" onMatch="ACCEPT" onMismatch="DENY" /><!--基于特定值org.apache.logging.log4j.ThreadContext值过滤,operator为or时,表示可以匹配一项,否则为所有项都匹配-->
<ContextMapFilter onMatch="ACCEPT" onMismatch="DENY" operator="or"><!--这里key为ThreadContext中的key值,key为ThreadContext中的value值--><KeyValuePair key="tcKey" value="tcVal1" />
</ContextMapFilter><!--基于日志级别的过滤器-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" /><!--基于时间的过滤器,时间格式为:HH:mm:ss-->
<TimeFilter start="00:00:00" end="01:00:00" onMatch="ACCEPT" onMismatch="DENY" /><!--组合过滤器,内可包含多个过滤器-->
<Filters></Filters>

备注,对于onMatch和onMismatch中的值有:
ACCEPT:直接接受
DENY:直接拒绝
NEUTRAL:中立,不做处理,交由后面代码处理

3.5.5 layout结点

layout指定日志记录格式,官网地址为:https://logging.apache.org/log4j/2.x/manual/layouts.html,
常用格式如下:

变量名
%logger(简写:%c): 当前日志名称,如: Slf4jAndLogbackMain
%class(简写:%C): 日志调用所在类,如: com.dragon.study.log.Slf4jAndLogbackMain
%file(简写:%F): 日志调用所在文件,如: com.dragon.study.log.Log4j2Main Log4j2Main.java
%method(简写:%M): 日志所在方法,如: main
%thread(简写:%t): 日志调用所有线程序,如:main
%level(简写:%p): 日志级别,如:INFO
%date(简写:%d): 日期,如: 2018-12-15 21:40:12,890
%msg(简写:%m): 日志记录内容
%processId(简写:%pid): 进程号
%threadId(简写:%tid): 线程号
%exception(简写:%ex): 异常记录
%n : 行分隔宽度设置
%20logger:当字符数少于20个字符时,则左侧留空白;
%-20logger:当字符数少于20个字符时,则右侧留空白;
%.30logger:当字符数据大于30个时,则截断;显示设置
%highligth:突出显示
%green(%red、%blue、%white):字体显示为指定颜色
{length}可指定长度,如%logger{36}
3.5.6 Loggers结点

Loggers定义日志输出位置,可包含Logger结点和Root结点。示例如下:

<!--定义日志输出配置-->
<Loggers><!--控制指定包或类的日志输出(包括等级和目的地), additivity表示日志信息是否向上传递,false为不传递(即不重复打印)--><Logger name="com.dragon.study.log.test"  level="false" additivity="false"><AppenderRef ref="consoleAppender" /></Logger><!--全局日志级别为info--><Root level="info"><!--日志输出到控制台和文件中--><AppenderRef ref="consoleAppender" /><AppenderRef ref="fileAppender" /></Root>
</Loggers>
3.5.7 log4j2.xml配置文件示例
<?xml version="1.0" encoding="UTF-8"?>
<!--status表示log4j2自身的日志打印级别,如trace会打印出log4j2加载、运行等信息, monitorinterval监控间隔,单位为秒-->
<Configuration status="trace" monitorinterval="6"><!--定义变量--><Properties><Property name="nowDate">%date{yyyy-MM-dd}</Property><Property name="logDir">${sys:catalina.home}/logs/</Property></Properties><appenders><!--日志输出到控制台--><Console name="consoleAppender" target="SYSTEM_OUT"><PatternLayout pattern="%date %logger %processId %threadId %method %class %file %highlight{%level} : %green{%msg} %n" /></Console><!--日志写入文件中--><!--<File name="fileAppender" fileName="log4j2Study_${date:yyyy-MM-dd}.log">--><!--<PatternLayout pattern="%date %logger %level : %msg%n" />--><!--</File>--><!--日志写入文件,根据自定义的滚动策略归档文件,filePattern定义日志文件归档格式--><RollingFile name="rollingFileAppender" fileName="log4j2_rollingFileAppender.log"filePattern="$${date:yyyy-MM}/%d{MM-dd-yyyy}-%i.log.gz"><PatternLayout pattern="%date %logger %level : %msg%n" /><!--定义滚动策略--><Policies><!--基于cron表达式触发归档--><CronTriggeringPolicy schedule="0 0 * * * ?"/><!--基于时间触发归档,与上文filePattern配合使用,当filePattern不符合时,就归档--><TimeBasedTriggeringPolicy /><!--基于文件大小触发归档--><SizeBasedTriggeringPolicy size="100 MB" /></Policies><!--默认日志保留7天--><DefaultRolloverStrategy max="7" /><!--log4j 2.5引入,可更精细地控制删除日志策略--><DefaultRolloverStrategy><!--同时满足下述条件,进行删除--><Delete><!--文件名符合.log.gz后缀--><IfFileName glob="*.log.gz" /><!--超过60天--><IfLastModified age="60d" /></Delete></DefaultRolloverStrategy></RollingFile></appenders><!--定义日志输出配置--><Loggers><!--控制指定包或类的日志输出(包括等级和目的地), additivity表示日志信息是否向上传递,false为不传递(即不重复打印)--><Logger name="com.dragon.study.log.test"  level="false" additivity="false"><AppenderRef ref="consoleAppender" /></Logger><!--全局日志级别为info--><Root level="info"><!--日志输出到控制台和文件中--><AppenderRef ref="consoleAppender" /><AppenderRef ref="fileAppender" /></Root></Loggers>
</Configuration>

3.6 java调用示例

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.MarkerManager;
import org.apache.logging.log4j.message.MapMessage;public class Log4j2Main {private static final Logger logger = LogManager.getLogger(Log4j2Main.class);public static void main(String[] args) {//使用{}格式化logger.trace("{} log", "trace");logger.debug("debug log");logger.info("info log");logger.warn("warn log");logger.error("error log");logger.fatal("fatal log", new Exception("fatal exception"));//定义ThreadContext值,可用于在生产环境中,对指定用户或场景进行跟踪ThreadContext.put("tcKey", "tcVal1");logger.info("{} log", "info1");ThreadContext.put("tcKey", "tcVal2");logger.info("{} log", "info2");//MapFilter中使用MapMessage mm = new MapMessage();mm.put("mmKey1","mmVal1");mm.put("val","this info msg");logger.info(mm);//MarkerFilter中使用Marker mk = MarkerManager.getMarker("mk1");logger.info(mk,"info log by markerFilter");}
}

四、jcl

jcl(commons-logging)是apache推出的日志接口,日志的具体实现依赖于实际配置,这样可以分离接口和实现。

4.1 官网地址

https://commons.apache.org/proper/commons-logging/guide.html

4.2 主要jar包

commons-logging:jcl的api;
commons-logging-api: jcl的api及简单实现SimpleLog and NoOpLog;
commons-logging-adapters:jcl对于第三方实现的适配器;

4.3 日志级别

jcl默认有6个日志级别,即trace、debug、info、warn、error、fatal。

4.4 核心类或接口

org.apache.commons.logging.Log:日志记录接口,定义了各类日志记录方法;
org.apache.commons.logging.LogFactory:日志工厂类,用于生成日志实例;

4.5 日志实现加载顺序

具体日志实现加载顺序如下,没有则找下项:
a、在commoms-logging.properties中找org.apache.commons.logging.Log配置的值,其配置示例如:

#实现默认简单日志
#org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLogger#实现为指定Log4JLogger日志
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger

b、在系统变量中找org.apache.commons.logging.Log配置的值;
c、找log4j或log4j2;
d、使用jul;
e、使用自带的SimpleLog;
6、以log4j2日志实现示例
根据前文,添加log4j2配置(包括maven依赖和log4j2.xml配置文件),java调用示例如下:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;public class JclAndLog4j2Main {public static final Log log = LogFactory.getLog(JclAndLog4j2Main.class);public static void main(String[] args) {log.trace("trace log");log.debug("debug log");log.info("info log");log.warn("warn log");log.error("error log");log.fatal("fatal log", new Exception("fatal exception"));}
}

java日志(四)--jcl和log4j及log4j2使用相关推荐

  1. Java日志系统概述SLF4J、log4j、JCL、Logback

    java日志系统经常遇到SLF4j,JCL,logback,log4j2等等.一些人可能要晕了怎么选择,这里简单说下. 发展 这些都要从Java日志框架的元老log4j说起.java1.3之前打日志都 ...

  2. Java日志门面- JCL和 常用日志门面SLFJ详解

    使用日志门面的原因 目前经常用的日志框架技术有:JUL.Log4j.log4j2.logback用来记录日志信息 ,之前我们讲过,我们学习不同的日志框架.他们的API是不同的,这样难以进行有效的记忆, ...

  3. Java日志框架 -- JCL日志门面(JCL概念介绍、JCL示例)

    1. JCL 全称为Jakarta Commons Logging,是Apache提供的一个通用日志API.是日志门面的一种实现方式,另外一种日志门面的实现方式是Slf4j. 它是为 "所有 ...

  4. Java日志框架SLF4J和log4j以及logback的联系和区别

    1.SLF4J(Simple logging Facade for Java) 意思为简单日志门面,它是把不同的日志系统的实现进行了具体的抽象化,只提供了统一的日志使用接口,使用时只需要按照其提供的接 ...

  5. Java日志体系日志门面(Slf4j)日志实现(Log4j、Log4j2)详解

    1.背景 近日发生两次因日志使用不当导致的线上问题: 1.应用明明配置了info日志级别,却打印大量的debug日志,导致磁盘IO较高,很快就报磁盘空间不足告警 2.应用服务启动后报StackOver ...

  6. 一文讲尽门面日志slf4j和log4j、log4j2、logback依赖jar引用关系

    前言 之前都是使用SparkStreaming开发,最近打算学习一下Flink,就从官网下载了Flink 1.11,打算搞一个客户端,将程序提交在yarn上.因为Flink从1.7之后就不再提供Had ...

  7. java日志优雅打印格式_优雅编程之日志排查Log4j

    背景 程序开发调试中,不可缺少的便是日志管理,常用的日志管理框架有如下几种: Log4j:Apache Log4j是一个基于Java的日志记录工具.它是由Ceki Gülcü首创的,现在则是Apach ...

  8. Java 日志从入门到实战

    日志和异常处理结合得当的话,会给项目维护带来非常大的价值. **日志:**就是介绍一个过程和经历的详细记录. **项目日志:**就是项目开发过程的详细记录,一般由项目经理记录. **代码里的日志:** ...

  9. 深入掌握Java日志体系,再也不迷路了

    点赞再看,养成习惯,公众号搜一搜[一角钱技术]关注更多原创技术文章.本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 对于一个应用程序来说日志记录是必 ...

  10. java日志框架JUL、JCL、Slf4j、Log4j、Log4j2、Logback 一网打尽

    为什么程序需要记录日志 我们不可能实时的24小时对系统进行人工监控,那么如果程序出现异常错误时要如何排查呢?并且系统在运行时做了哪些事情我们又从何得知呢?这个时候日志这个概念就出现了,日志的出现对系统 ...

最新文章

  1. 面向对象解决了全局变量问题?
  2. Tips_方格拼图效果
  3. scrum 敏捷开发
  4. python文件对象提供了3个读方法、分别是-Python读写文件模式和文件对象方法实例详解...
  5. 8个高效的Python爬虫框架分享
  6. MySQL count函数的具体介绍
  7. js中document.referrer认识
  8. 下载android版趣步最新版,趣步下载2021安卓最新版_手机app官方版免费安装下载_豌豆荚...
  9. 下面不是mysql特性_下面( )不是MySQL的特性。_学小易找答案
  10. Leedcode4-sort listnode 归并排序
  11. android uber启动动画,仿 Uber 视频背景登录界面以及登录动画
  12. 自编码器(Auto-encoder) (下)它的应用
  13. angularjs 路由 异步加载js
  14. bootstrap table无法服务器分页_layui分页的大坑,RequestPayload和FormData
  15. mysql中的rman备份_oracle数据库 rman基本备份操作
  16. (189)FPGA变量初始化方法reg
  17. maria安装包mysql_Redhat 7.3安装系统自带Mariadb安装包
  18. 微信小程序开发学习5(自定义组件)
  19. Penetration_Testing_POC-About 渗透测试有关的POC、EXP、脚本、提权、小工具等
  20. Sql 学习查询多种条件(记录自己常用一些方法,本人学习用)

热门文章

  1. EXSI虚拟机备份—ikuai和OPenWRT
  2. uni-app实现微信与支付宝的境外支付
  3. 从 RTL 到 GDS :基于 OpenLANE
  4. 20189320《网络攻防》第二周作业
  5. 如何用PHP完整的开发一个网站?
  6. Python爬虫教程,采集bilibili弹幕并生成词云
  7. [CTO札记]新产品出现时,要‘耐得住寂寞,抗得住压力’
  8. 如何在 JavaScript 中使用SpreadJS导入和导出 Excel 文件
  9. ant man 什么意思_man是褒义娘就是贬义么?百雀羚真的敢说
  10. Android 自定义锁屏的实现