Java日志系统02 ---- Log4j日志

目录标题

  • 前言
  • 简介
  • 使用
    • Maven依赖
    • 快速测试代码
      • 使用properties文件进行配置
      • 开启内置日志
  • Log4j组件
  • 日志系统的自定义配置
    • 自定义消息输出格式
    • 自定义输出方式
      • 输出日志到文件
      • 按文件大小拆分成多个文件存储
      • 按日期拆分成多个文件存储
      • 存储到数据库

前言

当前文章只是学习笔记,具体请点击超链接:视频

简介

Log4j是个老牌的日志框架,现在已经很少使用了。用得比较多的是logback和log4j2,因此,这篇文章也是作为日志系统入门资料,不会对Log4j运行原理做深入研究,只是简单使用,目的是了解日志框架的发展史。

官方介绍:Log4j是Apache下的一款开源的日志框架,通过在项目中使用 Log4j,我们可以控制日志信息输出到控制台、文件、甚至是数据库中。我们可以控制每一条日志的输出格式,通过定义日志的输出级别,可以更灵活的控制日志的输出过程。方便项目的调试。
官方网站:http://logging.apache.org/log4j/1.2/

使用

Maven依赖

只需要引入Log4j依赖即可,这里使用单元测试跑代码比较方便,所以也引入Junit单元测试依赖

<dependencies>
  <dependency>
    <groupId>log4jgroupId>
    <artifactId>log4jartifactId>
    <version>1.2.17version>
  dependency>

  <dependency>
    <groupId>junitgroupId>
    <artifactId>junitartifactId>
    <version>4.12version>
  dependency>
dependencies>

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.pluginsgroupId>
      <artifactId>maven-compiler-pluginartifactId>
      <version>3.1version>
      <configuration>
        <source>1.8source>
        <target>1.8target>
        <encoding>UTF-8encoding>
      configuration>
    plugin>
  plugins>
build>

快速测试代码

日志的使用方法和JUL日志一样,先利用类路径创建一个日志对象,然后输出日志信息。

package com.demo.log4j;

import org.apache.log4j.Logger;
import org.junit.Test;

public class Log4jTest {

  @Test
  public void quickTest() {
    // 创建Logger对象
    Logger logger = Logger.getLogger(Log4jTest.class);
    // 输出info级别的日志信息
    logger.info("info message");
  }
}

但这次,控制台并没有输出日志信息。而是提示我们要进行配置。
Java日志系统02 ---- Log4j日志_第1张图片
这里,在代码中对日志进行基础配置。再次运行方法,可成功输出日志信息。
Java日志系统02 ---- Log4j日志_第2张图片

使用properties文件进行配置

通过跟踪源码,可以找到配置文件的名称log4j.properties。在resource目录下创建配置文件,并进行配置。
Java日志系统02 ---- Log4j日志_第3张图片
Java日志系统02 ---- Log4j日志_第4张图片
在log4j.properties文件中添加以下配置:

# 指定RootLogger顶级父元素默认配置信息
# 默认配置信息包括两部分:指定日志级别=trace,使用的appender=console
log4j.rootLogger=trace,console
# 指定控制台日志输出appender
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 指定消息格式
log4j.appender.console.layout=org.apache.log4j.SimpleLayout

删掉BasiConfigurator.configure(),重新跑。
Java日志系统02 ---- Log4j日志_第5张图片
能输出日志信息说明配置生效:
Java日志系统02 ---- Log4j日志_第6张图片

开启内置日志

Java日志系统02 ---- Log4j日志_第7张图片
或者在properties文件中配置,key的名称可以进源码找到
Java日志系统02 ---- Log4j日志_第8张图片

Log4j组件

在进一步对日志组件进行配置之前,需要对Log4j的组件有个大概的了解。Log4J主要由Loggers(日志记录器)、Appenders(输出端)和Layout(日志格式化器)组成。其中,
Loggers 控制日志的输出级别与日志是否输出;
Appenders 指定日志的输出方式(输出到控制台、文件等);
Layout 控制日志信息的输出格式。

日志系统的自定义配置

自定义消息输出格式

常用的输出格式:

格式化器类型 作用
HTMLLayout Html格式输出
SimpleLayout 简单的日志输出格式
PatternLayout 可自定义格式

修改log4j.properties文件,采用PatternLayout自定义格式

# 指定RootLogger顶级父元素默认配置信息
# 默认配置信息包括两部分:指定日志级别=trace,使用的appender=console
log4j.rootLogger=trace,console
# 指定控制台日志输出appender
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 指定消息格式
log4j.appender.console.layout=org.apache.log4j.PatternLayout

测试代码:

@Test
public void quickTest() {
  // 创建Logger对象
  Logger logger = Logger.getLogger(Log4jTest.class);
  // 输出info级别的日志信息
  logger.info("info message");
}

输出结果:
Java日志系统02 ---- Log4j日志_第9张图片
log4j.properties追加一行配置,修改输出日志的模板

log4j.appender.console.layout.ConversionPattern=%r [%t] %p %c %x - %m%n

再次运行代码,控制台输出结构为
Java日志系统02 ---- Log4j日志_第10张图片
其中%r [%t] %p %c %x - %m%n模板的占位符含义如下:

占位符 含义
%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 输出代码中的行号
%% 输出一个 “%” 字符

自定义输出方式

输出日志到文件

在log4j.properties文件中追加文件方式输出的appender,日志保存路径为d:/logs/log4j.log,若文件不存在会自动创建。

# 指定控制台日志输出appender
log4j.appender.file=org.apache.log4j.FileAppender
# 指定消息格式
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.conversionPattern=%r [%t] %p %c %x - %m%n
# 指定消息保存路径
log4j.appender.file.file=d:/logs/log4j.log
# 文件相关设置
log4j.appender.file.encoding=UTF-8

并修改父元素的输出方式,使得同时支持控制台输出和文件输出
Java日志系统02 ---- Log4j日志_第11张图片
完整的log4j.properties文件配置:

# 指定RootLogger顶级父元素默认配置信息
# 默认配置信息包括两部分:指定日志级别=trace,使用的appender=console
log4j.rootLogger=trace,console,file

# 指定控制台日志输出appender
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 指定消息格式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%r [%t] %p %c %x - %m%n

# 指定控制台日志输出appender
log4j.appender.file=org.apache.log4j.FileAppender
# 指定消息格式
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%r [%t] %p %c %x - %m%n
# 指定消息保存路径
log4j.appender.file.file=d:/logs/log4j.log
# 文件相关设置
log4j.appender.file.encoding=UTF-8

再次运行代码,可以看到日志已经输出到文件中
Java日志系统02 ---- Log4j日志_第12张图片

按文件大小拆分成多个文件存储

完整的log4j.properties文件配置:

# 指定RootLogger顶级父元素默认配置信息
# 默认配置信息包括两部分:指定日志级别=trace,使用的appender=console
log4j.rootLogger=trace,rollingFile

# 按文件大小拆分的appender对象
# 指定控制台日志输出appender
log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
# 指定消息格式
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.conversionPattern=%r [%t] %p %c %x - %m%n
# 指定消息保存路径
log4j.appender.rollingFile.file=d:/logs/log4j-rolling.log
# 文件相关设置
log4j.appender.rollingFile.encoding=UTF-8
log4j.appender.rollingFile.maxFileSize=100kb
# 文件最大数量
log4j.appender.rollingFile.maxBackupIndex=10

修改测试代码:

@Test
public void quickTest() {
  // 创建Logger对象
  Logger logger = Logger.getLogger(Log4jTest.class);
  for (int i = 0; i < 10000; i++) {
    // 输出info级别的日志信息
    logger.info("info message_" + i);
  }
}

运行测试代码,可以看到已经生成多个文件。
Java日志系统02 ---- Log4j日志_第13张图片

按日期拆分成多个文件存储

完整的log4j.properties文件配置:

# 指定RootLogger顶级父元素默认配置信息
# 默认配置信息包括两部分:指定日志级别=trace,使用的appender=console
log4j.rootLogger=trace,dailyFile

# 按文件大小拆分的appender对象
# 指定控制台日志输出appender
log4j.appender.dailyFile=org.apache.log4j.RollingFileAppender
# 指定消息格式
log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyFile.layout.conversionPattern=%r [%t] %p %c %x - %m%n
# 指定消息保存路径
log4j.appender.dailyFile.file=d:/logs/log4j-dailyFile.log
# 文件相关设置
log4j.appender.dailyFile.encoding=UTF-8
# 指定日期拆分规则,这里精确到秒。如果要按天拆分,value值为【'.'yyyy-MM-dd】
log4j.appender.rollingFile.datePattern='.'yyyy-MM-dd-HH-mm-ss

存储到数据库

(略)这里就不再演示,日志不会存储到类似于mysql的关系型数据库,因为受到底层数据结构的影响,mysql建议一张表最多存储500万条记录,超过了就要分库分表。日志数据属于海量数据,分分钟超500万,即使要存数据库,都是存MongoDB 等非关系型数据库。


参考资料:https://www.bilibili.com/video/BV1iJ411H74S

你可能感兴趣的:(Java日志系统,java,apache,后端)