log4j在项目中的使用

文章前置介绍

 本文不会详细的介绍log4j的一些概念,如有需要请查看
上一篇:log4j从入门到了解

  1. 向日志级别,记录器,追加器,和布局的概念,以及其对应的继承关系和详细的布局的格式化的符号的含义本文不会详细介绍
  2. 本文在配置文件中对target,Threshold,Append,additivity标签有详细讲解。

log4j 频繁提及的问题地址

http://logging.apache.org/log4j/1.2/faq.html#noconfig

log4j在maven项目中的使用

创建maven项目

在这里插入图片描述

在项目的pom.xml中添加依赖.

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

在resources文件中添加log4j.properties文件

在这里插入图片描述

以下是文件内容

# 定义一个根记录器,定义其日志级别,console,file,rollfile是自定义的追加器(名称自定义即可,会在后面指定追加器的具体类型)
log4j.rootLogger=INFO,console,file,rollfile,dailyfile,hourfile

## 定义一个追加器的类型为输出到控制台的追加器
log4j.appender.console=org.apache.log4j.ConsoleAppender
#指定当前的追加器打印日志的最低输出级别,默认为debug
log4j.appender.console.Threshold=error
# 输出日志到控制台的方式,其他参数有System.err(当做错误输出,显示为红色)
log4j.appender.console.Target=System.out
# 设置记录器的布局的类型
log4j.appender.console.layout=org.apache.log4j.PatternLayout
# 上面选的布局为自定义的输出格式的类型,所以下面指定输出格式
#  %-5p表示显示日志级别,字符不足五个,在右侧用空格补齐,%d指定日期格式,%c列出记录器的名字空间的全称
#  %L输出日志发生的位置(在代码中的行数)%m你在代码中定义的消息,%n换行
log4j.appender.console.layout.ConversionPattern=[%-5p][%d{
    
    yyyy-MM-dd HH:mm:ss}] %c %L %m%n

##  输出到文件
log4j.appender.file=org.apache.log4j.FileAppender
# 指定输出的位置和文件名
log4j.appender.file.File=d:/logfile.txt
# 指定输出的日志是追加(ture)还是覆盖(false)到指定文件中,默认为ture;
log4j.appender.file.Append=true
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%-5p][%d{
    
    yyyy-MM-dd HH:mm:ss}] %c %L %m%n


##  继承自FileAppender,输出到文件,并且控制文件到达指定大小后生成新的文件
log4j.appender.rollfile=org.apache.log4j.RollingFileAppender
log4j.appender.rollfile.File=d:/logrollfile.txt
#  当达到指定大小时,自动创建另一个文件,
log4j.appender.rollfile.MaxFileSize=2KB
log4j.appender.rollfile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollfile.layout.ConversionPattern=[%-5p][%d{
    
    yyyy-MM-dd HH:mm:ss}] %c %L %m%n

## 单独指定某个包或类打印的日志级别
## log4j.logger.com.emptycloud=debug

##  每天生成一个日志文件
log4j.appender.dailyfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyfile.Threshold=error
log4j.appender.dailyfile.Append=true
log4j.appender.dailyfile.File=D:/logfordailyfile.log
#指定产生新的日志文件后新的日志文件的名称,使用单引号,双引号会在生成新的文件时报错(命名报错)
log4j.appender.dailyfile.DatePattern='.'YYYY-MM-dd
log4j.appender.dailyfile.layout=org.apache.log4j.PatternLayout
# 项目名称-时间-日志级别 - 类名-行号-消息-换行
log4j.appender.dailyfile.layout.ConversionPattern=[log4j-demo] %-d{
    
    yyyy-MM-dd HH:mm:ss:SSS} [%-5p] %c:%l - %m%n

# 每小时生成一个日志文件
log4j.appender.hourfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.hourfile.Threshold=error
log4j.appender.hourfile.Append=true
log4j.appender.hourfile.File=D:/logforhourfile.log
# 每月YYYY-MM 每天YYYY-MM-dd  以此类推
log4j.appender.hourfile.DatePattern='.'YYYY-MM-dd-HH
log4j.appender.hourfile.layout=org.apache.log4j.PatternLayout
log4j.appender.hourfile.layout.ConversionPattern=[log4j-demo] %-d{
    
    yyyy-MM-dd HH:mm:ss:SSS} [%-5p] %c:%l - %m%n

在代码中添加日志记录

在实际使用中logger对象在类中通常配置为private static final 的常量,在类的所有方法中通用

public class Log4jDemo {
    
    
    public static void main(String[] args) {
    
    
        //创建记录器
        Logger logger = LogManager.getLogger(Log4jDemo.class);
        //打印不同级别的日志
        logger.trace("这是trace级别的日志");
        logger.debug("这是debug级别的日志222222222222222222222222222222222");
        logger.info("这是info级别的日志");
        logger.warn("这是warn级别的日志");
        logger.fatal("这是fatal日志");
        logger.error("这是error级别日志");
    }
}

可以自行添加循环来查看其配置文件生成的文件结构(修改系统的时间)

输出结果

[INFO ][2019-01-31 11:05:05] com.emptycloud.blog.log4jDemo 21 这是info级别的日志
[WARN ][2019-01-31 11:05:05] com.emptycloud.blog.log4jDemo 22 这是warn级别的日志

在这里插入图片描述

log4j继承关系在配置文件中的体现(additivity标志的介绍)

  1. 创建一个java项目添加log4j 的jar包,在根目录下添加配置文件
    https://blog.csdn.net/qq_40182873/article/details/86615490
    在这里插入图片描述2. 根据log4j 的继承规则,配置文件中的追加器都是属于根记录器的,而单独的类中创建的记录器会向上继承直到根记录器的追加器
    现在我们需要中段这种继承关系
    1.在代码中使用setAdditivity方法,将其设置成false,但是这可能导致你在配置文件或类中单独为其配置对应的追加器和布局
    2.在配置文件中配置
log4j.rootLogger=debug,console

log4j.logger.com.emptyCloud.blog=error,sonlogger
# 打断logger的继承关系
# log4j.additivity.com.emptyCloud.blog=false

log4j.appender.sonlogger=org.apache.log4j.ConsoleAppender
log4j.appender.sonlogger.Target=System.out
log4j.appender.sonlogger.layout=org.apache.log4j.PatternLayout
log4j.appender.sonlogger.layout.ConversionPattern=[sonlogger][%-5p][%d{
    
    yyyy-MM-dd HH:mm:ss}] %c %L %m%n

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[rootlogger][%-5p][%d{
    
    yyyy-MM-dd HH:mm:ss}] %c %L %m%n

3.对应的代码同上

  1. 解释
     那么这里就有三个记录器,名称分别是rootloogger,com.emptyCloud.blog(这两个是在配置文件中配置的)和com.emptyCloud.blog.log4jDemo(在代码中创建的)。
      log4j根据其名称判断其继承关系,这个在[log4j从入门到了解][https://blog.csdn.net/qq_40182873/article/details/86525547#_44]中有介绍过
    下面是对应的输出结果
[sonlogger][FATAL][2019-02-13 16:03:49] com.emptyCloud.blog.log4jDemo 26 这是fatal日志
[rootlogger][FATAL][2019-02-13 16:03:49] com.emptyCloud.blog.log4jDemo 26 这是fatal日志
[sonlogger][ERROR][2019-02-13 16:03:49] com.emptyCloud.blog.log4jDemo 27 这是error级别日志
[rootlogger][ERROR][2019-02-13 16:03:49] com.emptyCloud.blog.log4jDemo 27 这是error级别日志

将配置文件的注释去掉后

[sonlogger][FATAL][2019-02-13 16:04:52] com.emptyCloud.blog.log4jDemo 26 这是fatal日志
[sonlogger][ERROR][2019-02-13 16:04:52] com.emptyCloud.blog.log4jDemo 27 这是error级别日志

从这里就可以看出最底层的记录器打印日志的级别继承自最近的父记录器,然后就是记录器的继承关系不打断的话除了其本身会打印一遍日志,其父记录器也会打印一遍日志

  1. 注意
    log4j.additivity和log4j.logger后面跟的都是记录器的名称,配置时根据需要注意继承关系
    ,这个主要是用于项目中个别包打印和根记录器不同的日志级别

log4j 的xml类型配置文件介绍

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd">
<log4j:configuration>
    <!--输出到控制台-->
    <appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">
        <param name="Threshold" value="DEBUG"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
        </layout>
    </appender>

    <!--输出到文件(info)-->
    <!--将生成“info.log.2014-06-11”这样的日志文件-->
    <appender name="fileAppenderInfo" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="${user.home}/logs/website/info.log" />
        <param name="DatePattern" value=".yyyy-MM-dd" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
        </layout>
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <param name="LevelMin" value="INFO" />
            <param name="LevelMax" value="INFO" />
        </filter>
    </appender>

    <!--输出到文件(warn)-->
    <appender name="fileAppenderWarn" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="${user.home}/logs/website/warn.log" />
        <param name="DatePattern" value=".yyyy-MM-dd" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
        </layout>

        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <param name="LevelMin" value="WARN" />
            <param name="LevelMax" value="WARN" />
        </filter>
    </appender>

    <!--输出到文件(error)-->
    <appender name="fileAppenderError" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="${user.home}/logs/website/error.log" />
        <param name="DatePattern" value=".yyyy-MM-dd" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
        </layout>
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <param name="LevelMin" value="ERROR" />
            <param name="LevelMax" value="ERROR" />
        </filter>
    </appender>

    <!--屏蔽所有org.springframework.*输出的Debug(及以下)信息-->
    <logger name="org.springframework">
        <level value="INFO"></level>
    </logger>

    <root>
        <level value="ALL"/>
        <appender-ref ref="consoleAppender" />
        <appender-ref ref="fileAppenderInfo" />
        <appender-ref ref="fileAppenderWarn" />
        <appender-ref ref="fileAppenderError" />
    </root>
</log4j:configuration>

转自蒋国纲的技术博客
&emsp;感觉xml格式的配置文件结构更清晰,但是还是喜欢properties类型的配置文件

这里控制单个appender的输出日志级别在properties中如是:

log4j.appender.console.filter.infoFilter = org.apache.log4j.varia.LevelRangeFilter
log4j.appender.console.filter.infoFilter.LevelMin=INFO
log4j.appender.console.filter.infoFilter.LevelMax=INFO

log4j中的isDebugEnabled作用

isDebugEnabled作用

其他链接

  1. 消息记录到数据库jabcAppender
  2. web.xml中对log4j的配置
  3. log4j的动态路径的配置
  4. log4j在程序中的动态配置

猜你喜欢

转载自blog.csdn.net/qq_40182873/article/details/86706355