spring使用log4j
1. maven配置
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.6</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
2. web.xml配置
<!--每隔60s扫描log4j的配置文件,这里配置的log4jRefreshInterval参数表示能不用重启web服务器就能动态更改log4j日志级别,这也是和Spring整合的一大好处 -->
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>60000</param-value>
</context-param>
<listener>
<!--从spring4.2.1开始Log4jConfigListener已经被废弃,最好使用log4j2对应的org.apache.logging.log4j.web.Log4jServletContextListener
.Log4jServletContextListener -->
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
3. log4j.properties文件
文件放在resources下面
log4j.rootLogger = INFO, stdout, D, E
#日志输出到控制台
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.ConversionLayout = %d [%t] %-5p %c - %m%n
#日志输出到文件
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = /Users/zshuai/Desktop/log/log.log
log4j.appender.D.DatePattern = '_'yyyy-MM-dd'.log'
#日志的最大容量为10M
log4j.appender.D.maxFileSize=10240KB
#是否追加写进文件
log4j.appender.D.Append = true
#输出DEBUG级别日志到文件中
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern =\n\n[%-5p] %d{yyyy-MM-dd HH\:mm\:ss,SSS} method\:%l%n%m%n
### 保存异常信息到单独文件 ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
###设置DatePattern,当天日志保存到error.log文件,前一天的日志文件名将被修改为
#error.log + _yyyy-MM-dd.log
log4j.appender.E.File =/Users/zshuai/Desktop/log/error.log
log4j.appender.E.DatePattern = '_'yyyy-MM-dd'.log'
log4j.appender.E.Append = true
## 只输出ERROR级别以上的日志!!!
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
4.调用
package com.zshuai.service.impl;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zshuai.dao.UserInfoMapper;
import com.zshuai.pojo.UserInfo;
import com.zshuai.service.UserService;
@Service
public class UserServiceImpl implements UserService {
private Logger log = Logger.getLogger(UserServiceImpl.class); //第一步
@Autowired
private UserInfoMapper userMapper;
@Override
public void addUser() {
try {
UserInfo pojo = new UserInfo();
pojo.setUid(1);
pojo.setName("zshuai");
pojo.setPassword("aaaaaaa");
pojo.setSex(1);
pojo.setAddress("北京市海淀区");
userMapper.insert(pojo);
System.out.println("插入完毕");
int i = 1 / 0;
UserInfo entity = userMapper.selectByPrimaryKey(1);
System.out.println(entity.getName() + "查询的名字");
} catch (Exception e) {
log.info("除数为0了"); // 第二步
log.error("发生异常", e);
log.warn("警告!!");
throw new RuntimeException("除数为0");
}
}
}
SpringBoot使用log4j2
maven项目
1.前言
spring boot支持的日志框架有,Logback,Log4j2,Log4j和Java Util Logging,默认使用的是Logback日志框架,如果要使用别的日志框架,必须让spring boot项目不使用Logback。
2. 修改maven
集成log4j2,添加以下内容,去除Logback的依赖包,添加Log4j2的依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<!-- 排除自带的Logback日志工具依赖,为了项目使用Log4j2日志打印工具 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 导入log4j2依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- end -->
2.配置文件
在资源文件夹src/main/resources下添加log4j2.xml或者log4j2-spring.xml,启动后spring boot自动加载。
具体信息,配置文件中很详细
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE >ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出;可以设置成OFF(关闭)或Error(只输出错误信息) -->
<!--monitorInterval:Log4j2能够自动检测修改配置文件和重新配置本身,设置间隔秒数 -->
<Configuration status="WARN" monitorInterval="30">
<Properties>
<!-- 缺省配置(用于开发环境),配置日志文件输出目录和动态参数。其他环境需要在VM参数中指定; “sys:”表示:如果VM参数中没指定这个变量值,则使用本文件中定义的缺省全局变量值 -->
<!-- 全局属性 -->
<Property name="APP_NAME">transBoot</Property>
<Property name="LOG_PATH">${sys:user.home}/logs/${APP_NAME}</Property>
<Property name="PATTERN_FORMAT">[%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%level][%class][%line]:%message%n</Property>
</Properties>
<!-- 定义所有的appender -->
<Appenders>
<!--这个输出控制台的配置 -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${PATTERN_FORMAT}"/>
</Console>
<!-- info及以上级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
<!--输出到文件 用来定义超过指定大小自动删除旧的创建新的的Appender.-->
<RollingRandomAccessFile name="infoLog"
fileName="${LOG_PATH}/info.log"
filePattern="${LOG_PATH}/%d{yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz"
append="true">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
<Filters>
<!-- onMatch="ACCEPT" 表示匹配该级别及以上 -->
<!-- onMatch="DENY" 表示不匹配该级别及以上 -->
<!-- onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上 -->
<!-- onMismatch="ACCEPT" 表示匹配该级别以下 -->
<!-- onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的 -->
<!-- onMismatch="DENY" 表示不匹配该级别以下的 -->
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="${PATTERN_FORMAT}"/>
<Policies>
<!-- 基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour -->
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
<!-- 基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小 -->
<SizeBasedTriggeringPolicy size="10MB" />
<!-- DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性) -->
</Policies>
</RollingRandomAccessFile>
<!-- warn级别的日志信息 -->
<RollingRandomAccessFile name="warnLog" fileName="${LOG_PATH}/warn.log" filePattern="${LOG_PATH}/%d{yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz"
append="true">
<Filters>
<!-- onMatch="ACCEPT" 表示匹配该级别及以上 -->
<!-- onMatch="DENY" 表示不匹配该级别及以上 -->
<!-- onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上 -->
<!-- onMismatch="ACCEPT" 表示匹配该级别以下 -->
<!-- onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的 -->
<!-- onMismatch="DENY" 表示不匹配该级别以下的 -->
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL" />
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<PatternLayout pattern="${PATTERN_FORMAT}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
<SizeBasedTriggeringPolicy size="10MB" />
</Policies>
</RollingRandomAccessFile>
<!-- error级别的日志信息 -->
<RollingRandomAccessFile name="errorLog" fileName="${LOG_PATH}/error.log"
filePattern="${LOG_PATH}/%d{yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz"
append="true">
<Filters>
<!-- onMatch="ACCEPT" 表示匹配该级别及以上 -->
<!-- onMatch="DENY" 表示不匹配该级别及以上 -->
<!-- onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上 -->
<!-- onMismatch="ACCEPT" 表示匹配该级别以下 -->
<!-- onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的 -->
<!-- onMismatch="DENY" 表示不匹配该级别以下的 -->
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<PatternLayout pattern="${PATTERN_FORMAT}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
<SizeBasedTriggeringPolicy size="10MB" />
</Policies>
</RollingRandomAccessFile>
</Appenders>
<!-- 全局配置,默认所有的Logger都继承此配置 -->
<!-- 用来配置LoggerConfig,包含一个root logger和若干个普通logger。 additivity指定是否同时输出log到父类的appender,缺省为true。
一个Logger可以绑定多个不同的Appender。只有定义了logger并引入的appender,appender才会生效。 -->
<Loggers>
<!-- root logger 配置 -->
<Root level="ALL" >
<AppenderRef ref="Console" />
<AppenderRef ref="infoLog" />
<AppenderRef ref="warnLog" />
<AppenderRef ref="errorLog" />
</Root>
<!-- 第三方的软件日志级别 -->
<logger name="org.springframework" level="info" additivity="true">
<AppenderRef ref="warnLog" />
<AppenderRef ref="errorLog" />
</logger>
<logger name="java.sql.PreparedStatement" level="debug" additivity="true">
<AppenderRef ref="Console" />
</logger>
<logger name="codex.terry.filter" level="debug" additivity="true">
<AppenderRef ref="infoLog" />
<AppenderRef ref="warnLog" />
<AppenderRef ref="errorLog" />
</logger>
<!-- AsyncRoot - 异步记录日志 - 需要LMAXDisruptor的支持 -->
<!-- <AsyncRootlevel="info" additivity="false"> <AppenderRef ref="Console"/>
<AppenderRef ref="infoLog"/> <AppenderRef ref="errorLog"/> </AsyncRoot> -->
</Loggers>
</Configuration>
3.application文件中配置
server:
port: 8010
spring:
datasource:
username: root
password: rootzs
url: jdbc:mysql://localhost:3306/transDemo?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
driver-class-name: com.mysql.jdbc.Driver
mybatis:
mapper-locations: classpath:mapping/*Mapper.xml
type-aliases-package: com.zshuai.pojo
logging:
config: classpath:log4j2-spring.xml
这是yml文件,properties配置一样
4.使用
package com.zshuai;
import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableTransactionManagement // 开启注解事务管理,等同于xml配置文件中的 <tx:annotation-driven />
@SpringBootApplication
@MapperScan("com.zshuai.dao")
public class TransbootApplication {
public final static Logger logger = LoggerFactory.getLogger(TransbootApplication.class);
public static void main(String[] args) {
SpringApplication.run(TransbootApplication.class, args);
logger.trace("trace level");
logger.debug("debug level");
logger.info("info level");
logger.warn("warn level");
logger.error("error level");
}
}
Gradle项目
1. 修改build.gradle
增加红色部分
configurations {
compile.exclude group:'ch.qos.logback'
}
// 依赖关系
dependencies {
// 该依赖对于编译发行是必须的
compile('org.springframework.boot:spring-boot-starter-web'){
exclude module: 'spring-boot-starter-logging'
}
//添加log4j2依赖
compile('org.springframework.boot:spring-boot-starter-log4j2:1.5.7.RELEASE')
// 添加 Thymeleaf 的依赖
compile('org.springframework.boot:spring-boot-starter-thymeleaf')
// 该依赖对于编译测试是必须的,默认包含编译产品依赖和编译时依
testCompile('org.springframework.boot:spring-boot-starter-test')
}
2. 修改application.yml文件
server:
port: 1994
logging:
config: classpath:log4j2-spring.xml
3. 配置文件
在资源文件夹src/main/resources下添加log4j2.xml或者log4j2-spring.xml,启动后spring boot自动加载。
具体信息,配置文件中很详细。内容可以跟maven的一样。
4. 使用
package com.zshuai.springbppt.thymeleaf.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
public final static Logger logger = LoggerFactory.getLogger(HelloController.class);
@RequestMapping("/hello")
public String hello() {
logger.info("hello方法执行!");
return "Hello to Gradle World!";
}
}