实际上算不上框架,只是自己对日志框架的一点理解。

核心接口:Logger,供调用者完成不同等级的日志输出

package com.lichmama.log.service;

public interface Logger
{
public void debug(String msg); public void debug(String format, Object... args); public void info(String msg); public void info(String format, Object... args); public void warn(String msg); public void warn(String format, Object... args); public void error(String msg); public void error(String format, Object... args); public void fatal(String msg); public void fatal(String format, Object... args);
}

核心接口:LogWriter,内部使用,完成日志输出到文件或控制台的过程

package com.lichmama.log.service;

public interface LogWriter
{
public void log(String log);
}

核心接口:LoggerBuilder,日志实例的生成器,提供对不同类型的日志实例的生成接口

package com.lichmama.log.service;

public interface LoggerBuilder
{
//运行时日志
public Logger getRunLogger(Class<?> T); //命令行日志
public Logger getConLogger(Class<?> T);
}

日志类型枚举:LogType

package com.lichmama.log.service;

public enum LogType
{
RUNTIME, CONSOLE
}

接口实现类:LogWriterImpl,具体实现日志输出行为

package com.lichmama.log.service.impl;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer; import com.lichmama.log.service.LogType;
import com.lichmama.log.service.LogWriter; public class LogWriterImpl implements LogWriter
{
private Writer logWriter; public LogWriterImpl(LogType logType)
{
try
{
switch (logType)
{
case RUNTIME:
logWriter = new OutputStreamWriter(new FileOutputStream("D:\\log\\test\\runtime.log", true));
break;
case CONSOLE:
logWriter = new OutputStreamWriter(System.out);
break;
}
}
catch (Exception e)
{
e.printStackTrace();
} } @Override
public void log(String log)
{
try
{
logWriter.write(log);
logWriter.flush();
}
catch (IOException e)
{
e.printStackTrace();
}
} }

接口实现类:LoggerFactory,日志工厂类,用来生成不同类型的日志示例

package com.lichmama.log.service.impl;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map; import com.lichmama.log.service.LogType;
import com.lichmama.log.service.LogWriter;
import com.lichmama.log.service.Logger;
import com.lichmama.log.service.LoggerBuilder; public class LoggerFactory implements LoggerBuilder
{
private LoggerFactory(){} private static class SingletonHolder
{
private static final LoggerFactory instance = new LoggerFactory();
} public static final LoggerFactory getInstance()
{
return SingletonHolder.instance;
} private static ThreadLocal<Map<String, Logger>> loggers = new ThreadLocal<Map<String, Logger>>() {
@Override
public Map<String, Logger> initialValue()
{
return new HashMap<String, Logger>();
}
}; @Override
public Logger getRunLogger(Class<?> T)
{
return getLogger(T, LogType.RUNTIME);
} @Override
public Logger getConLogger(Class<?> T)
{
return getLogger(T, LogType.CONSOLE);
} private Logger getLogger(Class<?> T, LogType logType)
{
String tagName = T.getName() + "@" + logType;
Logger logger = loggers.get().get(tagName);
if (logger == null)
{
logger = new LoggerInstance(T.getName(), new LogWriterImpl(logType));
loggers.get().put(tagName, logger);
}
return logger;
} private class LoggerInstance implements Logger
{
private LogWriter logWriter;
private String module;
private SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); public LoggerInstance(String module, LogWriter logWriter)
{
this.module = module;
this.logWriter = logWriter;
} @Override
public void debug(String msg)
{
log(msg, "DEBUG");
} @Override
public void info(String msg)
{
log(msg, "INFO");
} @Override
public void warn(String msg)
{
log(msg, "WARN");
} @Override
public void error(String msg)
{
log(msg, "ERROR");
} @Override
public void fatal(String msg)
{
log(msg, "FATAL");
} private void log(String msg, String logLevel)
{
String logText = String.format("%s-[%s] [%s] %s\r\n", sdf.format(new Date()), module, logLevel, msg);
logWriter.log(logText);
} @Override
public void debug(String format, Object... args)
{
String logText = String.format(format, args);
debug(logText);
} @Override
public void info(String format, Object... args)
{
String logText = String.format(format, args);
info(logText);
} @Override
public void warn(String format, Object... args)
{
String logText = String.format(format, args);
warn(logText);
} @Override
public void error(String format, Object... args)
{
String logText = String.format(format, args);
error(logText);
} @Override
public void fatal(String format, Object... args)
{
String logText = String.format(format, args);
fatal(logText);
}
}
}

使用:

public class Test
{
public static void main(String[] args)
{
Logger logger = LoggerFactory.getInstance().getConLogger(Test.class);
logger.warn("winter is coming");
logger.debug("%s said, 'valar morghulis'", "Jaqen H'ghar");
logger.info("%s answered: %s", "Arya", "Valar Dohaeris");
}
}
####################################################################################
CONSOLE OUTPUT:
####################################################################################
20160728171925-[com.lichmama.log.service.test.Test] [WARN] winter is coming
20160728171925-[com.lichmama.log.service.test.Test] [DEBUG] Jaqen H'ghar said, 'valar morghulis'
20160728171925-[com.lichmama.log.service.test.Test] [INFO] Arya answered: Valar Dohaeris

实现一个简单的Log框架的更多相关文章

  1. koa2源码解读及实现一个简单的koa2框架

    阅读目录 一:封装node http server. 创建koa类构造函数. 二:构造request.response.及 context 对象. 三:中间件机制的实现. 四:错误捕获和错误处理. k ...

  2. 如何实现一个简单的MVVM框架

    接触过web开发的同学想必都接触过MVVM,业界著名的MVVM框架就有AngelaJS.今天闲来无事,决定自己实现一个简单的MVVM框架玩一玩.所谓简单,就是仅仅实现一个骨架,仅表其意,不摹其形. 分 ...

  3. 徒手撸一个简单的RPC框架

    来源:https://juejin.im/post/5c4481a4f265da613438aec3 之前在牛逼哄哄的 RPC 框架,底层到底什么原理得知了RPC(远程过程调用)简单来说就是调用远程的 ...

  4. VC++ 一个简单的Log类

    在软件开发中,为程序建立Log日志是很必要的,它可以记录程序运行的状态以及出错信息,方便维护和调试. 下面实现了一个简单的Log类,使用非常简单,仅供参考. // CLogHelper.h : hea ...

  5. 用Python写一个简单的Web框架

    一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...

  6. 一个简单的web框架实现

    一个简单的web框架实现 #!/usr/bin/env python # -- coding: utf-8 -- __author__ = 'EchoRep' from wsgiref.simple_ ...

  7. 自己实现的一个简单的EF框架(反射实现)

    我实现了一个简单的EF框架,主要用于操纵数据库.实现了对数据库的基本操纵--CRUD 这是项目结构 这是一个 core 下的 DLL 写了一个数据库工厂,用于执行sql语句.调用sql语句工厂 写了一 ...

  8. python+selenium之自定义封装一个简单的Log类

    python+selenium之自定义封装一个简单的Log类 一. 问题分析: 我们需要封装一个简单的日志类,主要有以下内容: 1. 生成的日志文件格式是 年月日时分秒.log 2. 生成的xxx.l ...

  9. Core1.1环境下,自己实现的一个简单的CRUD框架(反射实现)

    我实现了一个简单的EF框架,主要用于操纵数据库.实现了对数据库的基本操纵--CRUD 这是项目结构 这是一个 core 下的 DLL 写了一个数据库工厂,用于执行sql语句.调用sql语句工厂 写了一 ...

随机推荐

  1. html学习笔记 - meta link

    <!DOCTYPE html> <html lang="en"> <head> <!-- 编码格式 --> <meta cha ...

  2. How To Configure VMware fencing using fence_vmware_soap in RHEL High Availability Add On(RHEL Pacemaker中配置STONITH)

    本文主要简单介绍一下如何在RHEL 7 Pacemaker中配置一个fence_vmware_soap类型的STONITH设备(仅供测试学习). STONITH是Shoot-The-Other-Nod ...

  3. zabbix server安装详解

    简介 zabbix(音同 zæbix)是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以 ...

  4. iphone手机中对于html和css的一些特殊处理

    1.iphone safari iso系统不兼容:hover的解决办法: 方法一: a:hover设置的样式在IOS系统的浏览器内显示不出来,看来是IOS系统的移动设备中,需要在按钮元素或者是body ...

  5. (原创)Maven+Spring+CXF+Tomcat7 简单例子实现webservice

    这个例子需要建三个Maven项目,其中一个为父项目,另外两个为子项目 首先,建立父项目testParent,选择quickstart: 输入项目名称和模块名称,然后创建: 然后建立子项目testInt ...

  6. linux切换g++

    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 50(优先级) sudo update-alternative ...

  7. 抓包工具-Wireshark(详细介绍与TCP三次握手数据分析)

    功能使用的详细介绍 wireshark(官方下载网站: http://www.wireshark.org/),是用来获取网络数据封包,可以截取各种网络封包,显示网络封包的详细信息,包括http,TCP ...

  8. Linux下如果忘记了Mysql的root密码该怎么办?

    下面十分简单的办法用来重置密码: 1.编辑MySQL配置文件my.cnf vi /etc/my.cnf #编辑文件,找到[mysqld],在下面添加一行skip-grant-tables [mysql ...

  9. JSP手动注入 全

    检测可否注入 http://****.house.sina.com.cn/publics/detail.jsp?id=7674 and 1=1 (正常页面) http://****.house.sin ...

  10. 深入探索C++对象模型(六)

    执行期语意学(Runtime Semantics) 对象的构造和析构(Object Constructor and Destructor) 一般而言,constructor和destructor的安插 ...