Log-日志管理
引言
1.日志介绍
- 用于记录系统中发生的各种事件,记录的位置常见的有:控制台,磁盘文件等
2.日志级别
- 日志级别从低到高
TRACE,DEBUG,INFO,WARN,ERROR,FATAL
3.日志作用
- 通过日志观察,分析项目运行情况(项目维护)
- 通过日志分析用户的使用情况(大数据分析)
解决方案1
1.Log4j+Commons-Logging
- 日志级别
OFF 为最高等级 关闭了日志信息
FATAL 为可能导致应用中止的严重事件错误
ERROR 为严重错误 主要是程序的错误
WARN 为一般警告,比如session丢失
INFO 为一般要显示的信息,比如登录登出
DEBUG 为程序的调试信息
TRACE 为比DEBUG更细粒度的事件信息
ALL 为最低等级,将打开所有级别的日 - 输出格式
Log4J最常用的日志输出格式为:org.apache.log4j.PatternLayOut,其主要参数为:
%n - 换行
%m - 日志内容
%p - 日志级别(FATAL, ERROR,WARN, INFO,DEBUG or custom)
%r - 程序启动到现在的毫秒数
%t - 当前线程名
%d - 日期和时间, 一般使用格式 %d{yyyy-MM-dd HH:mm:ss, SSS}
%l - 输出日志事件的发生位置, 同 %F%L%C%M
%F - java 源文件名
%L - java 源码行数
%C - java 类名,%C{1} 输出最后一个元素
%M - java 方法名
1.1 导入依赖
pom.xml
Log4j和Commons-Logging的依赖以及test测试的junit依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>log01</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
1.2 基本使用
logTest
public class logTest {
private Log log= LogFactory.getLog(logTest.class);
@Test
public void test(){
log.trace("hello trace");
log.debug("hello debug");
log.info("hello info");
log.warn("hello warn");
log.error("hello error");
log.fatal("hello fatal");
}
}
1.3 配置信息
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "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="myFile1" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="d:/log/hello.log"/><!--文件位置-->
<param name="Append" value="true"/><!--是否追加-->
<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="myFile1" class="org.apache.log4j.DailyRollingFileAppender"><!--每天存日志-->
<param name="File" value="d:/log/hello2.log"/><!--文件位置-->
<param name="Append" value="true"/><!--是否追加-->
<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>
<!--根logger的设置-->
<root>
<!--优先级设置-->
<priority value="all"/>
<appender-ref ref="myConsole"/>
<appender-ref ref="myFile1"/>
</root>
</log4j:configuration>
解决方案2
1.Logback+SLF4j
1.1 导入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>log2</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
1.2 基本使用
public class logTest {
private Logger logger= LoggerFactory.getLogger(logTest.class);
@Test
public void test() throws InterruptedException {
while(true) {
logger.trace("hello trace");
logger.debug("hello debug");
logger.info("hello info");
logger.warn("hello warn");
logger.error("hello error");
Thread.sleep(1000);
}
}
}
1.3 配置信息
<?xml version="1.0" encoding="UTF-8" ?>
<!--scan:此属性设置为true时,配置文件发生改变,将会被重新加载,默认值为true-->
<!--scanPeriod:监测配置文件是否修改的时间间隔,没有给出时间单位,默认单位是毫秒,当scan为true时此属性生效,默认时间为1分钟-->
<!--debug:是否打印logback内部日志信息,实时查看logback的运行状态,默认值为false-->
<configuration scan="true" scanPeriod="60 seconds" debug="true">
<property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} |-[%-5p] in %logger.%M[line-%L] -%m%n"></property>
<property name="fileloc" value="D:/log"/>
<!--输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--大于或等于debug日志级别-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
<encoder>
<!--日志格式-->
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--追加到文件上-->
<appender name="file1" class="ch.qos.logback.core.FileAppender">
<file>${fileloc}/hello2.log</file>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--滚动追加到文件中-->
<appender name="file2" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--正在记录的日志文件-->
<file>${fileloc}/world.log</file>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<!--日志记录器滚动策略,按日期,按大小记录
如果文件超过最大时,会新建文件,然后会在新的文件继续写入
如果日期更替,也会新建文件,然后在新的日志文件写入当天日志
-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--新建文件名-->
<fileNamePattern>${fileloc}/world-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!--文件最大值-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>1kb</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志保留天数,不设置则保留所有日志-->
<maxHistory>1</maxHistory>
</rollingPolicy>
</appender>
<root level="trace">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="file1"/>
<appender-ref ref="file2"/>
</root>
</configuration>