`
sha1064616837
  • 浏览: 38641 次
  • 性别: Icon_minigender_2
  • 来自: 湖南
社区版块
存档分类
最新评论

log4j扩展使用

阅读更多
我们都知道日志管理就是在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的配置和在实际应用的使用。如果您不知道如何配置log4j,那么这本书将对您有很大的帮助。

    Log4j的扩展

    Java开发中使用Log4j 来记录log非常的方便,但是出现问题时需要查询Log时是很痛的,因为Log4j只提供了将Log记录的文件的方法却没有将文件分开来记录。如果Log时间很长的问题那就麻烦了。特此扩展了Log4j 中的...

    java中log4j的扩展写法

    log4j有些引用不是很方便我在这里进行了扩展,可以支持struts,ibtais,和自己的要输出的日志。

    浅谈Log4j扩展

    Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输出地;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是...

    log4j的基础知识

    在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包-...而且,通过使用各种第三方扩展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中

    log4j配置过程及配置讲解

    在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包-...而且,通过使用各种第三方扩展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。

    log4j配置文件例子

    log4j配置文件例子,可以让你轻松配置log4j

    log4j生成带时间戳的日志文件(包括extras包以及简单demo)

    通过log4j扩展包实现生成带时间戳的日志文件(其中包含extras包以及简单demo)

    使用Log4j进行日志操作

    而且,通过使用各种第三方扩展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。 本文介绍的Log4j版本是1.2.3。作者试图通过一个简单的客户/服务器Java程序例子对比使用与不使用Log4j 1.2.3的差别,并详细...

    springmvc log4j2 logback 注解 jackson 日志脱敏实现源码

    几乎是网上 能找到的 日志脱敏的所有实现 1、基于正则表达式的 日志脱敏实现 ,扩展logback 、log4j 2、springmvc 返回报文脱敏。 3、基于注解方式的脱敏。 大家选择使用。

    (转)如何自建appender扩展Log4j框架

    NULL 博文链接:https://ghl116.iteye.com/blog/1476308

    决对可用,log4j日志集中处理扩展(含server与client)

    内含jar包,以及详细说明,log4j日志集中处理扩展(含server与client),改造网友的,决对可用

    jjava日志文件log4j

    而且,通过使用各种第三方扩展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。  说明:下面分为三部分,  第一部分讲解如何配置log4j;  第二部分为对log4j.properties配置文件中的各个属性的讲解; ...

    log4j.properties

    Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套...而且,通过使用各种第三方扩展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。

    Log4j是Apache的一个开放源代码项目

    Log4j是Apache的一个开放源代码项目,,通过Log4j其他语言接口,您可以在C、C++、.Net、PL/SQL程序中使用Log4j,其语法和...而且,通过使用各种第三方扩展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。

    Log4j扩展的一个按天滚动的appender类,同时支持动态日志

    NULL 博文链接:https://improve.iteye.com/blog/1462030

    Struts2+log4j

    本实例是用struts2 + log4j完成的实例,可直接用于记录向数据库插入数据,记录系统所有用户的基本操作。采用框架,利于扩展!

    apache-log4j-extras-1.0.jar

    1.2.15以上的log4j配合apache-log4j-extras-1.0.jar可以直接生成带有时间戳的log文件,不需要下次日志访问触发

    日志管理Log4j学习笔记

    Log4j 是 Apache 的一个开放源代码项目,通过使用 Log4j ,我们可以控制日志信 送的目的地是控制台、文件、 GUI 组件、...而且,通过使用各种第三方扩展,您可以很方便地将 Log4j 集成到 J2EE 、 JI 至是 SNMP 应用中。

Global site tag (gtag.js) - Google Analytics