日志框架之LOG4J
LOG4J
Log4j是Apache下的一款开源的日志框架,使用 Log4J,可以控制日志信息输出到控制台、文件、甚至是数据库中。也可以控制每一条日志的输出格式,通过定义日志的输出级别,可以更灵活的控制日志的输出过程以及方便项目的调试。
LOG4J的构成
Log4J主要由 Loggers (日志记录器)、Appenders(输出端)和 Layout(日志格式化器)组成。
Loggers控制日志的输出级别与日志是否输出
Appenders 指定日志的输出方式(输出到控制台、文件等)
Layout 控制日志信息的输出格式
Loggers
日志记录器,负责收集处理日志记录,实例的命名就是类的全限定名
Logger的名字大小写敏感,其命名有继承机制:如:name为org.apache.commons的logger会继承name为org.apache的logger。
Log4J中有一个特殊的logger叫做“root”,是所有logger的根,其他所有的logger都会直接或者间接地继承自root。root logger可以用Logger.getRootLogger()方法获取。
Appenders
Appender用来指定日志输出的目的地,可以同时指定日志的输出目的地。
常用输出目的地:
ConsoleAppender 将日志输出到控制台
FileAppender 将日志输出到文件中
DailyRollingFileAppender 将日志输出到一个日志文件,并且每天输出到一个新的文件
RollingFileAppender 将日志信息输出到一个日志文件,并且指定文件的尺寸,当文件大小达到指定尺寸时,会自动把文件改名,同时产生一个新的文件
JDBCAppender 把日志信息保存到数据库中
Layouts
布局器 , Layouts用于控制日志输出内容的格式,可以使用各种需要的格式输出日志。
常用的Layouts
HTMLLayout 格式化日志输出为HTML表格形式
.xml.XMLLayout 格式化日志输出为XML形式
SimpleLayout 简单的日志输出格式化,打印的日志格式为(info - message)
PatternLayout最强大的格式化期,可以根据自定义格式输出日志,如果没有指定转换格式,就是用默认的转换格式
LOG4J的使用
引入依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
使用类默认配置
直接使用不指定log4j相关配置
@Test
public void test() {
//获取日志记录器对象
Logger logger = Logger.getLogger(Log4j.class);
//日志记录输出
logger.info("hello log4j");
}
由于没有指定log4j的相关配置出现警告,日志无法正常使用
log4j:WARN No appenders could be found for logger (cn.ybzy.Log4j).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
指定类初始化log4j的相关配置
@Test
public void test() {
//不使用配置文件,类初始化默认配置信息
BasicConfigurator.configure();
//获取日志记录器对象
Logger logger = Logger.getLogger(Log4j.class);
//日志记录输出
logger.info("hello log4j");
}
0 [main] INFO cn.ybzy.Log4j - hello log4j
使用log4j配置文件
log4j.properties
#指定日志级别:trace 使用的appender为console (自定义appender名称console)
log4j.rootLogger=trace,console
#指定控制台日志输出的ConsoleAppender
log4j.appender.console=org.apache.log4j.ConsoleAppender
#指定日志输出的格式
log4j.appender.console.layout=org.apache.log4j.SimpleLayout
log4j会到resources资源目录加载log4j.properties配置文件
@Test
public void test() {
Logger logger = Logger.getLogger(Log4j.class);
logger.info("hello log4j");
}
INFO - hello log4j
自定义Logger
#指定日志的输出级别与输出端
log4j.rootLogger=trace
# 自定义logger对象设置
log4j.logger.cn.ybzy = warn,console
#指定控制台日志输出的ConsoleAppender
log4j.appender.console=org.apache.log4j.ConsoleAppender
#指定Layouts日志格式为PatternLayout
log4j.appender.console.layout=org.apache.log4j.SimpleLayout
@Test
public void test() {
Logger logger = Logger.getLogger(Log4j.class);
logger.fatal("fatal");
logger.error("error");
logger.warn("warn");
logger.info("info");
logger.debug("debug");
logger.trace("trace");
}
FATAL - fatal
ERROR - error
WARN - warn
log4j内置日志记录
@Test
public void test() {
//开启log4j内置日志记录
LogLog.setInternalDebugging(true);
Logger logger = Logger.getLogger(Log4j.class);
logger.info("hello log4j");
}
log4j: Trying to find [log4j.xml] using context classloader sun.misc.Launcher$AppClassLoader@18b4aac2.
log4j: Trying to find [log4j.xml] using sun.misc.Launcher$AppClassLoader@18b4aac2 class loader.
log4j: Trying to find [log4j.xml] using ClassLoader.getSystemResource().
log4j: Trying to find [log4j.properties] using context classloader sun.misc.Launcher$AppClassLoader@18b4aac2.
log4j: Using URL [file:/C:/Users/JackChen/Desktop/%e4%bb%a3%e7%a0%81/log4j_demo/target/classes/log4j.properties] for automatic log4j configuration.
log4j: Reading configuration from URL file:/C:/Users/JackChen/Desktop/%e4%bb%a3%e7%a0%81/log4j_demo/target/classes/log4j.properties
log4j: Parsing for [root] with value=[trace,console].
log4j: Level token is [trace].
log4j: Category root set to TRACE
log4j: Parsing appender named "console".
log4j: Parsing layout options for "console".
log4j: End of parsing for "console".
log4j: Parsed "console" options.
log4j: Finished configuring.
INFO - hello log4j
LOG4J的日志级别
日志级别从高到低:
fatal 指出每个严重的错误事件将会导致应用程序的退出。
error 指出虽然发生错误事件,但仍然不影响系统的继续运行。
warn 表明会出现潜在的错误情形。
info 一般和在粗粒度级别上,强调应用程序的运行全程。
debug 一般用于细粒度级别上,对调试应用程序非常有帮助。
trace 是程序追踪,可以用于输出程序运行中的变量,显示执行的流程。
两个特殊级别:
OFF 可用来关闭日志记录。
ALL 启用所有消息的日志记录。
@Test
public void test() {
//不使用配置文件,类初始化默认配置信息
BasicConfigurator.configure();
//获取日志记录器对象
Logger logger = Logger.getLogger(Log4j.class);
/**
* 日志级别
* 默认日志级别:debug
*
* fatal: 严重错误,一般会造成系统崩溃并终止运行
* error: 错误信息,不会影响系统运行
* warn: 警告信息,可能会发生问题
* info: 运行信息,数据连接、网络连接、IO操作等
* debug: 调试信息,一般在开发中使用,记录程序变量参数传递信息等
* trace: 追踪信息,记录程序所有的流程信息
*/
logger.fatal("fatal");
logger.error("error");
logger.warn("warn");
logger.info("info");
logger.debug("debug");
logger.trace("trace");
}
0 [main] FATAL cn.ybzy.Log4j - fatal
2 [main] ERROR cn.ybzy.Log4j - error
2 [main] WARN cn.ybzy.Log4j - warn
2 [main] INFO cn.ybzy.Log4j - info
2 [main] DEBUG cn.ybzy.Log4j - debug
Layout的格式化
格式化日志信息,具体占位符及其含义:
%m 输出代码中指定的日志信息
%p 输出优先级,及 DEBUG、INFO 等
%n 换行符
%r 输出自应用启动到输出该 log 信息耗费的毫秒数
%c 输出打印语句所属的类的全名
%t 输出产生该日志的线程全名
%d 输出服务器当前时间,默认为 ISO8601,也可以指定格式,如:%d{yyyy-MM-dd-HH:mm:ss}
%l 输出日志时间发生的位置,包括类名、线程、及在代码中的行数。如:cn.ybzy.Log4j.test(Log4j.java:16)
%F 输出日志消息产生时所在的文件名称
%L 输出代码中的行号
%% 输出一个 "%" 字符
在 % 与字符之间加上修饰符来控制最小宽度、最大宽度和文本的对其方式
%5c 输出category名称,最小宽度是5,category<5,默认的情况下右对齐
%-5c 输出category名称,最小宽度是5,category<5,"-"号指定左对齐,会有空格
%.5c 输出category名称,最大宽度是5,category>5,就会将左边多出的字符截掉,<5不会有空格
%20.30c category名称<20补空格,并且右对齐,>30字符,就从左边交远销出的字符截掉
测试
#指定日志的输出级别与输出端
log4j.rootLogger=trace,console1
#指定控制台日志输出的ConsoleAppender
log4j.appender.console1=org.apache.log4j.ConsoleAppender
#指定Layouts日志格式为PatternLayout
log4j.appender.console1.layout=org.apache.log4j.PatternLayout
#指定日志内容的格式
log4j.appender.console1.layout.ConversionPattern=[%t] %-5p %d %l - %m%n
[main] INFO 2021-03-21 11:58:36,487 cn.ybzy.Log4j.test(Log4j.java:16) - hello log4j
Appender的输出
控制台的输出
#指定日志的输出级别与输出端
log4j.rootLogger=trace,console1
#指定控制台日志输出的ConsoleAppender
log4j.appender.console1=org.apache.log4j.ConsoleAppender
#指定Layouts日志格式为PatternLayout
log4j.appender.console1.layout=org.apache.log4j.PatternLayout
#指定日志内容的格式
log4j.appender.console1.layout.ConversionPattern=[%t] %-5p %d %l - %m%n
文件的输出
普通的文件输出
#指定日志的输出级别与输出端
log4j.rootLogger=trace,file
# 日志文件输出的FileAppender对象
log4j.appender.file = org.apache.log4j.FileAppender
# 指定消息格式 layout
log4j.appender.file.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.file.layout.conversionPattern = [%-6p]%r %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
# 指定日志文件保存路径
log4j.appender.file.file = d:/log4j.log
# 指定日志文件的字符集
log4j.appender.file.encoding = UTF-8
按照文件大小拆分
#指定日志的输出级别与输出端
log4j.rootLogger=trace,rollingFile
# 按照文件大小拆分的RollingFileAppender对象
log4j.appender.rollingFile = org.apache.log4j.RollingFileAppender
# 指定消息格式 layout
log4j.appender.rollingFile.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.rollingFile.layout.conversionPattern = [%p]%r %l %d{yyyy-MM-dd HH:mm:ss} %m%n
# 指定日志文件保存路径
log4j.appender.rollingFile.file = d:/log4j.log
# 指定日志文件的字符集
log4j.appender.rollingFile.encoding = UTF-8
# 指定日志文件内容的大小
log4j.appender.rollingFile.maxFileSize = 1MB
# 指定日志文件的数量
log4j.appender.rollingFile.maxBackupIndex = 10
按照时间规则拆分
#指定日志的输出级别与输出端
log4j.rootLogger=trace,dailyFile
# 按照时间规则拆分的DailyRollingFileAppender对象
log4j.appender.dailyFile = org.apache.log4j.DailyRollingFileAppender
# 指定消息格式 layout
log4j.appender.dailyFile.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.dailyFile.layout.conversionPattern = [%t] %-5p %d %l - %m%n
# 指定日志文件保存路径
log4j.appender.dailyFile.file = d:/log4j.log
# 指定日志文件的字符集
log4j.appender.dailyFile.encoding = UTF-8
# 指定日期拆分规则
log4j.appender.dailyFile.datePattern = '.'yyyy-MM-dd-HH-mm-ss
数据库的输出
创建表
CREATE TABLE `log` (
`log_id` int(11) NOT NULL AUTO_INCREMENT,
`create_date` varchar(255) DEFAULT NULL COMMENT '创建时间',
`level` varchar(255) DEFAULT NULL COMMENT '优先级',
`category` varchar(255) DEFAULT NULL COMMENT '所在类的全名',
`file_name` varchar(255) DEFAULT NULL COMMENT '输出日志消息产生时所在的文件名称 ',
`thread_name` varchar(255) DEFAULT NULL COMMENT '日志事件的线程名',
`line` varchar(255) DEFAULT NULL COMMENT '号行',
`all_category` varchar(255) DEFAULT NULL COMMENT '日志事件的发生位置',
`message` varchar(4000) DEFAULT NULL COMMENT '输出代码中指定的消息',
PRIMARY KEY (`log_id`)
);
配置log4j.properties
#指定日志的输出级别与输出端
log4j.rootLogger=trace,saveDB
log4j.appender.saveDB=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.saveDB.layout=org.apache.log4j.PatternLayout
log4j.appender.saveDB.Driver=com.mysql.jdbc.Driver
log4j.appender.saveDB.URL=jdbc:mysql://localhost:3306/demo
log4j.appender.saveDB.User=root
log4j.appender.saveDB.Password=123456
log4j.appender.saveDB.Sql=INSERT INTO log(create_date,level,category,file_name,thread_name,line,all_category,message) values('%d{yyyy-MM-dd HH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')
执行测试后查看
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/137069.html