Log4j组件
- Loggers,日志记录器,控制日志的输出级别与日志是否输出;
-
- 日志级别:
logger.fatal("fatal");//严重错误,一般会造成系统崩溃并终止运行
logger.error("error");//错误信息,不会影响系统运行
logger.warn("warn");//警告信息,可能会发生错误
logger.info("info");//运行信息,数据连接,网络连接,IO操作等
logger.debug("debug");//调试信息,一般在开发中使用,记录程序变量参数传递信息等
logger.trace("trace");//追踪信息,记录程序所有的流程信息
- Appenders,输出端,指定日志的输出方式,输出控制台,文件等;
-
- 1)ConsoleAppender, 将日志输出到控制台;
-
- 2)FileAppender,将日志输出到文件;
-
- 3)DailyRollingFileAppender,将日志输出到一个日志文件,并且每天输出到一个新的文件;
-
- 4)RollingFileAppender,将日志信息输出到一个日志文件,并且指定文件的大小尺寸,当文件大小达到指定尺寸时,会自动把文件改名,同时产生一个新的文件;
-
- 5)JDBCAppender,将日志信息保存到数据库中;
- Layout,日志格式化器,控制日志信息的输出格式;
-
- 1)HTMLLayout,格式化日志输出为HTML表格形式;
-
- 2)SimpleLayout,简单的日志输出格式化,打印的日志格式为(info-message);
-
- 3)PattenLayout,最强大的格式化器,可以根据自定义格式输出日志,如果没有指定转换格式,就是用默认的转化格式;
Layout配置日志信息
初始化日志信息:
加载配置文件resources/log4j.properties
# 指定RootLogger顶级父元素默认配置信息
# 指定日志级别 = trace,使用的 appender = console
log4j.rootLogger = trace,console
# 指定**控制台**日志输出的 appender
log4j.appender.console = org.apache.log4j.ConsoleAppender
# 自定义消息格式 Patternlayout
log4j.appender.console.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.console.layout.conversionPattern = %r [%t] %p %c %x - %m%n
# # %m 输出代码中指定的日志信息
# # %p 输出优先级,及DEBUG、INFO等
# # %n 换行符(windows平台的换行符为"\n",Unix平台为"\n")
# # %r 输出自应用启动到输出该log信息耗费的毫秒数
# # %c 输出打印语句所属的类的全名
# # %t 输出产生该日志的线程全名
# # %d 输出服务器当前时间,默认为IS08601,也可以指定格式,如%d{yyyy-mm-dd HH:mm:ss}
# # %l 输出日志时间发生的位置,包括类名、线程、及在代码中的行数。如Test.main(Test.java:10)
# # %F 输出日志消息产生时所在的文件名称
# # %L 输出代码的行号
# # %% 输出一个”%“字符
输出结果示例
log4j.appender.console.layout.conversionPattern = %r [%p] %t %l %d{yyyy-MM-dd HH:mm:ss} - %m%n
0 [INFO] main org.example.AppTest.myTest(AppTest.java:18) 2021-07-18 10:33:30 - hello logging:
Appender 配置
# 指定日志文件日志输出的 appender
log4j.appender.file = org.apache.log4j.FileAppender
# 指定消息格式 layout
log4j.appender.file.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.file.layout.conversionPattern = %r [%p] %t %l %d{yyyy-MM-dd HH:mm:ss} - %m%n
#指定日志文件保存路径
log4j.appender.file.file = /logs/log4j.log
# 指定日志文件的字符集
log4j.appender.file.encoding = UTF-8
按照文件大小拆分
# 按照文件大小拆分的appender对象
log4j.appender.rollingFile = org.apache.log4j.RollingFileAppender
# 指定消息格式 layout
log4j.appender.rollingFile.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.rollingFile.layout.conversionPattern = %r [%p] %t %l %d{yyyy-MM-dd HH:mm:ss} - %m%n
#指定日志文件保存路径
log4j.appender.rollingFile.file = /logs/log4j.log
# 指定日志文件的字符集
log4j.appender.rollingFile.encoding = UTF-8
# 指定日志文件内容的大小
log4j.appender.rollingFile.maxFileSize = 1MB
# 指定日志文件的数量
log4j.appender.rollingFile.maxBackupIndex = 10
按照日期拆分
# 指定日志文件日志输出的 appender
log4j.appender.dailyFile = org.apache.log4j.DailyRollingFileAppender
# 指定消息格式 layout
log4j.appender.dailyFile.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.dailyFile.layout.conversionPattern = %r [%p] %t %l %d{yyyy-MM-dd HH:mm:ss} - %m%n
#指定日志文件保存路径
log4j.appender.dailyFile.file = /logs/log4j.log
# 指定日志文件的字符集
log4j.appender.dailyFile.encoding = UTF-8
# 指定日期拆分规则
log4j.appender.dailyFile.datePattern = '.'yyyy-MM-dd-HH-mm-ss
日志门面技术
日志门面:JCL 和slf4j
SLF4j,(Simple Logging Facade For Java),主要是为Java日志访问提供一套标准、规范的ApI框架,其主要意义在于提供接口,具体的实现可以交由其他日志框架。
日志框架会选择slf4j-api作为门面,配上具体的实现框架(log4j、logback),中间使用桥接器完成桥接。
JCL示例:
<dependency>//导包,默认使用的日志框架是JUK
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>//想要使用哪种日志框架,就导入哪种
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
public class AppTest
{
//调用JCL记录日志
@Test
public void shouldAnswerWithTrue(){
Log log = LogFactory.getLog(AppTest.class);
log.info("hello jcl");
}
}
slf4j示例:
slf4j内置日志框架简单使用
<!-- 日志门面-->
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<!-- 内置的简单实现-->
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
</dependency>
public class AppTest
{
public static final Logger LOGGER = LoggerFactory.getLogger(AppTest.class);
@Test
public void shouldAnswerWithTrue(){
LOGGER.error("error");
LOGGER.warn("waring");
LOGGER.info("info");
//使用占位符输出日志信息
String name = "it";
Integer age = 14;
LOGGER.info("用户:{},{}",name,age);
//将系统的异常信息输出
try {
int i = 1/0;//Ctrl+Alt+t
} catch (Exception e) {
//e.printStackTrace();
LOGGER.error("出现异常:",e);
}
}
}
slf4j可以绑定的日志框架图
使用slf4j绑定日志的实现:
使用流程:
- 1)添加slf4j-api依赖
- 2)使用slf4j的API在项目中进行统一的日志记录
- 3)绑定具体的日志实现框架:
-
- 3.1)绑定已经实现了slf4j的日志框架,直接添加对应的依赖
-
- 3.2)绑定没有实现slf4j的日志框架,先添加日志的适配器,再添加实现类的依赖
- 4)slf4j有且仅有一个日志实现框架的绑定(如果出现多个默认使用第一个依赖日志实现)
绑定log4j示例:
<dependency>
<!--日志门面-->
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
<!--适配器-->
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
<scope>test</scope>
</dependency>
<dependency>
<!--实现框架-->
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
public class AppTest
{
public static final Logger LOGGER = LoggerFactory.getLogger(AppTest.class);
@Test
public void shouldAnswerWithTrue(){
LOGGER.error("error");
LOGGER.warn("waring");
LOGGER.info("info");
//使用占位符输出日志信息
String name = "it";
Integer age = 14;
LOGGER.info("用户:{},{}",name,age);
//将系统的异常信息输出
try {
int i = 1/0;//Ctrl+Alt+t
} catch (Exception e) {
//e.printStackTrace();
LOGGER.error("出现异常:",e);
}
}
}
桥接器
解决的是项目中的日志遗留问题,当系统中存在以前的日志API,可以通过桥接转换到slf4j的实现,
步骤:
1)先去除之前老的日志框架的依赖
2)添加slf4j 提供的桥接组件
3)为项目添加slf4j的具体实现
桥接器使用示例:之前采用log4j实现,现在使用slf4j+slf4j-simple实现;
<dependency>
<!--日志门面-->
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/log4j-over-slf4j -->
<dependency>
<!-- log4j桥接器-->
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<!-- slf4j-simple内置实现-->
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
</dependency>
public class AppTest {
@Test
public void myTest() {
//开启log4j内置日志记录
LogLog.setInternalDebugging(true);
//初始化配置信息
//BasicConfigurator.configure();
//获取日志记录器对象
org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(AppTest.class);
//日志记录输出
logger.info("hello logging:");
//日志级别
logger.fatal("fatal");//严重错误,一般会造成系统崩溃并终止运行
logger.error("error");//错误信息,不会影响系统运行
logger.warn("warn");//警告信息,可能会发生错误
logger.info("info");//运行信息,数据连接,网络连接,IO操作等
logger.debug("debug");//调试信息,一般在开发中使用,记录程序变量参数传递信息等
logger.trace("trace");//追踪信息,记录程序所有的流程信息
}
}