1) 导入log4j依赖
这里是我导入的依赖:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
2) 添加log4j.properties
# ROOTER
log4j.rootLogger=DEBUG,CONSOLE,FILE
# CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-d{
yyyy-MM-dd HH\:mm\:ss} %-5p %-20c %x %m%n
# FILE
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.File=logs.log
log4j.appender.FILE.MaxBackupIndex=20
log4j.appender.FILE.MaxFileSize=10MB
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%-d{
yyyy-MM-dd HH\:mm\:ss} %-5p %-20c %x %m%n
# ERROR
log4j.appender.ERR = org.apache.log4j.DailyRollingFileAppender
log4j.appender.ERR.File =error.log
log4j.appender.ERR.Append = true
log4j.appender.ERR.Threshold = ERROR
log4j.appender.file.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.ERR.layout = org.apache.log4j.PatternLayout
log4j.appender.ERR.layout.ConversionPattern = %-d{
yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
Appender
日志输出器,配置日志的输出级别、输出位置等,包括以下几类:
ConsoleAppender: 日志输出到控制台;
FileAppender: 输出到文件;
RollingFileAppender: 输出到文件,文件达到一定阈值时,自动备份日志文件;
DailyRollingFileAppender:可定期备份日志文件,默认一天一个文件,也可设置为每分钟一个、每小时一个;
WriterAppender: 可自定义日志输出位置。
日志级别
一般日志级别包括:ALL,DEBUG, INFO, WARN, ERROR,FATAL,OFF
Log4J推荐使用:DEBUG, INFO, WARN, ERROR
Layout:日志输出格式,Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
输出格式
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 方法名
Logger log = Logger.getLogger(当前类.class);
if(log.isDebugEnabled()){
log.debug("...");
}
if(log.isInfoEnabled()){
log.info("...");
}
...
3) 编写日志切面
/**
* Log4j日志输出切面
*/
@Aspect
@Component
public class Log4jAspect {
//创建日志对象
private Logger logger = Logger.getLogger(Log4jAspect.class);
//给所有的service类的所有方法加日志跟踪
@Pointcut("execution(* com.blb.aop_demo.service.*Service.*(..))")
public void logPointcut(){
}
//配置环绕通知
@Around("logPointcut()")
public Object aroundLog(ProceedingJoinPoint point) throws Throwable {
//记录方法执行前时间
long start = System.currentTimeMillis();
//打印方法名称
if(logger.isDebugEnabled()){
logger.debug("当前执行方法:" + point.getSignature().getName());
}
//打印参数
Object[] args = point.getArgs();
for(Object arg : args){
if(logger.isDebugEnabled()){
logger.debug("参数:"+arg);
}
}
//打印返回值
Object result = point.proceed();
if(logger.isDebugEnabled()){
logger.debug("方法返回值:" +result);
}
//打印执行时间
long end = System.currentTimeMillis();
if(logger.isDebugEnabled()){
logger.debug("方法执行时间:" +(end - start));
}
return result;
}
}