java日志(四)--jcl和log4j及log4j2使用
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使用相关推荐
- Java日志系统概述SLF4J、log4j、JCL、Logback
java日志系统经常遇到SLF4j,JCL,logback,log4j2等等.一些人可能要晕了怎么选择,这里简单说下. 发展 这些都要从Java日志框架的元老log4j说起.java1.3之前打日志都 ...
- Java日志门面- JCL和 常用日志门面SLFJ详解
使用日志门面的原因 目前经常用的日志框架技术有:JUL.Log4j.log4j2.logback用来记录日志信息 ,之前我们讲过,我们学习不同的日志框架.他们的API是不同的,这样难以进行有效的记忆, ...
- Java日志框架 -- JCL日志门面(JCL概念介绍、JCL示例)
1. JCL 全称为Jakarta Commons Logging,是Apache提供的一个通用日志API.是日志门面的一种实现方式,另外一种日志门面的实现方式是Slf4j. 它是为 "所有 ...
- Java日志框架SLF4J和log4j以及logback的联系和区别
1.SLF4J(Simple logging Facade for Java) 意思为简单日志门面,它是把不同的日志系统的实现进行了具体的抽象化,只提供了统一的日志使用接口,使用时只需要按照其提供的接 ...
- Java日志体系日志门面(Slf4j)日志实现(Log4j、Log4j2)详解
1.背景 近日发生两次因日志使用不当导致的线上问题: 1.应用明明配置了info日志级别,却打印大量的debug日志,导致磁盘IO较高,很快就报磁盘空间不足告警 2.应用服务启动后报StackOver ...
- 一文讲尽门面日志slf4j和log4j、log4j2、logback依赖jar引用关系
前言 之前都是使用SparkStreaming开发,最近打算学习一下Flink,就从官网下载了Flink 1.11,打算搞一个客户端,将程序提交在yarn上.因为Flink从1.7之后就不再提供Had ...
- java日志优雅打印格式_优雅编程之日志排查Log4j
背景 程序开发调试中,不可缺少的便是日志管理,常用的日志管理框架有如下几种: Log4j:Apache Log4j是一个基于Java的日志记录工具.它是由Ceki Gülcü首创的,现在则是Apach ...
- Java 日志从入门到实战
日志和异常处理结合得当的话,会给项目维护带来非常大的价值. **日志:**就是介绍一个过程和经历的详细记录. **项目日志:**就是项目开发过程的详细记录,一般由项目经理记录. **代码里的日志:** ...
- 深入掌握Java日志体系,再也不迷路了
点赞再看,养成习惯,公众号搜一搜[一角钱技术]关注更多原创技术文章.本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 对于一个应用程序来说日志记录是必 ...
- java日志框架JUL、JCL、Slf4j、Log4j、Log4j2、Logback 一网打尽
为什么程序需要记录日志 我们不可能实时的24小时对系统进行人工监控,那么如果程序出现异常错误时要如何排查呢?并且系统在运行时做了哪些事情我们又从何得知呢?这个时候日志这个概念就出现了,日志的出现对系统 ...
最新文章
- 面向对象解决了全局变量问题?
- Tips_方格拼图效果
- scrum 敏捷开发
- python文件对象提供了3个读方法、分别是-Python读写文件模式和文件对象方法实例详解...
- 8个高效的Python爬虫框架分享
- MySQL count函数的具体介绍
- js中document.referrer认识
- 下载android版趣步最新版,趣步下载2021安卓最新版_手机app官方版免费安装下载_豌豆荚...
- 下面不是mysql特性_下面( )不是MySQL的特性。_学小易找答案
- Leedcode4-sort listnode 归并排序
- android uber启动动画,仿 Uber 视频背景登录界面以及登录动画
- 自编码器(Auto-encoder) (下)它的应用
- angularjs 路由 异步加载js
- bootstrap table无法服务器分页_layui分页的大坑,RequestPayload和FormData
- mysql中的rman备份_oracle数据库 rman基本备份操作
- (189)FPGA变量初始化方法reg
- maria安装包mysql_Redhat 7.3安装系统自带Mariadb安装包
- 微信小程序开发学习5(自定义组件)
- Penetration_Testing_POC-About 渗透测试有关的POC、EXP、脚本、提权、小工具等
- Sql 学习查询多种条件(记录自己常用一些方法,本人学习用)