org.slf4j.Logger打印并输出日志
slf4j log4j logback关系:slf4j是接口,log4j和logback是实现
slf4j log4j logback关系
slf4j定义了8个级别的log优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。
slf4j默认的优先级为ERROR。
- ALL 最低等级的,打开所有日志记录
* DEBUG 主要用于开发过程中打印一些运行信息。
- INFO 突出强调应用程序的运行过程中打印一些你感兴趣的或者重要的信息,不能滥用,避免打印过多的日志。
- WARN 表明会出现潜在错误的情形,有些信息不是错误信息,给程序员的一些提示。
- ERROR 打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。
- FATAL 重大错误,这种级别你可以直接停止程序了。
- OFF 用于关闭所有日志记录。
配置日志输出:可以在文件最后设置root leve来控制日志输出的等级,如果设置为INFO那么日志就只能输出INFO级别以及高于INFO级别的日志信息
- logback.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!--
scan属性:默认为true,Logback将会扫描配置文件,如果配置文件发生改变时,会自动加载
scanPeriod属性:Logback扫描配置文件时间间隔,默认单位为毫秒,可配置单位为毫秒、秒、分、时 milliseconds, seconds, minutes or hours
debug属性:默认为false,是否打印Logback内部信息,当为true时可以查看Logback的运行信息
packagingData属性:默认false,在打印异常堆栈时是否打印相关包信息
-->
<configuration
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://www.padual.com/java/logback.xsd"
scan="true" scanPeriod="60 seconds" debug="false" packagingData="true">
<!-- 定义参数变量 -->
<property name="APP_NAM" value="logback_demo" />
<!-- 日志级别参数 -->
<property name="log.level" value="debug" />
<!-- 文件保留时间 -->
<property name="log.maxHistory" value="30" />
<!-- 文件大小 -->
<property name="log.maxSize" value="4MB"/>
<!-- 日志文件是否覆盖 -->
<property name="log.append" value="true"/>
<!-- 日志输出编码 -->
<property name="log.encode" value="UTF-8" />
<!-- 日志存储路径 -->
<property name="log.filePath" value="c:/log" />
<!-- 日志的显式格式 -->
<property name="log.pattern"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n"></property>
<!--配置logger上下文名称,默认名称为default,用于区分不同应用程序的日志记录-->
<contextName>${APP_NAM}</contextName>
<!--获取时间戳字符串 key为名称 datePattern为将解析配置文件的时间作为当前时间格式化的标准-->
<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>
<!-- consoleAppender:控制台输出 -->
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder:对日志日期格式化,类似于layout,除了将时间转化为数组,还会将转换后的数组输出到相应的文件中 -->
<encoder>
<!-- 定义日志的输出格式 -->
<pattern>${log.pattern}</pattern>
<!-- 设置信息编码 -->
<charset>${log.encode}</charset>
</encoder>
</appender>
<!-- 文件输出策略设置 -->
<appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件路径 -->
<file>${log.filePath}/logback_debug.log</file>
<!-- 日志输出格式设置-->
<encoder>
<!-- 输出格式设置 -->
<pattern>${log.pattern}</pattern>
<!-- 编码设置 -->
<charset>${log.encode}</charset>
</encoder>
<!--TimeBasedRollingPolicy:配置日志所生成的目录以及生成文件名的规则 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 设置文件名称 -->
<fileNamePattern>
${log.filePath}/logback/logback_debug-%d{yyyy-MM-dd}.%i.log.zip
</fileNamePattern>
<!-- 写入文件方式 -->
<append>${log.append}</append>
<!-- 设置最大保存周期 -->
<MaxHistory>${log.maxHistory}</MaxHistory>
<!-- 日志总保存量为10GB -->
<totalSizeCap>10GB</totalSizeCap>
<!-- 策略触发器:告知 RollingFileAppender 合适激活滚动 -->
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!--文件达到 最大值时会被压缩和切割 -->
<maxFileSize>${log.maxSize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 过滤器,过滤掉不是指定日志水平的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 设置日志级别 -->
<level>DEBUG</level>
<!-- 如果跟该日志水平相匹配,则接受 -->
<onMatch>ACCEPT</onMatch>
<!-- 如果跟该日志水平不匹配,则过滤掉 -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 文件输出策略设置 -->
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件路径 -->
<file>${log.filePath}/logback_info.log</file>
<!-- 日志输出格式设置-->
<encoder>
<!-- 输出格式设置 -->
<pattern>${log.pattern}</pattern>
<!-- 编码设置 -->
<charset>${log.encode}</charset>
</encoder>
<!--TimeBasedRollingPolicy:配置日志所生成的目录以及生成文件名的规则 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 设置文件名称 -->
<fileNamePattern>
${log.filePath}/logback/logback_info-%d{yyyy-MM-dd}.%i.log.zip
</fileNamePattern>
<!-- 写入文件方式 -->
<append>${log.append}</append>
<!-- 设置最大保存周期 -->
<MaxHistory>${log.maxHistory}</MaxHistory>
<!-- 日志总保存量为10GB -->
<totalSizeCap>10GB</totalSizeCap>
<!-- 策略触发器:告知 RollingFileAppender 合适激活滚动 -->
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!--文件达到 最大值时会被压缩和切割 -->
<maxFileSize>${log.maxSize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 过滤器,过滤掉不是指定日志水平的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 设置日志级别 -->
<level>DEBUG</level>
<!-- 如果跟该日志水平相匹配,则接受 -->
<onMatch>ACCEPT</onMatch>
<!-- 如果跟该日志水平不匹配,则过滤掉 -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 文件输出策略设置 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件路径 -->
<file>${log.filePath}/logback_fixed.log</file>
<!-- 日志输出格式设置-->
<encoder>
<!-- 输出格式设置 -->
<pattern>${log.pattern}</pattern>
<!-- 编码设置 -->
<charset>${log.encode}</charset>
</encoder>
<!--FixedWindowRollingPolicy:设置为按照索引的方式滚动,定义文件名称的时候使用%i作为占位符,滚动后会会用角标替换 -->
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>${log.filePath}/logback_fixed-%i.log</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<!-- 指定文件最大尺寸,达到该尺寸,就触发rollingPolicy对应的策略,maxFileSize属性指定文件大小 -->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>${log.maxSize}</maxFileSize>
</triggeringPolicy>
<!-- 过滤器,过滤掉不是指定日志水平的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 设置日志级别 -->
<level>INFO</level>
<!-- 如果跟该日志水平相匹配,则接受 -->
<onMatch>ACCEPT</onMatch>
<!-- 如果跟该日志水平不匹配,则过滤掉 -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 根Logger节点,最顶级-->
<root level = "DEBUG"><!-- 日志输出级别 -->
<appender-ref ref="STDOUT" /><!-- 控制台 -->
<appender-ref ref="FILE" /><!-- 文件 -->
</root>
</configuration>
自定义的日志输出
LoggerFactory.getLogger(LogAdvice.class)来加载日志
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Aspect//切面注解
@Component//组件注解
public class LogAdvice{
private static org.slf4j.Logger log=LoggerFactory.getLogger(LogAdvice.class);
@Pointcut("execution(* com.xin.service.*.*(..))")
public void pointcut() {
}
// "自定义"环绕通知方法
@Around("pointcut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
long start=System.currentTimeMillis();
log.warn("-------------------------warn----------------------");
log.debug("-------------------------debug----------------------");
log.info("-------------------------info----------------------");
Object proceed = joinPoint.proceed();//执行方法
log.warn("--------------执行方法"+joinPoint.getSignature().getName()+"耗时:"+(System.currentTimeMillis()-start)+"------warn----------------------");
return proceed;
}
}
需要的依赖
<!-- logback日志框架依赖 -->
<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>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.logback-extensions</groupId>
<artifactId>logback-ext-spring</artifactId>
<version>0.1.4</version>
</dependency>