常见日志输出级别
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
2、%-5p
3、%5p
logback
Logback是由log4j创始人设计的另一个开源日志组件
它当前分为下面三个模块:
- logback-core:其它两个模块的基础模块
- logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API 使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging
- 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>