log4j
Posted skip_2_my_lou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了log4j相关的知识,希望对你有一定的参考价值。
Log4j日志级别:级别表示只有设置的当前级别及其以上的日志信息才输出
debug:调试级别
info:信息级别
warn:警告级别
error:错误级别
fatal:崩溃级别
一.一个最基本的示例:
package com.wode.Test;
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
public class Test1 {
public static void main(String[] args) {
//获得日志处理对象,注意参数一定要用当前类的类模板
Logger log=Logger.getLogger(Test1.class);
//设置输出格式
%d表示日期和时间格式
%c表示类信息
%M表示方法名
%m表示用户信息 (也就是输出日志时传递的字符串参数)
%p表示日志级别
%n表示换行
PatternLayout layout=new PatternLayout("%d{yyyy-MM-dd HH:mm:ss} %c [%M] %m %p %n");
//控制台输出日志对象,需要传入输出格式
ConsoleAppender appender=new ConsoleAppender(layout);
//设置appender
log.addAppender(appender);
//设置日志级别为调试级别
log.setLevel(Level.DEBUG);
//输出日志
log.debug("调试级别debug");
log.info("信息级别info");
log.warn("警告级别warn");
log.error("错误级别error");
log.fatal("崩溃级别fatal");
}
运行程序结果如下图:
}
在上述程序中,使用的是控制台作为输出日志对象,当然也可以选用其他的输出对象,比如文件等。
以文件为例,只需要把上一段代码中的appender 由ConsoleAppender类型替换为FileAppender类型即可。
FileAppender appender=null;
try {
//第一个参数为日志输出格式,第二个参数为日志输出文件路径,第三个参数表示是否以追加方式写入文件(true则追加,false则覆盖)
appender=new FileAppender(layout,"1.txt",true);
} catch (IOException e) {
e.printStackTrace();
}
如果用如上代码替换第一段代码中蓝色部分的代码,运行程序。刷新项目,会发现程序所在工程下面新建了一个名为1.txt的文件,打开文件能看到日志记录。效果如下图
在上面的程序中,按步骤利用log4j进行了日志记录,但这种操作相对繁琐,如果在同一工程的多个地方都需要进行日志记录,那么需要按上述步骤重复书写代码。
而在实际开发中,最常利用资源文件log4j.properties来配置和使用log4j。
#定义该项目所有的日志输出,tocon(我们自己定义的变量名)表示输出到控制台,warn代表只有日志级别为警告及其以上的才会输出
log4j.rootLogger=warn,tocon #注意中间是逗号“,”隔开,不能写成“.”’
#定义appender输出地点为控制台( log4j第一个包中的ConsoleAppender)
log4j.appender.tocon=org.apache.log4j.ConsoleAppender
#定义日志输出格式为正则表达式格式(log4j第一个包中的PatternLayout)
log4j.appender.tocon.layout=org.apache.log4j.PatternLayout
#定义正则表达式的内容
log4j.appender.tocon.layout.ConversionPattern=%d{yyyy-MM-dd} %c [%M] %m%p %n
#com.wode.dao包中的日志应用toFile规则,记录在文件中
log4j.logger.com.wode.dao=warn,toFile
log4j.appender.toFile=org.apache.log4j.FileAppender
log4j.appender.toFile.layout=org.apache.log4j.PatternLayout
log4j.appender.toFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %c [%M] %m%n
#指明日志输出的文件名
log4j.appender.toFile.File=test.log
#按天记录日志,记录在文件中,一天一个文件
log4j.logger.com.wode.service=error,toDailyFile
log4j.appender.toDailyFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.toDailyFile.layout=org.apache.log4j.PatternLayout
log4j.appender.toDailyFile.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} %c [%m] %n
#表示每天的日志文件存放在log文件夹中,名称为error.log
log4j.appender.toDailyFile.File=log/error.log
#给日志文件加上日期后缀
log4j.appender.toDailyFile.File.DatePattern=\'.\'yyyy-MM-dd
#把日志信息记录在数据库中
log4j.logger.com.wode.action=error,todb
#org.apache.log4j.jdbc
log4j.appender.todb=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.todb.layout=org.apache.log4j.PatternLayout
log4j.appender.todb.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} %c [%m] %n
log4j.appender.todb.driver=com.mysql.jdbc.Driver
log4j.appender.todb.URL=jdbc:mysql://localhost:3306/log4j?characterEncoding=utf-8
log4j.appender.todb.user=root
log4j.appender.todb.password=123
log4j.appender.todb.sql=insert into t_log(logContent,logDate) values(\'%m\',\'%d{yyyy-MM-dd}\')
应用实例:比如需要把项目过程中出现的异常信息记录在数据库异常日志表中。
那么可以通过抛出异常通知配合log4j日志记录来实现。
@Service("error")
@Aspect
public class PressError{
@AfterThrowing(value="execution(* com.wode.service.*.*(..))",throwing="e")
public void writeLog(JoinPoint point,Exception e){
//得到目标对象的类名
String targetName=point.getTarget().getClass().getName();
//得到目标的方法名
String methodName=point.getSignature().getName();
SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss ");
String dateInfo=sdf.format(new Date());
String info=dateInfo+"执行"+targetName+"类的"+methodName+"方法时,抛出"+e.getClass().getName();
//System.out.println(info);
Logger log=Logger.getLogger(PressError.class);
//写入日志
log.error(info);
}
}
通过如上配置,可以将业务层发生的异常信息以日志形式记录在数据库对应表中,
我们特意在业务层的方法中加入了一个算术异常,测试结果如下
控制台中:
数据库日志记录表中:
以上是关于log4j的主要内容,如果未能解决你的问题,请参考以下文章