Log4j & Logback
发表于:2019-07-23 | 分类: 后端

常见日志输出级别

TRACE < DEBUG < INFO < WARN < ERROR

级别越低输出结果越详细(trace输出的结果比debug的多)

log4j

使用log4j

第一步: 引入

jar包方式 maven方式

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

第二步: 在resources下加入log4j.properties文件

log4j.rootLogger=ERROR,stdout
log4j.logger.com.parkour.mybatis=TRACE
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

第三步: 在代码中使用获取log对象,调用对象方法输出日志

package com.parkour.mybatis.test;

import org.apache.log4j.Logger;

public class LogbackTest {
    //1.获取LOG对象
    static final Logger logger = Logger.getLogger(LogbackTest.class);

    public static void main(String[] args) {
        logger.trace("trace message");
        logger.debug("debug message");
        logger.info("info message");
        logger.warn("warn message");
        logger.error("error message");
    }
}

运行main方法输入结果

TRACE [main] - trace message
DEBUG [main] - debug message
 INFO [main] - info message
 WARN [main] - warn message
ERROR [main] - error message

log4j.properties配置详解

Appender 为日志输出目的地,Log4j提供的appender有以下几种:

org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

Layout:日志输出格式,Log4j提供的layout有以下几种:

org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

打印参数: Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,如下:

-X号: X信息输出时左对齐;
 %p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
 %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,
比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
 %r: 输出自应用启动到输出该log信息耗费的毫秒数
 %c: 输出日志信息所属的类目,通常就是所在类的全名
 %t: 输出产生该日志事件的线程名
 %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,
包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main (TestLog4.java:10)
 %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
 %%: 输出一个"%"字符
 %F: 输出日志消息产生时所在的文件名称
 %L: 输出代码中的行号
 %m: 输出代码中指定的消息,产生的日志具体信息
 %n: 输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行
 可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
 1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
 2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。
 3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
 4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边较远输出的字符截掉。

log4j中%5p的含义

因为日志级别分别有error,warn,info,debug,fatal5种,有些是5个字母的,有些是4个字母的,如果直接写%p就会对不齐,%-5p的意思是日志级别输出左对齐,右边以空格填充,%5p的意思是日志级别输出右对齐,左边以空格填充,附三张图对比

1、直接%p
Log4j&Logback1

2、%-5p
Log4j&Logback2

3、%5p
Log4j&Logback3

logback

Logback是由log4j创始人设计的另一个开源日志组件

官方网站 http://logback.qos.ch

它当前分为下面三个模块:

  1. logback-core:其它两个模块的基础模块
  2. logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API 使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging
  3. logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能

添加依赖包logback使用需要和slf4j一起使用,所以总共需要添加依赖的包有slf4j-api

logback使用需要和slf4j一起使用,所以总共需要添加依赖的包有

slf4j-api.jar,logback-core.jar,logback-classic.jar,logback-access.jar这个暂时用不到所以不添加依赖了

第一步: 引入

<!-- 使用slf4j(日志接口)+logback(日志实现)记录日志 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.30</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.2.3</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

第二步: 在resources下加入logback.xml文件

第三步: 在代码中使用获取log对象,调用对象方法输出日志

package com.log;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogbackTest {
    //1.获取LOG对象
    static final Logger logger= LoggerFactory.getLogger(LogbackTest.class);

    public static void main(String[] args) {
        logger.trace("Test: trace message.");
        logger.debug("Test: debug message.");
         logger.info("Test: info message.");
         logger.warn("Test: warn message.");
         logger.error("Test: error message.");
    }
}

测试结果(trace没有输出)

18:56:56.125 [main] DEBUG com.logo.LogbackTest - Test: debug message.
18:56:56.127 [main] INFO  com.logo.LogbackTest - Test: info message.
18:56:56.127 [main] WARN  com.logo.LogbackTest - Test: warn message.
18:56:56.127 [main] ERROR com.logo.LogbackTest - Test: error message.

logback.xml配置详解(IDEA配置了模板可以直接新建模板)

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 定义日志的根目录(根据实际情况修改,此处./log会生成在当前项目根目录下
) -->
    <property name="LOG_HOME" value="./log"/>
    <!-- 定义日志文件名称(根据实际情况修改) -->
    <property name="appName" value="parkour-mybatis"></property>
    <!-- 设置控制台输出的日志格式 -->
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <!--
         日志输出格式说明:
                %d        输出日期时间
                %thread 输出当前线程名
                %-5level   输出日志级别,左对齐5个字符宽度
                %logger{50} 输出全类名最长50个字符,超过按照句点分割
                %msg   日志信息
                %n     换行符
        -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level ==== %logger{50} - %msg%n</pattern>
        </layout>
    </appender>

    <!-- 设置应用日志文件输出的格式  配置成每天生成一个日志文件,滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
    <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 指定日志文件的名称 -->
        <file>${LOG_HOME}/${appName}.log</file>
        <!--
        当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名
        TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责触发滚动。
        -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--
            滚动时产生的文件的存放位置及文件名称 %d{yyyy-MM-dd}:按天进行日志滚动 
            %i:当文件大小超过maxFileSize时,按照i进行文件滚动
            -->
            <fileNamePattern>${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <!-- 
            可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。
         假设设置每天滚动,且maxHistory是365,则只保存最近365天的文件,删除之前的旧文件。
         注意,删除旧文件是,那些为了归档而创建的目录也会被删除。
            -->
            <MaxHistory>365</MaxHistory>
            <!-- 当日志文件超过maxFileSize指定的大小是,根据上面提到的%i进行日志文件滚动(即按照i递增新创建一个文件记录日志) -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 日志输出格式: -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ------ [ %thread ] ------ [ %-5level ] [ %logger{50} : %line ] -
                %msg%n
            </pattern>
        </layout>
    </appender>

    <!-- root代表默认的日志级别, 设置默认的日志级别为info 既要在控制台输出,也要记录日志文件 -->
    <root level="info">
        <appender-ref ref="stdout"/>
        <appender-ref ref="appLogAppender"/>
    </root>


    <!-- 将日志保存到数据库的配置(使用c3p0连接池) -->
    <!-- <appendername="DB"class="ch.qos.logback.classic.db.DBAppender">
        <connectionSourceclass="ch.qos.logback.core.db.DriverManagerConnectionSource">
            <dataSourceclass="com.mchange.v2.c3p0.ComboPooledDataSource">
                <driverClass>com.mysql.jdbc.Driver</driverClass>
                <url>jdbc:mysql://127.0.0.1:3306/databaseName</url>
                <user>root</user>
                <password>root</password>
            </dataSource>
        </connectionSource>
    </appender> -->

</configuration>

SLF4J

使用SLF4J时报错SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”

此时只需要再添加一个依赖即可

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-nop</artifactId>
    <version>1.7.2</version>
</dependency>
上一篇:
让你彻底搞懂,为什么重写equals()方法的时候要重写hashCode()方法
下一篇:
PL/SQL Developer