介绍
Logj4 是 Apache 下的一款开源的日志框架,通过在项目中使用 Log4j ,我们可以控制日志信息输出到控制台、文件、甚至是数据库。我们可以控制每一条日志的输出格式,通过定义日志输出级别、可以更令过的控制日志输出过程。方便项目测试。
官网地址:Apache log4jhttp://logging.apache.org/log4j/1.2/
Hello Wrold
如果没有惯用的 Hello wrold 实例,任何介绍都是不完整的。
-
首选创建 Maven 工程。
-
添加 Log4j 依赖。
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
-
添加配置文件
log4j.properties
。log4j.rootLogger = trace,console log4j.appender.console = org.apache.log4j.ConsoleAppender log4j.appender.console.layout = org.apache.log4j.SimpleLayout
-
创建测试类进行测试。
import org.apache.log4j.Logger; public class AppTest { public static void main(String[] args){ Logger logger = Logger.getLogger(AppTest.class); logger.info("Hello World!"); } }
-
控制台输出结果:
INFO - Hello World!
进程已结束,退出代码0
进一步说明,举很多栗子
在举例子之前,先说一下日志级别,Log4j 有六个日志级别,它们从高到低为:
-
off
:关闭所有日志。 -
fatal
: 严重错误,一般会造成系统崩溃和终止运行。 -
error
:错误信息,但不会影响系统运行。 -
warn
:警告信息,可能会发生问题。 -
info
:程序运行信息,数据库的连接、网络、IO操作等。 -
debug
:调试信息,一般在开发阶段使用,记录程序的变量、参数等。 -
trace
:追踪信息,记录程序的所有流程信息。 -
all
:所有日志。
将日志内容打印到控制台
# 1. 创建日志记录器 指定了输出级别为 info,和 一个名为 `myConsole` 的输出目标,这个名字可以是任意的;
log4j.rootLogger = info,myConsole
#2. 定义了一个名为 `myConsole` 的 输出目标,值为`org.apache.log4j.ConsoleAppender` 表示输出到控制台;
log4j.appender.myConsole = org.apache.log4j.ConsoleAppender
#3. 定义了 一个名为 `myConsole` 的输出目标的输出格式,值为 `org.apache.log4j.SimpleLayout` 表示 简单的日志输出格式;
log4j.appender.myConsole.layout = org.apache.log4j.SimpleLayout
输出结果:
INFO - Hello World!
进程已结束,退出代码0
将日志内容输出到文件
# 1. 创建日志记录器 指定了输出级别为 info,和 一个名为 `myFile` 的输出目标,这个名字可以是任意的;
log4j.rootLogger = info,myFile
#2. 定义了一个名为 `myFile` 的 输出目标,值为`org.apache.log4j.FileAppender` 表示输出到文件;
log4j.appender.myFile = org.apache.log4j.FileAppender
#2. 定义了一个名为 `myFile` 的 输出目标,定义文件的输出位置
log4j.appender.myFile.file = log/myLog.txt
#3. 定义了 一个名为 `myFile` 的输出目标的输出格式,值为 `org.apache.log4j.SimpleLayout` 表示 简单的日志输出格式;
log4j.appender.myFile.layout = org.apache.log4j.SimpleLayout
输出结果:
进程已结束,退出代码0
会在根路径下的 log 文件夹生成一个名为 myLog.txt 的文件。
每次允许这个程序,都会将日志信息 追加 到文件中。
将日志内容打印到控制台并输出到文件
# 1. 创建日志记录器 指定了输出级别为 info,和 一个名为 `myConsole` 和 `myFile` 的输出目标
log4j.rootLogger = info,myConsole,myFile
#2. 定义了一个名为 `myConsole` 的 输出目标,值为`org.apache.log4j.ConsoleAppender` 表示输出到控制台;
log4j.appender.myConsole = org.apache.log4j.ConsoleAppender
#3. 定义了 一个名为 `myConsole` 的输出目标的输出格式,值为 `org.apache.log4j.SimpleLayout` 表示 简单的日志输出格式;
log4j.appender.myConsole.layout = org.apache.log4j.SimpleLayout
#4. 定义了一个名为 `myFile` 的 输出目标,值为`org.apache.log4j.FileAppender` 表示输出到文件;
log4j.appender.myFile = org.apache.log4j.FileAppender
#5. 定义了一个名为 `myFile` 的 输出目标,定义文件的输出位置
log4j.appender.myFile.file = log/myLog.txt
#6. 定义了 一个名为 `myFile` 的输出目标的输出格式,值为 `org.apache.log4j.SimpleLayout` 表示 简单的日志输出格式;
log4j.appender.myFile.layout = org.apache.log4j.SimpleLayout
格式化输出信息
以输出到控制台为例,格式化输出信息,其他输出方式可举一反三。
注意:将 SimpleLayout 修改为 PatternLayout。
-
SimpleLayout :简单的日志输出格式化;
-
PatternLayout:最强大的格式化期,可以根据自定义格式输出日志,如果没有指定转换格式, 就是用默认的转换格式;
# 1. 创建日志记录器 指定了输出级别为 info,和 一个名为 `myConsole` 的输出目标,这个名字可以是任意的;
log4j.rootLogger = info,myConsole
#2. 定义了一个名为 `myConsole` 的 输出目标,值为`org.apache.log4j.ConsoleAppender` 表示输出到控制台;
log4j.appender.myConsole = org.apache.log4j.ConsoleAppender
#3. 定义了 一个名为 `myConsole` 的输出目标的输出格式,值为 `org.apache.log4j.SimpleLayout` 表示 简单的日志输出格式;
log4j.appender.myConsole.layout = org.apache.log4j.PatternLayout
#定义输出格式
log4j.appender.myConsole.layout.ConversionPattern = 当前时间:%-d{yyyy-MM-dd HH:mm:ss} 线程名:%t 日志级别:%p 日志信息:%m%n
输出结果:
当前时间:2024-05-21 09:06:39 线程名:main 日志级别:INFO 日志信息:Hello World!
进程已结束,退出代码0
当然,该有更多格式化输出所用到的占位符,如下:
占位符 | 作用 |
---|---|
%m | 输出代码中指定的日志信息 |
%p | 输出优先级,及 DEBUG、INFO 等 |
%n | 换行符(Windows平台的换行符为 "\n",Unix 平台为 "\n") |
%r | 输出自应用启动到输出该 log 信息耗费的毫秒数 |
%c | 输出打印语句所属的类的全名 |
%t | 输出产生该日志的线程全名 |
%d | 输出服务器当前时间,默认为 ISO8601,也可以指定格式,如:%d{yyyy年MM月dd日 HH:mm:ss} |
%l | 输出日志时间发生的位置,包括类名、线程、及在代码中的行数。如: Test.main(Test.java:10) |
%F | 输出日志消息产生时所在的文件名称 |
%L | 输出代码中的行号 |
%% | 输出一个 "%" 字符 |
%5c | 输出category名称,最小宽度是5,category<5,默认的情况下右对齐 |
%-5c | 输出category名称,最小宽度是5,category<5,"-"号指定左对齐,会有空格 |
%.5c | 输出category名称,最大宽度是5,category>5,就会将左边多出的字符截掉,<5不 会有空格 |
%20.30.c | %20.30c category名称<20补空格,并且右对齐,>30字符,就从左边交远销出的字符截掉 |
指定输出的编码
#指定日志的文件编码
log4j.appender.[日志记录器名:如 myFile].encoding=UTF-8
每隔一天生成心的日志文件
# 1. 创建日志记录器 指定了输出级别为 info,和 一个名为 `myFile` 的输出目标,这个名字可以是任意的;
log4j.rootLogger = info,myFile
#2. 定义了一个名为 `myFile` 的 输出目标,值为`org.apache.log4j.FileAppender` 表示输出到文件;
log4j.appender.myFile = org.apache.log4j.FileAppender
#2. 定义了一个名为 `myFile` 的 输出目标,定义文件的输出位置
log4j.appender.myFile.file = log/myLog.txt
#3. 定义了 一个名为 `myFile` 的输出目标的输出格式,值为 `org.apache.log4j.DatePattern ` 表示 表示按时间划分文件;
log4j.appender.myFile.layout = org.apache.log4j.DatePattern
#设置划分的时间(按天,按分钟,按月)
log4j.appender.myFile.DatePattern = '.'yyyy-MM-dd
log4j.appender.myFile.DatePattern还可以指定为:
每小时滚动:'.'yyyy-MM-dd-HH
每分钟滚动:'.'yyyy-MM-dd-HH-mm
每个月滚动:'.'yyyy-MM
按文件大小生成新文件
# 1. 创建日志记录器 指定了输出级别为 info,和 一个名为 `myFile` 的输出目标,这个名字可以是任意的;
log4j.rootLogger = info,myFile
#2. 定义了一个名为 `myFile` 的 输出目标,值为`org.apache.log4j.FileAppender` 表示输出到文件;
log4j.appender.myFile = org.apache.log4j.FileAppender
#2. 定义了一个名为 `myFile` 的 输出目标,定义文件的输出位置
log4j.appender.myFile.file = log/myLog.txt
#3. 定义了 一个名为 `myFile` 的输出目标的输出格式,值为 `org.apache.log4j.RollingFileAppender ` 表示 表示按文件大小划分文件;
log4j.appender.myFile.layout = org.apache.log4j.RollingFileAppender
# 设置文件最大容量
log4j.appender.myFile.MaxFileSize = 10MB
#设置最大保存的文件数量,当大于5个文件时,最早的文件将被覆盖掉
log4j.appender.myFile.MaxBackupIndex = 5
将日志文件保存到数据库
既然用到了数据库,肯定需要先引入 MySQL依赖;
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
同样也要准别一个相对应的数据库,数据库的字段该怎么写,它就是,你想要的日志输出信息,比如你想要一个,当前时间,你就可以创建一个当前时间的字段,以此类推....
例子:
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. 定义了一个名为 `logDB` 的 输出目标,值为`org.apache.log4j.JDBCAppender` 表示输出到数据库;
log4j.appender.logDB=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.logDB.layout=org.apache.log4j.PatternLayout
#数据库驱动
log4j.appender.logDB.Driver=com.mysql.jdbc.Driver
#数据库地址
log4j.appender.logDB.URL=jdbc:mysql://localhost:3306/test
#用户名
log4j.appender.logDB.User=root
#密码
log4j.appender.logDB.Password=root
#在这里输出,就是 log4j.appender.logDB.Sql 指定了一条添加语句,里面的值通过格式化字符串的占位符给定值。我怎么感觉这个方式会被SQL注入呢???
log4j.appender.logDB.Sql=INSERT INTO
log(project_name,create_date,level,category,file_name,thread_name,line,all_categ
ory,message) values('itcast','%d{yyyy-MM-dd HH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')