`
elicer
  • 浏览: 133400 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

自己动手实现一个轻量极log

    博客分类:
  • log
阅读更多

大家可能每天都在用apache 的log4j在打log,可大家有没想过它的内部是怎么实现的呢,我在这里实现的一个简单的log,希望对大家了解打log的过程有所了解。
由于实现的比较简单,没有加入对log level的支持。


public class AuditLogManager {

	private static LogFileThread logFile = null;
	private static boolean bWrite = true;
   
	public static void writeInfo(String sInfo) {

		if (!bWrite)
			return;

		if (logFile == null) {
			logFile = new LogFileThread();
			logFile.start();
		}

		logFile.writeInfo(sInfo);
	}


}

class LogFileThread extends Thread {

	private static FileOutputStream outLogFile = null;
	private static boolean bInit = false;
	private static boolean bErr = false;
	private static Vector vInfo = new Vector();

	public LogFileThread() {

	}

	private void init(String fileName) {
		try {

			if (bInit)
				return;

			String logFile = "c:/worksapce/log";
			File f = new File(logFile);
			f.mkdirs();
			logFile += "/AuditLog_" + fileName + ".log";
			outLogFile = new FileOutputStream(logFile, true);

		} catch (Exception e) {
			bErr = true;
			e.printStackTrace();
		}
		bInit = true;
	}

	public void writeInfo(String info) {

		if (info == null)
			return;
		procInfo(info, true);

	}

	private String getInfo() {

		return procInfo(null, false);

	}

	private synchronized static String procInfo(
		String info,
		boolean bPutInfo) {

		if (bErr) {
			vInfo.clear();
			return null;
		}

		String sInfo = null;

		try {

			if (bPutInfo) {
				if (info != null)
					vInfo.add(info);

			} else {
				if (vInfo.size() > 0) {
					sInfo = (String) vInfo.get(0);
					vInfo.remove(0);

				}
			}

		} catch (Exception e) {
			bErr = true;
			e.printStackTrace();
		}
		return sInfo;
	}

	private void writeFile(String info) {
		try {
			if (info == null)
				return;
			outLogFile.write(info.getBytes());
		} catch (Exception e) {
			bErr = true;
			e.printStackTrace();
		}
	}

	private void close() {
		try {
			bInit = false;
			bErr = false;
			if (outLogFile != null)
				outLogFile.close();
			outLogFile = null;
		} catch (Exception e) {
			e.printStackTrace();
		}

		bInit = false;
	}

	public void run() {
		try {

			String oldDate = null;
			while (true) {

				String curDate = DateTime.getCurrentDate(0);

				if (oldDate == null || !oldDate.equalsIgnoreCase(curDate)) {
					oldDate = curDate;
					close();
					init(oldDate);
				}

				String curTime = DateTime.getCurrentTimestamp(0);
				String ss = formatInfo(curTime);
				writeFile(ss);
				if (ss == null)
					sleep(1000);

			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	private String formatInfo(String time) {

		String sInfo = procInfo(null, false);
		if (sInfo == null)
			return null;
		String sh = "*******" + time + "*******\r\n\r\n";
		sh += sInfo;
		sh += "\r\n\r\n*******  End  *******\r\n\r\n";
		return sh;

	}

	protected void finalize() {
		try {
			System.out.println("Close  Log Manager");
			this.interrupt();
			outLogFile.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}
0
0
分享到:
评论

相关推荐

    java实现在线通讯录

    【Java实现在线通讯录】是一种基于Java编程语言开发的应用程序,它允许用户通过网络进行联系人管理和通信。...通过解压并运行这个项目,开发者不仅可以了解具体实现细节,还能动手实践,提升自己的Java编程能力。

    cpp-C从头写一个SQLite数据库引擎

    通过理解SQLite的内部工作原理和设计模式,我们可以尝试自己动手实现一个类似的数据库引擎。 首先,我们需要理解数据库的基本概念,包括数据模型(如关系型模型)、表、字段、记录、索引等。在关系型数据库中,数据...

    一个基于jquery 实现的mbMenu 1.5 菜单插件源码例子

    **jQuery mbMenu 1.5 插件源码解析** jQuery mbMenu 是一款高效、灵活的菜单构建插件,主要用于创建响应式、多级的...记住,实践是检验真理的唯一标准,动手尝试并不断调整,你会发现 mbMenu 是一个非常实用的工具。

    vc++ 应用源码包_1

    电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 CctryLog(web拦截网页帐号密码) 实现了一个控件去获得IHTMLDocument2接口,然后读取内容,匹配用户名与密码等。 CFile64_src 操作大...

    vc++ 应用源码包_2

    电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 CctryLog(web拦截网页帐号密码) 实现了一个控件去获得IHTMLDocument2接口,然后读取内容,匹配用户名与密码等。 CFile64_src 操作大...

    vc++ 应用源码包_6

    电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 CctryLog(web拦截网页帐号密码) 实现了一个控件去获得IHTMLDocument2接口,然后读取内容,匹配用户名与密码等。 CFile64_src 操作大...

    vc++ 应用源码包_5

    电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 CctryLog(web拦截网页帐号密码) 实现了一个控件去获得IHTMLDocument2接口,然后读取内容,匹配用户名与密码等。 CFile64_src 操作大...

    vc++ 应用源码包_3

    电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 CctryLog(web拦截网页帐号密码) 实现了一个控件去获得IHTMLDocument2接口,然后读取内容,匹配用户名与密码等。 CFile64_src 操作大...

    超酷jS代码(绝版)

    JavaScript,简称JS,是一种广泛应用于Web开发的轻量级编程语言。它主要负责网页的动态交互,赋予网页活力,使得用户在浏览时可以有丰富的视觉和功能体验。本压缩包中的"超酷jS代码(绝版)"可能包含了一些独特的、...

    VUE初初初学自己实践例子

    Vue.js 是一款轻量级的前端JavaScript框架,以其易学易用、组件化开发和高性能的特点深受开发者喜爱。本实践例子旨在为Vue初学者提供一个简单的学习起点,帮助理解Vue的基本概念和常用功能。 首先,Vue的核心是声明...

    Jquery 创建流程图

    jsPlumb是一个轻量级的JavaScript库,它专注于连接元素,提供了一系列用于构建流程图和网络图表的功能。jsPlumb与jQuery的结合使用,使得在网页上绘制和管理流程图变得非常直观和便捷。 **二、安装和引入jsPlumb** ...

    java-简易web框架EasyJWeb源码.zip.zip

    EasyJWeb是一个轻量级的Java Web开发框架,旨在简化Web应用的开发过程,提高开发效率。 【描述解析】 "java_简易web框架EasyJWeb源码.zip.zip" 描述进一步确认了这是一个关于Java编程语言的Web框架,其核心内容是...

    【实战】ES6从零开始基础+实战项目

    ### ES6从零开始基础+实战项目 #### 一、ES6简介与新特性 ECMAScript 2015(通常称为ES6)是JavaScript的一种标准版本,它引入了许多新特性和改进...接下来,你可以尝试自己动手实现一些小项目,进一步巩固所学知识。

    Spring-Demo-1.zip

    《Spring框架实战解析——以Spring-Demo-1.zip为例》 Spring框架,作为Java领域最为广泛应用的轻量级框架之一,以其强大的IoC...记住,实践是检验真理的唯一标准,动手尝试并理解每一个环节,是掌握Spring框架的关键。

    vc++ 开发实例源码包

    电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 CctryLog(web拦截网页帐号密码) 实现了一个控件去获得IHTMLDocument2接口,然后读取内容,匹配用户名与密码等。 CFile64_src 操作大...

    一个例子学会Vuejs

    Vue.js 是一款流行的轻量级前端JavaScript框架,它以其易学易用、组件化开发、高性能和灵活性著称。在“一个例子学会Vue.js”的学习过程中,我们将深入了解Vue.js的核心概念,包括数据绑定、指令、组件、计算属性、...

    java document

    3. **MyBatis**:MyBatis是一个轻量级的持久层框架,它允许开发者将SQL语句直接写在XML配置文件或注解中,增强了SQL的灵活性。 4. **Apache Commons**:Apache Commons是Apache软件基金会提供的一系列实用工具类库...

    Nginx从入门到实践-基础视频教程.txt.rar

    Nginx是一款高性能的HTTP和反向代理服务器,也是一款邮件传输代理服务器,因其轻量级、高并发处理能力而广受欢迎。本教程将带你深入理解Nginx的基础概念和实际应用,帮助你从入门到实践,提升在Web服务器领域的技能...

    springmvc登陆示例项目

    SpringMVC是一个基于Java的轻量级Web应用框架,它为构建模型-视图-控制器(MVC)架构的应用程序提供了强大的支持。本项目“springmvc登陆示例项目”是针对初学者和开发者的一个实践教程,旨在帮助他们理解并掌握...

    JavaScript光盘资料

    JavaScript是一种广泛应用于网页和网络应用的轻量级编程语言,主要负责实现客户端的交互效果和动态功能。在网页开发中,JavaScript与HTML和CSS并称为前端开发的“三剑客”,是实现网页动态性的关键。这份"JavaScript...

Global site tag (gtag.js) - Google Analytics