1.spring boot集成日志
1、导包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!-- springboot默认是用logback的日志框架的(性能差),所以需要排除logback,不然会出现jar依赖冲突的报错 --> <exclusions><!-- 去掉springboot默认配置 --> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <!-- 引入log4j2依赖 --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
2、配置日志文件
在resources目录下,使用log4j2.xml文件
<?xml version="1.0" encoding="UTF-8"?> <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --> <!-- status log4j2内部输出自身的日志信息的级别 --> <!-- configuration中主要包括有 Properties、Appenders、Loggers标签 --> <configuration status="INFO"> <!-- 全局参数 --> <Properties> <Property name="log_dir">logs</Property> <Property name="pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %c{1}:%L -%m%n</Property> <Property name="displayName">mes</Property> </Properties> <!-- 输出源,常见的主要有Console、RollingFile、File 三种子节点 Console:用于定义输出到控制台的Appender File:用于定义输出到指定位置的文件的Appender RollingFile:定义指定方式触发新的Appender --> <Appenders> <Console name="console" target="SYSTEM_OUT" follow="true"> <PatternLayout> <pattern>${pattern}</pattern> </PatternLayout> </Console> <!-- 文件 每次运行程序会自动清空,由append属性决定 --> <!--<File name="error" fileName="${displayName}_error.log" append="false">--> <!--<!– 指定error 级别的日志 –>--> <!--<ThresholdFilter level="ERROR" onMatch="ACCEPT"--> <!--onMismatch="DENY" />--> <!--<PatternLayout>--> <!--<pattern>${pattern}</pattern>--> <!--</PatternLayout>--> <!--</File>--> <!-- 滚动文件 达到触发条件,生成新的文件,原来的内容会存档,存档的文件根据filePatternt规则增加年月日 --> <RollingFile name="infoFile" fileName="${log_dir}/${displayName}_info.log" filePattern="${log_dir}/${displayName}_%d{yyyy-MM-dd}_info.log"> <!-- 本例表示只输出info日志 onMatch 表示满足指定级别及以上级别 onMisMatch 表示不满足指定级别,即指定级别以下的级别 onMatch="ACCEPT" 指定级别及以上级别,接受 onMatch="DENY" 指定级别及以上级别,拒绝 onMismatch="NEUTRAL" 指定级别以下的放行,进行后面的判断 onMismatch="deny" 指定级别以下的级别,拒绝 --> <Filters> <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="deny"/> </Filters> <PatternLayout> <pattern>${pattern}</pattern> </PatternLayout> <!-- 按大小划分 --> <SizeBasedTriggeringPolicy size="50 MB"/> </RollingFile> </Appenders> <!-- 主要配置Root、Logger两种标签 --> <Loggers> <!-- Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等 Logger标签内还可以配置一个或多个AppenderRef属性,用来指定日志输出到哪个Appender --> <!-- <Logger name="org.springframework" level="INFO" /> --> <!-- additivity="false"表示子Logger只会在自己的appender里输出, 而不会在Root的appender里输出 --> <Logger name="org.springframework" level="INFO" additivity="false"> <AppenderRef ref="console"></AppenderRef> </Logger> <Logger name="org.mybatis" level="info" additivity="false"> <AppenderRef ref="console"></AppenderRef> </Logger> <!-- 每个配置都必须有一个根记录器Root,默认所有的Logger都继承此配置 --> <Root level="DEBUG"> <!-- AppenderRef 用来指定该日志输出到哪个Appender --> <AppenderRef ref="console"></AppenderRef> <AppenderRef ref="infoFile"></AppenderRef> <!-- <AppenderRef ref="rollingFile"></AppenderRef> --> </Root> </Loggers> </configuration>
%d 输出日志时间点的日期(一般是那一天),也可以在其后用大括号自定义格式,比如:%d{yyyy MMM dd HH:mm:ss:SSS},输出类似:2014 11 05 :23:28 :22
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL ;
%r 输出自应用启动到输出该log信息耗费的毫秒数 ;
%c 输出所属的全类名,也可以只输出类名,:%c{1} ;
%t 输出产生该日志的当前线程名字 ;
%m 输出代码中自定义的的信息;
%n 输出一个回车换行符,Windows平台为"rn",Unix平台为"n" ;
3、手动输出日志
在需要输出日志的类中,创建日志对象
方式1:log4j2中的Logger对象
方式2:slf4j中的Logger对象
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.stereotype.Service; @Service // 相当于在类中增加了 private static final Logger log = LoggerFactory.getLogger(HelloController.class) @Slf4j//方式2 public class HelloController { // 注意类所在的包 org.apache.logging.log4j.Logger 方式1 private Logger logger = LogManager.getLogger(HelloServlce.class); @GetMapping("/hello") public String hello() { logger.info("info hello"); // {} 表示占位符,用于格式化参数 logger.info("info {}", "hello world"); logger.debug("debug info"); logger.error("error info"); return "logger"; } @GetMapping("/hello2") public String hello2() { logger.info("info hello"); // log 通过@Slf4j注解定义 log.error("slf4j error"); log.info("slf4j info"); log.debug("slf4j debug"); return "slf4j log"; } }