我们都知道日志管理就是在log4j.xml中配置:各种级别的日志怎么输出,利用那个Appender
写了一个自己的appender,日志既按要求录入我指定的表格,又按照log4j.xml中配置的执行:
1.定义自己的Appender继承JDBCAppender(因为我是要按我的要求入指定表)
重写execute(sql)方法:利用JDBC入库操作。
/**
* 重写log4j的日志保存类
* @author xxx
* @date 2014-12-1
* @time 上午10:03:00
* @version 1.0
*/
public class MyJDBCAppender extends JDBCAppender {
private LoggingEvent e;
/**
* 打开数据库
* @throws SQLException
*/
public void openConn()
{
try
{
connection = getConnection();
} catch (SQLException e)
{
e.printStackTrace();
close();
}
}
/**
* 重写入库方法,实现PreparedStatement
*/
@Override
protected void execute(String sql) throws SQLException
{
PreparedStatement stmt = null;
try
{
stmt = connection.prepareStatement(this.getSql());
Long time = e.getTimeStamp();
Log log = (Log) e.getMessage();
stmt.setString(1, String.valueOf(time));// ID为当前时间
stmt.setString(2, "xxx");// 操作类型
stmt.setString(3, log.getCode());// CODE
stmt.setTimestamp(4, new Timestamp(time));// TIME
stmt.setBoolean(5, log.isSucceed());// RESULT
stmt.setString(6, log.getLogType().name());// TYPE
stmt.setString(7, log.getMemo());// MEMO
stmt.setString(8, log.getName());// NAME
stmt.setTimestamp(9, new Timestamp(time));// UPDATEDATE
stmt.setString(10, null==log.getCreator()?null:log.getCreator().getId());
stmt.execute();
} catch (SQLException e)
{
if (stmt != null)
{
stmt.close();
}
e.printStackTrace();
} finally
{
if (stmt != null)
{
stmt.close();
}
}
}
/**
* 初始化event
*/
protected String getLogStatement(LoggingEvent event)
{
e = event;
// return getLayout().format(event);
return null;
}
}
2.再写一个自定义的日志工厂类:把刚刚自定义的Appender和Logger作为属性。
这样我logger.info(Log)的时候会先执行我自定义Appender中的execute方法
import org.apache.log4j.Logger;
/**
* 日志入库类
* @author xxx
* @date 2014-12-1
* @time 上午10:03:00
* @version 1.0
*/
public class MyLog {
private static MyJDBCAppender jdbcAppender;
private static Logger logger = Logger.getLogger(MyLog .class);
static{
jdbcAppender = new MyJDBCAppender ();
jdbcAppender.setDriver("数据库driver");
jdbcAppender.setURL("数据库url");
jdbcAppender.setUser("用户名");
jdbcAppender.setPassword("密码");
jdbcAppender.setSql("入库sql语句");
jdbcAppender.openConn();//数据库连接一直开着
logger.addAppender(jdbcAppender);
}
/**
* 关闭数据库连接
*/
public static void close()
{
jdbcAppender.close();
jdbcAppender = null;
}
/**自定义各种日志模板 start*/
/**
* 操作日志入库:一般操作成功的时候调用
* @param clazz:打印日志的类
* @param actionType:日志动作类型
* @param memo:操作描述
*/
public static void info(Class<?> clazz,ActionType actionType,String memo)
{
Log log = Log.Builder.newBuilder().actionType(actionType).isSucceed(true).build();
log.setLogType(LogType.OPERATE);
log.setCreator(SessionUser.getOperator());
log.setMemo(memo);
log.setCode(clazz.getSimpleName());
logger.info(log);
}
/**
* 错误操作日志入库:严重的错误操作
* @param clazz:打印日志的类
* @param actionType:日志动作类型
* @param result:是否成功
* @param memo:操作描述
*/
public static void error(Class<?> clazz,ActionType actionType,String memo)
{
Log log = Log.Builder.newBuilder().actionType(actionType).build();
log.setLogType(LogType.OPERATE);
log.setSucceed(false);
log.setCreator(SessionUser.getOperator());
log.setMemo("严重错误操作_"+memo);
log.setCode(clazz.getSimpleName());
logger.error(log);
}
/**
* 系统日志入库
* @param clazz:打印日志的类
* @param actionType:日志动作类型
* @param result:是否成功
* @param user:操作用户
* @param ip:IP地址
* @param memo:操作描述
*/
public static void infoSys(Class<?> clazz,ActionType actionType,boolean result,Operator user,String ip,String memo)
{
Log log = Log.Builder.newBuilder().actionType(actionType).isSucceed(result).build();
log.setLogType(LogType.SYS);
log.setCreator(null==user?SessionUser.getOperator():user);
log.setName(null==ip?SessionUser.getUserIp():ip);//添加IP
log.setMemo(memo);
log.setCode(clazz.getSimpleName());
logger.info(log);
}
/**
* 错误系统日志入库
* @param clazz:打印日志的类
* @param actionType:日志动作类型
* @param user:操作用户
* @param ip:当前用户ip
* @param memo:操作描述
*/
public static void errorSys(Class<?> clazz,ActionType actionType,Operator user,String ip,String memo)
{
Log log = Log.Builder.newBuilder().actionType(actionType).build();
log.setLogType(LogType.SYS);
log.setSucceed(false);
log.setCreator(null==user?SessionUser.getOperator():user);
log.setName(null==ip?SessionUser.getUserIp():ip);
log.setMemo(memo);
log.setCode(clazz.getSimpleName());
logger.error(log);
}
/**
* 安全日志入库
* @param clazz:打印日志的类
* @param actionType:日志动作类型
* @param result:是否成功
* @param memo:操作描述
*/
public static void infoSecurity(Class<?> clazz,ActionType actionType,boolean result,String memo)
{
Log log = Log.Builder.newBuilder().actionType(actionType).isSucceed(result).build();
log.setLogType(LogType.SECURITY);
log.setCreator(SessionUser.getOperator());
log.setMemo(memo);
log.setCode(clazz.getSimpleName());
logger.info(log);
}
/**
* 警告安全日志入库
* @param clazz:打印日志的类
* @param actionType:日志动作类型
* @param result:是否成功
* @param memo:操作描述
*/
public static void warnSecurity(Class<?> clazz,ActionType actionType,boolean result,String memo)
{
Log log = Log.Builder.newBuilder().actionType(actionType).isSucceed(result).build();
log.setLogType(LogType.SECURITY);
log.setCreator(SessionUser.getOperator());
log.setMemo(memo);
log.setCode(clazz.getSimpleName());
logger.warn(log);
}
/**
* 错误安全日志入库
* @param clazz:打印日志的类
* @param actionType:日志动作类型
* @param result:是否成功
* @param memo:操作描述
*/
public static void errorSecurity(Class<?> clazz,ActionType actionType,String memo)
{
Log log = Log.Builder.newBuilder().actionType(actionType).build();
log.setLogType(LogType.SECURITY);
log.setSucceed(false);
log.setCreator(SessionUser.getOperator());
log.setMemo(memo);
log.setCode(clazz.getSimpleName());
logger.error(log);
}
/**自定义各种日志模板 end*/
}
分享到:
相关推荐
主要讲述log4j的简介,以及log4j的配置和在实际应用的使用。如果您不知道如何配置log4j,那么这本书将对您有很大的帮助。
Java开发中使用Log4j 来记录log非常的方便,但是出现问题时需要查询Log时是很痛的,因为Log4j只提供了将Log记录的文件的方法却没有将文件分开来记录。如果Log时间很长的问题那就麻烦了。特此扩展了Log4j 中的...
log4j有些引用不是很方便我在这里进行了扩展,可以支持struts,ibtais,和自己的要输出的日志。
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输出地;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是...
在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包-...而且,通过使用各种第三方扩展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中
在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包-...而且,通过使用各种第三方扩展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。
log4j配置文件例子,可以让你轻松配置log4j
通过log4j扩展包实现生成带时间戳的日志文件(其中包含extras包以及简单demo)
而且,通过使用各种第三方扩展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。 本文介绍的Log4j版本是1.2.3。作者试图通过一个简单的客户/服务器Java程序例子对比使用与不使用Log4j 1.2.3的差别,并详细...
几乎是网上 能找到的 日志脱敏的所有实现 1、基于正则表达式的 日志脱敏实现 ,扩展logback 、log4j 2、springmvc 返回报文脱敏。 3、基于注解方式的脱敏。 大家选择使用。
NULL 博文链接:https://ghl116.iteye.com/blog/1476308
内含jar包,以及详细说明,log4j日志集中处理扩展(含server与client),改造网友的,决对可用
而且,通过使用各种第三方扩展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。 说明:下面分为三部分, 第一部分讲解如何配置log4j; 第二部分为对log4j.properties配置文件中的各个属性的讲解; ...
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套...而且,通过使用各种第三方扩展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。
Log4j是Apache的一个开放源代码项目,,通过Log4j其他语言接口,您可以在C、C++、.Net、PL/SQL程序中使用Log4j,其语法和...而且,通过使用各种第三方扩展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。
NULL 博文链接:https://improve.iteye.com/blog/1462030
本实例是用struts2 + log4j完成的实例,可直接用于记录向数据库插入数据,记录系统所有用户的基本操作。采用框架,利于扩展!
1.2.15以上的log4j配合apache-log4j-extras-1.0.jar可以直接生成带有时间戳的log文件,不需要下次日志访问触发
Log4j 是 Apache 的一个开放源代码项目,通过使用 Log4j ,我们可以控制日志信 送的目的地是控制台、文件、 GUI 组件、...而且,通过使用各种第三方扩展,您可以很方便地将 Log4j 集成到 J2EE 、 JI 至是 SNMP 应用中。