SpringMVC
SpringMVC+Loganj實現日誌管理:
導入依賴
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
引入配置文件
### 配置根 ###
log4j.rootLogger = debug,console ,fileAppender,dailyRollingFile,ROLLING_FILE,MAIL,DATABASE
### 設置輸出sql的級別,其中logger後面的內容全部爲jar包中所包含的包名 ###
log4j.logger.org.apache=dubug
log4j.logger.java.sql.Connection=dubug
log4j.logger.java.sql.Statement=dubug
log4j.logger.java.sql.PreparedStatement=dubug
log4j.logger.java.sql.ResultSet=dubug
### 配置輸出到控制檯 ###
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L - %m%n
@Service
public class UserServiceImpl implements IUserService {
@Autowired
UserMapper mapper;
Logger logger = Logger.getLogger(UserServiceImpl.class);
@Override
public User login(User user) {
logger.debug("ZAQ");
return mapper.findUser(user);
}
}
登錄成功後在控制檯打印的日誌信息:
但是項目中肯定是要將日誌信息保存到硬盤中,這時修改一下log4j的配置文件就行了,給上面的配置文件中加入下面配置。
# 日誌文件(logFile)
log4j.appender.fileAppender=org.apache.log4j.FileAppender
#級別,記錄DEBUG及以上級別
log4j.appender.fileAppender.Threshold=DEBUG
log4j.appender.fileAppender.ImmediateFlush=true
#後綴往上加
log4j.appender.fileAppender.Append=true
log4j.appender.fileAppender.File=Z:/logs/log.log4j
log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout
# 輸出的格式 %d:時間;%l:級別;%m:信息;%n:下一行
log4j.appender.fileAppender.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
成功後輸出到對應的文件中
這時我們發現,以後所有的查詢等涉及敏感操作的過程都要在service中給其加入日誌打印功能,這時就讓service層的代碼很亂。怎麼解決呢?那就用AOP解決,這就讓我們的日誌系統更加靈活。
要使用AOP,先導入aspectJ依賴包
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
並且在配置文件中啓動AOP註解驅動
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
<mvc:annotation-driven></mvc:annotation-driven><!--mvc註解驅動-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
實現增強:
@Aspect
@Component
public class LogAdvice {
Logger logger = Logger.getLogger(Logger.class);
@Pointcut("execution(* com.home.test.service..*.*(..))")//這裏可以指定方法,指定給service包下的具體哪些服務加入日誌系統
public void pointCut(){}
@Before("pointCut()")
public void before(JoinPoint joinPoint) {
logger.debug(joinPoint.getTarget() + " : " + joinPoint.getSignature());
logger.debug("方法執行參數: " + Arrays.toString(joinPoint.getArgs()));
}
@Around("pointCut()")
public Object around(ProceedingJoinPoint pjp) {
Object result = null;
try {
result = pjp.proceed(pjp.getArgs());
logger.debug("方法的執行結果:" + result);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return result;
}
}
成功的打印日誌信息:
如果真正發佈項目到生產環境的時候將日誌信息輸出級別調整至warn就可以了,因爲debug級別比較低,一般沒必要輸出。(風險級別排序:debug < info< warn < error)