首页 > 代码库 > log4j

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="http://www.mamicode.com/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