日志实现组件--log4j

log4j是Apache下开源的日志框架,可以控制日志信息输出到控制台、文件、数据库、发送到邮箱等,可以设置日志的输出格式,通过定义日志的输出级别控制日志的输出过程。

1 实现原理

在这里插入图片描述
1)应用获取Logger对象

从LogManager中获取Logger
在这里插入图片描述

2)指定日志级别Level,指定日志记录LoggingEvent
LoggingEvent相当于jul中的LogRecord
在这里插入图片描述
日志级别:

  • 从高到低:FATAL、ERROR、WARN、INFO、DEBUG、TRACE、ALL
  • 一般使用INFO及以上级别

3)Filter可进一步控制输出
在这里插入图片描述

4)Appender相当于jul中的Handler,用来指定日志记录的输出位置,控制台、文件、数据库、邮箱等

在这里插入图片描述
在这里插入图片描述

5)Layout相当于jul中的Formatter,用来指定日志的输出格式
在这里插入图片描述

2 应用

2.1 添加依赖

maven工程中的pom.xml中添加坐标,其他工程中添加log4j.jar。

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

2.2 配置文件

自定义配置文件log4j.properties

# 设定日志记录的最低级别(低于该级别的日志不会被输出)与输出端,这里指定为控制台和文件输出
log4j.rootLogger=INFO,Console,File

# 控制台输出配置
log4j.appender.Console=org.apache.log4j.ConsoleAppender
# 指定日志输出格式
# HTML表格形式 HTMLLayout
# 简单的日志输出格式 SimpleLayout
# 根据自定义格式输出日志 PatternLayout
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
# 自定义输出格式
# %m 指定的输出信息
# %n 换行符
# %p 日志级别,如fatal、error等
# %t 产生该日志的线程全名
# %d 服务器当前时间,可以指定格式,如:%d{yyyy-MM-dd HH:mm:ss}
# %c 打印语句所属的类的全名
# %l 发生的位置,包括类名、线程、及在代码中的行数
# %L 代码中的行号
# %F 所在的文件名称
# %r 自应用启动到输出日志信息耗费的毫秒数
# %%  "%" 字符
# % 与字符之间的修饰符用来控制最小长度、最大长度和文本的对其方式:
#   %5c      最小长度是5,<5,右对齐
#   %-5c     最小长度是5,<5,"-"指定左对齐,会有空格
#   %.5c     最小长度是5,>5,将左边多出的字符截掉,<5不会有空格
#   %10.20c  <10字符,补空格、右对齐,>20字符,将左边超出的字符截掉

log4j.appender.Console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p [%-c] ---- %m%n

# 文件输出配置
# FileAppender将日志输出到文件中
# DailyRollingFileAppender每天输出到一个新的文件
# RollingFileAppender指定文件的尺寸,当文件大小达到指定尺寸时,会自动把文件改名,同时产生一个新的文件
log4j.appender.File = org.apache.log4j.DailyRollingFileAppender
# 指定日志文件的路径
log4j.appender.File.File = D:/log.txt
# 日志以追加的方式写入
log4j.appender.File.Append = true
# 指定格式化器
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %m%n
# 指定日志的文件编码
log4j.appender.File.encoding=UTF-8

# 日志记录到数据库JDBCAppender
log4j.appender.MySqlDB=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.MySqlDB.layout=org.apache.log4j.PatternLayout
# 使用mysql数据库,设置mysql驱动,高版本mysql需要调整
log4j.appender.MySqlDB.Driver=com.mysql.jdbc.Driver
# 指定mysql的路径端口及数据库名test
log4j.appender.MySqlDB.URL=jdbc:mysql://localhost:3306/test
# 用户名
log4j.appender.MySqlDB.User=root
# 密码
log4j.appender.MySqlDB.Password=root
# 插入语句
log4j.appender.MySqlDB.Sql=INSERT INTO log(project_name,create_date,level,category,file_name,thread_name,line,all_category,message) values('appname','%d{yyyy-MM-dd HH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')

存储到mysql的建表语句:

CREATE TABLE `log` (
	`log_id` int(11) NOT NULL AUTO_INCREMENT,
	`project_name` varchar(255) DEFAULT NULL COMMENT '目项名',
	`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`)
)

2.3程序调用示例

public class LogTest {

    @Test
    public void testLog4j(){
        // 初始化系统配置,没有配置文件的情况下增加
        // BasicConfigurator.configure();
        Logger logger = Logger.getLogger(LogTest.class);
        logger.fatal("测试 Log4j------fatal"); // 严重错误,一般会造成系统崩溃和终止运行
        logger.error("测试 Log4j------error"); // 错误信息,但不会影响系统运行
        logger.warn("测试 Log4j------warn"); // 警告信息,可能会发生问题
        logger.info("测试 Log4j------info"); // 程序运行信息,数据库的连接、网络、IO操作等
        logger.debug("测试 Log4j------debug"); // 调试信息,一般在开发阶段使用,记录程序的变量、参数等
        logger.trace("测试 Log4j------trace"); // 追踪信息,记录程序的所有流程信息
    }
}

3 总结

log4j的实现原理与jul类似,与jul相比,实现了更多的控制输出方式及内容格式化方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值