1、日志的认知
日志:记录程序运行的状况及步骤
分类:
1、数据库日志:数据库自身记录数据的操作情况
delete、truncate删除的区别? delete删除数据会写日志,能够通过日志恢复所删除的数据(花钱买服务功能)
2、业务日志:记录程序运行的关键步骤,或过程,目的是追踪、追责
3、异常日志:大型系统里调错使用
常见输出位置:控制台、文件(重要)
日志的级别:什么时候输出日志 由低到高
TRACE、DEBUG、INFO、WARN、ERROR、FATAL
2、Log4j+Commons-Logging 日志框架
Log4j:用于记录日志
Commons-Logging: 用于控制日志的记录情况---日志文件达到多少K之后,需要新建一个文件
---根据日期创建日志文件
---日志的回滚等
1、新建项目
2、添加依赖
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
3、编写配置文件
【说明】如果单纯使用Log4j,只需创建log4j.properties配置文件即可
# Global logging configuration
log4j.rootLogger=DEBUG, stdout,logfile
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=qf.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %l %F %p %m%n
测试
package com.qf.log2105.test;
import org.apache.log4j.Logger;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
//获取日志对象
Logger logger=Logger.getLogger(Test.class);
System.out.println("请输入第一个数:");
int num1=input.nextInt();
logger.debug("用户输入了第一个数:"+num1);
System.out.println("请输入第二数:");
int num2=input.nextInt();
logger.debug("用户输入了第二数:"+num2);
int result=num1+num2;
logger.debug("和为:"+result);
System.out.println("计算结果为:"+result);
}
}
【说明】目前的配置文件中,不仅要配置Log4j,还要配置Commons-Logging的信息,所以使用XML文件 log4j.xml
xml文件名必须为log4j.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration PUBLIC "-//LOGGER"
"http://org/apache/log4j/xml/log4j.dtd">
<log4j:configuration>
<!--日志输出到控制台-->
<appender name="myConsole" class="org.apache.log4j.ConsoleAppender">
<!--设置输出的格式-->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{yyyy-MM-dd hh:mm:ss,SSS} [%c]-[%p] %m%n"/>
</layout>
</appender>
<!--日志输出到文件-->
<appender name="myFile" class="org.apache.log4j.RollingFileAppender">
<!--日志文件的位置-->
<param name="File" value="d:/log2105.log"/>
<!--文件追加写入-->
<param name="Append" value="true"/>
<!--日志文件的大小,以kb为单位-->
<param name="MaxFileSize" value="1kb"/>
<!--新文件的数量:备份的数量-->
<param name="MaxBackupIndex" value="2"/>
<!--设置格式-->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd hh:mm:ss,SSS} [%c]-[%p] %m%n"/>
</layout>
</appender>
<!--输出到文件:每天创建新的日志文件-->
<appender name="myFile2" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="d:/log210502.log"/>
<param name="Append" value="true"/>
<!--设置格式-->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd hh:mm:ss,SSS} [%c]-[%p] %m%n"/>
</layout>
</appender>
<!--进行根设置-->
<root>
<!--设置日志输出的优先级-->
<priority value="debug"></priority>
<appender-ref ref="myConsole"/>
<appender-ref ref="myFile"/>
<appender-ref ref="myFile2"/>
</root>
</log4j:configuration>
3、LogBack+SLF4J 日志框架
SLF4J:用于记录日志
LogBack:用于日志的控制,大小、日期、回滚等
1、添加依赖
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
2、编写配置文件logback.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
scan设置为true的时候,当此配置文件发生更改后,将会自动被重新加载,默认就是true
scanPeriod:当scan设置为true时,检测文件是否被修改的时间间隔,默认单位是毫秒
debug:设置为true时,将打印出logback内部日志信息,默认为false
-->
<configuration scan="true" scanPeriod="60 seconds" debug="true">
<!--
声明变量: log.path 表示日志文件的存储位置
console_log_pattern 日志的格式
-->
<property name="log.path" value="d:/log"></property>
<property name="console_log_pattern"
value="%d{yyyy-MM-dd hh:mm:ss,SSS} |-[%-5p] 在 %logger.%M[行:%L]-%m%n"></property>
<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!--设置输出级别-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<value>debug</value>
</filter>
<!--设置格式及编码方式-->
<encoder>
<!--格式-->
<Pattern>${console_log_pattern}</Pattern>
<!--设置字符-->
<charset>UTF-8</charset>
</encoder>
</appender>
<!--日志输出到文件中-->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--配置日志文件的名字:初始文件的名字-->
<file>${log.path}/haotian.log</file>
<!--配置日志的格式、字符编码-->
<encoder>
<!--格式-->
<Pattern>${console_log_pattern}</Pattern>
<!--设置字符-->
<charset>UTF-8</charset>
</encoder>
<!--配置日志的策略:按日期、按大小
按大小:当日志文件超出指定大小时,则创建新的日志文件,在新文件中继续写入日志
按日期:按日期创建新文件,同时兼容按大小创建文件
-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--配置文件的名字 %i 文件序号,从0开始-->
<fileNamePattern>${log.path}/haotian-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!--设置文件的最大体量-->
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>3kb</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--设置日志保留的天数,如果不设置就一直保存,如果设置为1,则保留前1天的日志-->
<maxHistory>1</maxHistory>
</rollingPolicy>
</appender>
<root level="debug">
<appender-ref ref="console"/>
<appender-ref ref="file"/>
</root>
</configuration>
3、应用日志
package com.qf.log02.test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
//获取日志对象
Logger logger= LoggerFactory.getLogger(Test.class);
Scanner input=new Scanner(System.in);
//获取日志对象
System.out.println("请输入第一个数:");
int num1=input.nextInt();
logger.debug("用户输入了第一个数:"+num1);
System.out.println("请输入第二数:");
int num2=input.nextInt();
logger.debug("用户输入了第二数:"+num2);
int result=0;
try{
result=num1+num2;
}catch (Exception ex){
//红色文字输出
logger.error("发生异常,异常信息:"+ex.getMessage());
}
logger.debug("和为:"+result);
System.out.println("计算结果为:"+result);
}
}