Log4j

介绍

Logj4 是 Apache 下的一款开源的日志框架,通过在项目中使用 Log4j ,我们可以控制日志信息输出到控制台、文件、甚至是数据库。我们可以控制每一条日志的输出格式,通过定义日志输出级别、可以更令过的控制日志输出过程。方便项目测试。

官网地址:Apache log4jicon-default.png?t=N7T8http://logging.apache.org/log4j/1.2/

Hello Wrold

如果没有惯用的 Hello wrold 实例,任何介绍都是不完整的。

  1. 首选创建 Maven 工程。

  2. 添加 Log4j 依赖。

    <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>1.2.17</version>
    </dependency>
  3. 添加配置文件 log4j.properties

    log4j.rootLogger = trace,console
    log4j.appender.console = org.apache.log4j.ConsoleAppender
    log4j.appender.console.layout = org.apache.log4j.SimpleLayout
  4. 创建测试类进行测试。

    import org.apache.log4j.Logger;
    
    public class AppTest {
    
        public static void main(String[] args){
            Logger logger = Logger.getLogger(AppTest.class);
            logger.info("Hello World!");
        }
    }
  5. 控制台输出结果:

INFO - Hello World!

进程已结束,退出代码0

进一步说明,举很多栗子

在举例子之前,先说一下日志级别,Log4j 有六个日志级别,它们从高到低为:

  1. off:关闭所有日志。

  2. fatal: 严重错误,一般会造成系统崩溃和终止运行。

  3. error:错误信息,但不会影响系统运行。

  4. warn:警告信息,可能会发生问题。

  5. info:程序运行信息,数据库的连接、网络、IO操作等。

  6. debug:调试信息,一般在开发阶段使用,记录程序的变量、参数等。

  7. trace:追踪信息,记录程序的所有流程信息。

  8. 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')

 

  • 15
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值