Log4j 学习笔记

Log4j 学习笔记

  • 1 Log4j 概述
    • 1.1 Log4j基础
      • 1.1.1 Log4j的下载
      • 1.1.2 Log4j2与Log4j区别
      • 1.1.2 日志级别
      • 1.1.3 日志输出控制文件
  • 2 创建第一个项目
    • 2.1 添加依赖
    • 2.2 放入日志输出控制文件
    • 2.3 代码中实现日志记录
    • 2.4 结果
  • 3 日志输出控制文件分析
    • 3.1 日志输出控制文件组成
    • 3.2 修饰日志附加器
    • 3.3 控制台附加器
    • 3.4 文件附加器
    • 3.5 滚动文件附加器
    • 3.6 Log4j 常见布局类型
    • 3.7 配置根Logger
  • 4 控制台附加器
    • 4.1 定义输出控制文件
    • 4.2 测试代码
    • 4.3 结果
  • 5 文件附加器
    • 5.1 定义输出控制文件
    • 5.2 测试代码
    • 5.3 结果
  • 6 滚动文件附加器
    • 6.1 定义输出控制文件
    • 6.2 测试代码
    • 6.3 结果
  • 7 每日滚动文件附加器
    • 7.1 定义输出控制文件
    • 7.2 测试代码
    • 7.3 结果
    • 8 小时滚动文件附加器
    • 8.1 定义输出控制文件
    • 8.2 测试代码
    • 8.3 结果
  • 9 Log4j2
    • 9.1 添加依赖
    • 9.2 定义控制文件
    • 9.3 测试代码
    • 9.4 结果

  

1 Log4j 概述

  一个完整的软件,日志是必不可少的。程序从开发,测试,维护,运行等环节,都需要向控制台或文件等位置输出大量的信息。这些信息的输出,在很多时间是使用System.out.println()是无法实现的。日志信息根据用途与记录内容不同,分为调试日志、运行日志、异常日志等。用于记录的日志技术很多,如jdk的logger技术,apache的log4j、log4j2、logback技术等。Log4j的全称为Log for Java,即,专门用于java语言的日志记录工具。

1.1 Log4j基础

1.1.1 Log4j的下载

Log4j下载地址:http://logging.apache.org
Log4j 学习笔记_第1张图片
Log4j 学习笔记_第2张图片
Log4j 学习笔记_第3张图片

1.1.2 Log4j2与Log4j区别

  a、Log4j需要添加一个依赖,而log4j2需要添加两个依赖
  b、Log4j 1.x已经不再更新
  c、Log4j:org.apache.log4j log4j2:org.apache.loggin.log4j
  d、性能上log4j2优于log4je、Logj4j是以.properties,log4j2是以*.xml,.json,.jsn

1.1.2 日志级别

  为了方便对于日志信息的输出显示,对日志内容进了分级管理。日志级别由高到低共分为6个级别:fatal(致命的)、error、warn、info、debug、trace(堆栈)。为什么要对日志进行分级呢?
  无论是将日志输出到控制台,还是文件,其输出都会降低程序的运行效率。但由于调试、运行维护的需要,客户的要求等等原因,需要进行必要的日志输出。这时就必须要在代码中加入日志的输出语句。这些输出语句若在程序运行时全部输出,则势必会降低程序运行效率。例如,使用System.out.println()将信息输出到控制台,则所有的该输出语句均将执行。就会大大降低程序的执行效率。而要使其不输出,唯一的办法就是将这些语句只能一个一个的全部删除。这是个费时费力的过程。

  将日志信息进行分级管理,便可方便的控制信息输出内容及输出的位置:哪些信息需要输出,哪些信息不需要输出,只需要在一个日志输出控制文件中稍加修改即可。而代码中的输出语句不用做任何的修改。从这个角度来说,代码中的日志编写,其实就是写大量的输出语句。只不过这些输出语句比较特殊,它们具有级别,在程序运行期间不一定被执行。它们的执行是需要由另外一个文件来控制。

1.1.3 日志输出控制文件

Log4j的日志输出控制文件,主要由三个部分构成:
1)日志信息的输出位置:控制日志信息将要输出的位置,是控制台还是文件等。
2)日志信息的输出格式:控制日志信息的显示格式,即以怎样的字符串形式显示。
3)日志信息的输出级别:控制日志信息的显示内容,即显示哪些级别的日志信息。有了日志输出控制文件,代码中只要设置好日志信息内容及其级别即可,通过控制文件便可控制这些日志信息的输出了

2 创建第一个项目

2.1 添加依赖

    <dependencies>
        <!--log4j的依赖-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <!-- 编译插件 -->
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <!-- 插件的版本 -->
                <version>3.5.1</version>
                <!-- 编译级别 -->
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <!-- 编码格式 -->
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

2.2 放入日志输出控制文件

##define an appender named console
log4j.appender.console=org.apache.log4j.ConsoleAppender
#The Target value is System.out or System.err
log4j.appender.console.Target=System.out
#set the layout type of the apperder
log4j.appender.console.layout=org.apache.log4j.PatternLayout
#set the layout format pattern
log4j.appender.console.layout.ConversionPattern=[log4j-demo] %-5d{yyyy-MM-dd HH:mm:ss,SSS} [%-5p] %c:%l - %m%n


##define an appender named file
log4j.appender.file=org.apache.log4j.FileAppender
#define the file path and name
log4j.appender.file.File=c:/logger/logfile.txt
#set the layout type of the apperder
log4j.appender.file.layout=org.apache.log4j.PatternLayout
#set the layout format pattern
log4j.appender.file.layout.ConversionPattern=[log4j-demo] %-5d{yyyy-MM-dd HH:mm:ss,SSS} [%-5p] %c:%l - %m%n


##define an appender named rollfile
log4j.appender.rollfile=org.apache.log4j.RollingFileAppender
#define the file path and name
log4j.appender.rollfile.File=c:/logger/logRollFile.txt
#set the log's size
log4j.appender.rollfile.MaxFileSize=10KB
#set the layout type of the apperder
log4j.appender.rollfile.layout=org.apache.log4j.PatternLayout
#set the layout format pattern
log4j.appender.rollfile.layout.ConversionPattern=[log4j-demo] %-5d{yyyy-MM-dd HH:mm:ss,SSS} [%-5p] %c:%l - %m%n


##define a logger
#log4j.logger.\u5168\u9650\u5B9A\u6027\u7C7B\u540D\u6216\u63A5\u53E3\u540D=INFO,console,file,rollfile
log4j.rootLogger=INFO,console,file,rollfile

2.3 代码中实现日志记录

  在要输出日志的类中创建日志对象Logger,并通过Logger的方法在代码中加入日志输出语句。在Java代码中进行日志输出,需要用到Logger类的静态方法getLogger().注意,Logger为org.apache.log4j包中的类

public class Demo {

    public static void main(String[] args) {
        //创建日志记录工具
        Logger logger = LogManager.getLogger(Demo.class);

        logger.debug("This is debug message!");
        logger.info("This is info message");
        logger.warn("This is warn message!");
        logger.error("This is error message!");
    }
}

2.4 结果

  将来这些日志输出语句,会根据log4j.properties文件中日志级别的设置进行输出,会输出到指定位置。其输出结果是:输出指定级别及其更高级别的信息。如指定info级别,则会输出fatal、error、warn、info级别信息。就本例而言,会执行以下三个语句,而不会输出debug语句。

Log4j 学习笔记_第4张图片
Log4j 学习笔记_第5张图片

3 日志输出控制文件分析

3.1 日志输出控制文件组成

日志属性文件log4j.properties是专门用于控制日志输出的。其主要进行三方面控制:
1、输出位置:控制日志将要输出的位置,是控制台还是文件等。
2、输出布局:控制日志信息的显示形式。
3、输出级别:控制要输出的日志级别。

日志属性文件由两个对象组成:日志附加器与根日志。
根日志:即为java代码中的日志记录器,其主要由两个属性构成:日志输出级别与日志附加器。
日志附加器,则由日志输出位置定义,由其它很多属性进行修饰,如输出布局、文件位置、文件大小等。配置模式:
appenderName是用户自定义
log4j.appender.appenderName=ClassName
log4j.appender.appenderName.Option1=value1
log4j.appender.appenderName.Option2=value2

log4j.appender.appenderName.OptionN=valueN
Log4j 学习笔记_第6张图片
Log4j 学习笔记_第7张图片
1、org.apache.log4j.ConsoleAppender:日志输出到控制台
2、org.apache.log4j.FileAppender:日志输出到文件
3、org.apache.log4.RollingFileAppender:当日志文件大小达到指定大小的时候将产生一个新的日志文件。
4、org.apache.log4j.DailyRollingFileAppender:每天产生一个日志文件

3.2 修饰日志附加器

  所谓修饰日志附加器,就是为定义好的附加器添加一些属性,以控制到指定位置的输出。不同的附加器,其修饰属性不同。

3.3 控制台附加器

Log4j 学习笔记_第8张图片
Target:控制输出到控制台的使用目标。其值为System.out或System.err。它们的区别是:System.out是以黑色字体显示到控制台,而System.err是以红色字体显示。

3.4 文件附加器

Log4j 学习笔记_第9张图片
File:日志要输出的文件位置及文件名称

3.5 滚动文件附加器

Log4j 学习笔记_第10张图片
MaxFileSize:用于指定日志文件的最大值。如果输出的日志文件大小超过了指定的文件大小,将自动产生另一个日志文件

3.6 Log4j 常见布局类型

  1、org.apache.log4j.HTMLLayout:网页布局,以HTML表格形式布局
  2、borg.apache.log4j.SimpleLayout:简单布局,包含日志信息的级别和信息字符串
  3、org.apache.log4j.PatternLayout:匹配器布局,可以灵活地指定布局模式。其主要是通过设置PatternLayout的ConversionPattern属性值来控制日志具体输出的格式。

3.7 配置根Logger

配置rootLogger,以便于代码加载来控制日志的输出。其语法为:

log4j.rootLogger=[level],appenderName1,appenderName2,...

  其中,level是日志记录的优先级别,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、ALL。
  Log4j只建议使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。OFF为关闭日志功能。低级别的可以显示打印出高级别的日志信息,但高级别打印不出低级别的日志信息。所以,级别越高显示的日志信息就越少。

4 控制台附加器

4.1 定义输出控制文件

#A根日志
log4j.rootLogger=info,console

#A定义一个控制台日志附加器
log4j.appender.console=org.apache.log4j.ConsoleAppender
#控制输出到控制台使用的目录:Target,可以使用System.out或Sytem.err
#log4j.appender.console.Target=System.out
log4j.appender.console.Target=System.err
#A指定附加器控制输出的日志
log4j.appender.console.layout=org.apache.log4j.PatternLayout
#A定义附加器日志输出的格式,-表示打印的内容向左对齐
log4j.appender.console.layout.ConversionPattern=[log4j-demo] %-d{yyyy-MM-dd HH:mm:ss,SSS} [%-5p] %c:%l - %m%n

4.2 测试代码

public class Demo {

    public static void main(String[] args) {
        //创建日志记录器
        Logger logger = LogManager.getLogger(Demo.class);

        logger.debug("This is Debug Message!");
        logger.info("This is Info Message!");
        logger.warn("This is warn Message!");
        logger.error("This is Error Message!");
    }
}

4.3 结果

Log4j 学习笔记_第11张图片

5 文件附加器

5.1 定义输出控制文件

log4j.rootLogger=info,file,console

#A定义文件附加器
log4j.appender.file=org.apache.log4j.FileAppender
#Threshold:指定当前附加器打印日志最低输出级别,默认为rootLogger指定的级别
log4j.appender.file.Threshold=warn
#A定义文件输出的位置和名称
log4j.appender.file.File=c:/logger/file.log
#Append:true表示消息追加到指定文件中,false则将消息覆盖到指定文件中,默认值true
log4j.appender.file.Append=false
#A指定日志打印控制格式的对象
log4j.appender.file.layout=org.apache.log4j.PatternLayout
#A日志输出格式
log4j.appender.file.layout.ConversionPattern=[log4j-demo] %-d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] %c:%L - %m%n

#A定义控制台附加器
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[log4j-demo] %-d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] %c:%L - %m%n

5.2 测试代码

public class Demo {

    public static void main(String[] args) {
        //创建日志记录对象
        Logger logger = LogManager.getLogger(Demo.class);

        //日志打印规则:低级别可以打印高级别日志,高级别打印不出低级别日志
        logger.trace("This is TRACE message !");
        logger.debug("This is DEBUG message !");
        logger.info("This is INFO message !");
        logger.warn("This is WARN message !");
        logger.error("This is ERROR message !");
        logger.fatal("This is FATAL message !");
    }
}

5.3 结果

Log4j 学习笔记_第12张图片
Log4j 学习笔记_第13张图片

6 滚动文件附加器

6.1 定义输出控制文件

log4j.rootLogger=info,rollFile,console

#A定义滚动文件附加器
log4j.appender.rollFile=org.apache.log4j.RollingFileAppender
#Threshold:指定打印日志信息输出的最低级别,默认为rootLogger指定的级别
log4j.appender.rollFile.Threshold=error
#A指定日志文件输出的位置和名称
log4j.appender.rollFile.File=c:/logger/rollFile.log
#A备份文件的最大的大小是多少:后缀可以是KB,MB,GB。在日志文件到达指定大小的时候,
#A将会自动滚动生成新文件,即将原来的内容移动到rollFile.log.1
log4j.appender.rollFile.MaxFileSize=5KB
#MaxBackupIndex:指定最近备份日志文件的数量,指定可以产生的滚动文件的最大数,例如,设为2,则可以产生rollFile.log.1,rollFile.log.2两个滚动文件和一个rollFile.log
log4j.appender.rollFile.MaxBackupIndex=10
#A指定日志打印格式对象
log4j.appender.rollFile.layout=org.apache.log4j.PatternLayout
#A指定日志打印格式
log4j.appender.rollFile.layout.ConversionPattern=[log4j-demo] %-d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] %c:%l - %m%n


#A指定控制台附加器
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[log4j-demo] %-d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] %c:%l - %m%n

6.2 测试代码

public class Demo {

    public static void main(String[] args) {
        //创建日志记录器
        Logger logger = LogManager.getLogger(Demo.class);

        for (int i = 0; i < 1000; i++) {
            logger.trace("第" + i + "条---This is TRACE message !");
            logger.debug("第" + i + "条---This is DEBUG message !");
            logger.info("第" + i + "条---This is INFO message !");
            logger.warn("第" + i + "条---This is WARN message !");
            logger.error("第" + i + "条---This is ERROR message !");
            logger.fatal("第" + i + "条---This is FATAL message !");
        }

    }
}

6.3 结果

Log4j 学习笔记_第14张图片
Log4j 学习笔记_第15张图片

7 每日滚动文件附加器

7.1 定义输出控制文件

log4j.rootLogger=info,dailyFile,console

#A定义每天生成一个日志文件附加器
log4j.appender.dailyFile=org.apache.log4j.DailyRollingFileAppender
#Threshold:指定日志输出的最低级别,默认为debug
log4j.appender.dailyFile.Threshold=error
#Append:日志文件追加到指定文件中
log4j.appender.dailyFile.Append=true
#A指定日志输出的位置及名称
log4j.appender.dailyFile.File=c:/logger/dailyFile.log
#DatePattern:指定产生新日志文件后,之前日志文件的后缀名称
log4j.appender.dailyFile.DatePattern='.'yyyy-MM-dd
#A格式控制对象
log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout
#A定义日志打印的格式
log4j.appender.dailyFile.layout.ConversionPattern=[log4j-demo] %-d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] %c:%l - %m%n

#A定义控制台附加器
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[log4j-demo] %-d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] %c:%l - %m%n

7.2 测试代码

public class Demo {

    public static void main(String[] args) {
        //创建日志记录对象
        Logger logger = LogManager.getLogger(Demo.class);

        logger.trace("This is TRACE message!");
        logger.debug("This is DEBUG message!");
        logger.info("This is INFO message!");
        logger.warn("This is WARN message!");
        logger.error("This is ERROR message!");
        logger.fatal("This is FATAL message!");
    }
}

7.3 结果

在这里插入图片描述
Log4j 学习笔记_第16张图片
Log4j 学习笔记_第17张图片
将时间设置为15号
在这里插入图片描述

8 小时滚动文件附加器

8.1 定义输出控制文件

log4j.rootLogger=info,hourFile,console

#A定义滚动文件附加器
log4j.appender.hourFile=org.apache.log4j.DailyRollingFileAppender
#Threshold:指定日志打印输出的最低级别,默认debug
log4j.appender.hourFile.Threshold=error
#Apppend:true日志内容追加到文件中,false将要覆盖之前日志的内容,默认为true
log4j.appender.hourFile.Append=true
#A指定日志输出的位置及名称
log4j.appender.hourFile.File=c:/logger/hourFile.log
#DatePattern:设置产生新文件之后,老的日志文件的后缀格式
log4j.appender.hourFile.DatePattern='.'yyyy-MM-dd-HH
#A格式控制对象
log4j.appender.hourFile.layout=org.apache.log4j.PatternLayout
#A定义日志输出的格式
log4j.appender.hourFile.layout.ConversionPattern=[log4j-demo] %-d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] %c:%l - %m%n

#A定义控制台附加器
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[log4j-demo] %-d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] %c:%l - %m%n

8.2 测试代码

public class Demo {

    public static void main(String[] args) {
        //创建日志记录对象
        Logger logger = LogManager.getLogger(Demo.class);

        logger.trace("This is TRACE message!");
        logger.debug("This is DEBUG message!");
        logger.info("This is INFO message!");
        logger.warn("This is WARN message!");
        logger.error("This is ERROR message!");
        logger.fatal("This is FATAL message!");

    }
}

8.3 结果

在这里插入图片描述
更改时间
Log4j 学习笔记_第18张图片

9 Log4j2

9.1 添加依赖

<dependencies>

        
        <dependency>
            <groupId>org.apache.logging.log4jgroupId>
            <artifactId>log4j-apiartifactId>
            <version>2.3version>
        dependency>

        <dependency>
            <groupId>org.apache.logging.log4jgroupId>
            <artifactId>log4j-coreartifactId>
            <version>2.3version>
        dependency>
    dependencies>

    <build>
        <plugins>
            
            <plugin>
                <artifactId>maven-compiler-pluginartifactId>
                
                <version>3.5.1version>
                
                <configuration>
                    <source>1.8source>
                    <target>1.8target>
                    
                    <encoding>UTF-8encoding>
                configuration>
            plugin>
        plugins>
    build>

9.2 定义控制文件

Log4j 学习笔记_第19张图片

                    interval:integer类型,指定两次封存动作之间的时间间隔。
                              单位:以日志的命名精度来确定单位,比如yyyy-MM-dd-HH 单位为小时,yyyy-MM-dd-HH-mm 单位为分钟
                    modulate:boolean型,说明是否对封存时间进行调制。
                              若modulate=true,则封存时间将以0点为边界进行偏移计算。比如,modulate=true,interval=4hours,
                              那么假设上次封存日志的时间为03:00,则下次封存日志的时间为04:00,之后的封存时间依次为08:00,12:00,16:00
                -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                
                <SizeBasedTriggeringPolicy size="2 KB"/>
            Policies>
            
            <DefaultRolloverStrategy max="20"/>
        RollingRandomAccessFile>

        
        
        <File name="fileLog" fileName="${LOG_NAME}/fileLog.txt" append="false">
            <PatternLayout pattern="[log4j2-demo] %-d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] %c:%L - %m%n"/>
        File>

        
        <RollingFile name="dailyRollingFile" fileName="${LOG_HOME}/dailyRollingFile.log"
                     filePattern="${LOG_HOME}/$${date:yyyy-MM-dd}/dailyFile-%d{yyyy-MM-dd}.log">
            <PatternLayout pattern="[log4j2-demo] %-d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] %c:%L - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
            Policies>
        RollingFile>

        
        <RollingFile name="sizedRollingFile" fileName="${LOG_HOME}/sizedFile.log"
                     filePattern="${LOG_HOME}/$${date:yyyy-MM-dd}/sizedFile-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="[log4j2-demo] %-d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] %c:%L - %m%n"/>
            <SizeBasedTriggeringPolicy size="2k" />
        RollingFile>

        
        
        <RollingFile name="RollingFile" fileName="${LOG_NAME}/app.log"
                     filePattern="${LOG_NAME}/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="[log4j2-demo] %-d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] %c:%L - %m%n"/>
            <SizeBasedTriggeringPolicy size="50MB"/>
        RollingFile>

    Appenders>

    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console"/>
            
        Root>
    Loggers>
Configuration>

9.3 测试代码

public class Demo {

    public static void main(String[] args) {
        //创建日志记录对象
        Logger logger = LogManager.getLogger(Demo.class);

        logger.trace("This is TRACE message!");
        logger.debug("This is DEBUG message!");
        logger.info("This is INFO message!");
        logger.warn("This is WARN message!");
        logger.error("This is ERROR message!");
        logger.fatal("This is FATAL message!");
    }
}

9.4 结果

在这里插入图片描述
Log4j 学习笔记_第20张图片

你可能感兴趣的:(Log4j)