Log4j 入门教程
简介
Log4J 是 Apache 的一个开源项目,通过在项目中使用 Log4J,我们可以控制日志信息输出到控制台、文件、GUI 组件、甚至是数据库中。我们可以控制每一条日志的输出格式,通过定义日志的输出级别,可以更灵活的控制日志的输出过程。方便项目的调试。
为什么要使用日志
开发阶段发现程序的问题, 排除错误, 产品阶段, 可以记录系统运行的一些状态信息, 程序运行的状态;
System.out.println的局限性
- 不能在运行时打开或者关闭;
- 不能选择包或者类 , 在运行的时候打开或者关闭;
- 输出的信息没有分级;
- 只能输出文本信息;
- 不能改变输出位置;
组成
Log4J 主要由 Loggers (日志记录器)、Appenders(输出端)和 Layout(日志格式化器)组成。其中 Loggers 控制日志的输出级别与日志是否输出;Appenders 指定日志的输出方式(输出到控制台、文件等);Layout 控制日志信息的输出格式。
日志级别
注:一般只使用4个级别,优先级从高到低为 ERROR > WARN > INFO > DEBUG
Log4J 在 org.apache.log4j.Level 类中定义了OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、ALL八种日志级别。
级别 |
说明 |
---|---|
OFF |
为最高级别, 用于关闭所有日志信息的输出 |
FATAL |
指出严重的错误, 这些错误将会导致系统终止运行 |
ERROR |
指出发生的不影响系统继续运行的错误信息 |
WARN |
输出潜在的有可能出错的情形, 也就是输出警告信息 |
INFO |
一般和在粗粒度级别上, 强调应用程序的运行全程 |
DEBUG |
一般用于细粒度级别上, 对调试应用程序非常有帮助 |
TRACE |
指定细粒度比DEBUG更低的信息事件 |
ALL |
最低等级, 用于打开所有日志信息的输出 |
核心规则: Log4j 只会输出级别大于或者等于指定级别的信息 ;
Appender(输出端)
Appender 用来指定日志输出到哪个地方,可以同时指定日志的输出目的地。
类型 |
说明 |
---|---|
ConsoleAppender |
将日志输出到控制台 |
FileAppender |
将日志输出到文件中 |
DailyRollingFileAppender |
将日志输出到一个日志文件,并且每天输出到一个新的文件 |
RollingFileAppender |
将日志信息输出到一个日志文件,并且指定文件的尺寸,当文件大 小达到指定尺寸时,会自动把文件改名,同时产生一个新的文件 |
JDBCAppender |
把日志信息保存到数据库中 |
Layout(日志格式化器)
Layout 负责格式化不同风格的日志信息 。
类型 |
说明 |
---|---|
HTMLLayout |
格式化日志输出为HTML表格形式 |
SimpleLayout |
简单的日志输出格式化,打印的日志格式为(info - message) |
PatternLayout |
最强大的格式化期,可以根据自定义格式输出日志,如果没有指定转换格式,就是用默认的转换格式 |
TTCCLayout |
日志产生的时间 , 线程 , 类别等等信息 |
properties文件配置
配置根Logger
配置根Logger,语法为:
log4j.rootLogger = [ level ] , appenderName , appenderName ……
注意 :
- 日志级别虽然罗列了很多级别 , 但log4j推荐只使用四个级别 , 优先级从高到低分别是ERROR , WARN , INFO , DEBUG ;
- appenderName指的是日志输出的地址 , 可以同时指定n个 ;
配置日志输出的目的地Appender
配置日志输出的目的地Appender以及每个输出文件的各项属性,语法为:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
注意 : log4j中提供的appender有以下几种 :
- org.apache.log4j.ConsoleAppender(控制台) ;
- org.apache.log4j.FileAppender(文件) ;
- org.apache.log4j.DailyRollingFileAppender(按照一定的频度滚动产生日志记录文件 , 默认每天产生一个文件) ;
- org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件) ;
- org.apache.log4j.WriterAppender(将日志信息以流格式发送到指定的位置) ;
配置日志信息的格式或者布局layout
配置日志信息的格式或者布局layout以及布局的各项属性,语法为:
log4j.appender.appenderName.layout = fully.qualified.name.of.appender.class
log4j.appender.appenderName.layout.option1 = value
注意: log4j中提供的layout有以下几种 :
- org.apache.log4j.HTMLLayout(以HTML表格形式布局) ;
- org.apache.log4j.PatternLayout(可以灵活的指定布局模式 , 需要配置layout.ConversionPattern属性) ;
- org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串) ;
- org.apache.log4j.TTCCLayout(包含日志产生的时间 , 线程 , 类别等等信息) ;
控制台选项
- log4j.appender.appenderName.Threshold = error 用法: rootLogger里配置debug,然后某个文件专门存储error以及更高级别的错误信息,那么就在这个配置这个文件的时候指定Threshold属性为error;
- log4j.appender.appenderName.ImmediateFlush=true 用法: 默认值是true,意味着所有的消息都会被立即输出, false则是不输出;
- log4j.appender.appenderName.target=System.out 用法: 默认值为System.out, 输出到控制台, 还可以取值System.err, 当做错误信息输出, 输出的信息全部为红色;
- log4j.appender.appenderName.File=../../../../logs/log.appenderName.txt 用法: 指定日志输出到指定位置, 用的是相对于配置文件根目录的相对路径;
- log4j.appender.appenderName.File.Append=true 用法: 默认值是true, 即将消息追加到指定文件中, 如果取值为false, 则会覆盖之前的日志内容;
- log4j.appender.appenderName.MaxFileSize=20MB 用法: 后缀可以是KB, MB, GB, 当日志文件的大小到达指定大小后, 将会自动滚动, 即将原来的内容移到fileName.1文件中, 用记事本打开该文件即可看到原来的内容, 改属性只能在 appender=org.apache.log4j.RollingFileAppender 时使用;
- log4j.appender.appenderName.MaxBackupIndex=10 用法: 指定可以产生滚动文件的最大数量, 与RollingFileAppender和MaxFileSize属性一起使用, 当MaxBackupIndex=n的时候, 最大日志存在数量为n+1, 即log.txt, log.txt.1, …, log.txt.n, 当在服务器上运行的时候, 如果对日志数量没有限制, 那么随之时间的推移, 日志文件会越来越多, 占用的内存也将越来越多, 直到占满整个盘;
- log4j.appender.appenderName.DatePattern=’.’yyyy-MM-dd 用法: 该属性在 log4j.appender.appenderName=org.apache.log4j.DailyRollingFileAppender 时使用, DailyRollingFileAppender默认的频度是每天产生一个日志记录文件, 可以在DatePattern属性值中指定其他的频度, 常用的几个频度如下 :
- ‘.’yyyy-MM : 每月产生一个日志记录文件;
- ‘.’yyyy-ww : 每周产生一个日志记录文件;
- ‘.’yyyy-MM-dd : 每天产生一个日志记录文件;
- ‘.’yyyy-MM-dd-a : 每半天产生一个日志记录文件;
- ‘.’yyyy-MM-dd-HH : 每小时产生一个日志记录文件;
- ‘.’yyyy-MM-dd-HH-mm : 每分钟产生一个日志记录文件;
注意: 该属性指定值之后, 将会按照指定的频度来生成日志记录文件, 假设指定生成一个名为 log.txt 的文件, 频度指定为每分钟产生一个日志记录文件, 当达到指定频度后, 会将log.txt文件中记录的之前的日志记录, 重新写入一个名为 log.txt.yyyy-MM-dd-HH-mm的文件中, 而此时 log.txt 文件中存放的是新生成的日志信息, 该过程循环往复;
ConversionPattern参数
假设当前java文件名为Test , 所在包名为log4j :
%c
%c: 显示当前logger空间全称, 例如: log4j.Test; %c{层数}: 最内层的java文件为第一层, 例如: %c{1}, 显示为Test, 当层数大于实际存在的最大层数时, 显示最大实际存在层数;
%10c
%10c: 若名字空间长度小于10, 则在左边将欠缺的长度用空格补齐, 该种情况为默认的右对齐方式; %-10c: 若名字空间长度小于10, 则在右边将欠缺的长度用空格补齐, 该种情况为默认的左对齐方式;
%.3c
%.3c: 从空间名最右边开始显示指定的长度, 超出该长度的部分将被截取;
%10.15c
%10.15c: 若空间名长度小于10, 则左边将欠缺的长度用空格补齐, 若长度超过15, 则将多余部分截取; %-10.15c: 若空间名长度小于10, 则右边将欠缺的长度用空格补齐, 若长度超过15, 则将多余部分截取;
%d
%d: 显示日志记录时间, 默认时间格式为ISO8601定义的日期格式; %d{yyyy-MM-dd HH:mm:ss}: 按照指定的时间格式显示日期; %d{ABSOLUTE}: 22:15:30,076; %d{DATE}: 12 Oct 2018 22:15:30,076; %d{ISO8601}: 2018-07-20 22:23:30,076;
%F
%F: 显示调用logger的源文件名, 例如: Test.java;
%l
%l: 输出日志事件的发生位置, 包括类目名, 发生的线程, 以及在代码中的行数, 例如: log4j.log4jTest.main(log4jTest.java:40);
%m
%m: 显示输出消息;
%M
%M: 显示调用logger的方法名;
%n
%n: 换行符;
%p
%p: 显示该条目的优先级; 因为日志级别分别有error,warn,info,debug,fatal5种,有些是5个字母的,有些是4个字母的,如果直接写%p就会对不齐,%-5p的意思是日志级别输出左对齐,右边以空格填充,%5p的意思是日志级别输出右对齐,左边以空格填充
%r
%r: 显示从程序启动时到记录该条日志时已经经过的时间, 单位毫秒;
%t
%t: 显示产生该日志条目的线程名;
%x
%x: 按NDC(Nested Diagnostic Context, 线程堆栈): 顺序输出日志;
%X
%X: 按MDC(Mapped Diagnostic Context, 线程映射表)输出日志, 通常用于多个客户端连接同一个服务器, 方便服务器区分是哪个客户端访问留下来的日志;
%%
%%: 显示一个百分号;
<!-- ========================== 自定义输出格式说明================================ -->
<!-- %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL -->
<!-- %r 输出自应用启动到输出该log信息耗费的毫秒数 -->
<!-- %c 输出所属的类目,通常就是所在类的全名 -->
<!-- %t 输出产生该日志事件的线程名 -->
<!-- %n 输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n” -->
<!-- %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 -->
<!-- %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlo4.main(TestLog4.java:10) -->
<!-- ========================================================================== -->
<!-- ========================== 输出方式说明================================ -->
<!-- Log4j提供的appender有以下几种: -->
<!-- org.apache.log4j.ConsoleAppender(控制台), -->
<!-- org.apache.log4j.FileAppender(文件), -->
<!-- org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件), -->
<!-- org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件), -->
<!-- org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方) -->
<!-- ========================================================================== -->
LevelRangeFilter(分级过滤器)
如果想要实现不同级别的日志分别输出到不同的位置, 可以在properties配置文件中加入如下语句进行限制,例如:
log4j.appender.appenderName.Threshold=debug
log4j.appender.appenderName.filter.filterName=org.apache.log4j.varia.LevelRangeFilter
log4j.appender.appenderName.filter.filterName.LevelMin=debug
log4j.appender.appenderName.filter.filterName.LevelMax=debug
解释: 将最低输出级别LevelMin和最高输出级别LevelMax都设置为debug, 那么就只能输出debug级别的日志信息了;
- 1602: [Usaco2008 Oct]牧场行走
- 【LeetCode 500】关关的刷题日记27 Keyboard Row
- 1601: [Usaco2008 Oct]灌水
- 1657: [Usaco2006 Mar]Mooo 奶牛的歌声
- 1610: [Usaco2008 Feb]Line连线游戏
- 1012: [JSOI2008]最大数maxnumber
- 1430: 小猴打架
- 1202: [HNOI2005]狡猾的商人
- 1059: [ZJOI2007]矩阵游戏
- 3039: 玉蟾宫
- 大公司都有哪些开源项目之腾讯
- Vue拖拽组件开发实例
- 一小时培训之神经网络入门
- 【LeetCode 290】 关关的刷题日记28 Word Pattern
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- batch-compute & GPU分布式机器学习
- 数据源管理 | 搜索引擎框架,ElasticSearch集群模式
- PHP的CLI命令行运行模式浅析
- 基于Pytorch构建三值化网络TWN
- 从零学Paddle系列-1 Paddle框架CNN相关API详解
- 智能搜索模型预估框架的建设与实践
- 1,Jupyter NoteBook 常用魔法命令
- 60行代码徒手实现深度神经网络
- 30行代码徒手实现logistic回归
- 8,模型的训练
- 在腾讯云上部署科学计算软件Amber
- 手把手教你搭建一个灰度发布环境
- Kibana: 如何使用 Search Bar
- 「PHP」以nginx、php-cgi为例,把nginx、php-cgi安装为Windows系统服务
- 聊聊dubbo-go的GenericFilter