实现一个简单的Log框架
实际上算不上框架,只是自己对日志框架的一点理解。
核心接口: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框架的更多相关文章
- koa2源码解读及实现一个简单的koa2框架
阅读目录 一:封装node http server. 创建koa类构造函数. 二:构造request.response.及 context 对象. 三:中间件机制的实现. 四:错误捕获和错误处理. k ...
- 如何实现一个简单的MVVM框架
接触过web开发的同学想必都接触过MVVM,业界著名的MVVM框架就有AngelaJS.今天闲来无事,决定自己实现一个简单的MVVM框架玩一玩.所谓简单,就是仅仅实现一个骨架,仅表其意,不摹其形. 分 ...
- 徒手撸一个简单的RPC框架
来源:https://juejin.im/post/5c4481a4f265da613438aec3 之前在牛逼哄哄的 RPC 框架,底层到底什么原理得知了RPC(远程过程调用)简单来说就是调用远程的 ...
- VC++ 一个简单的Log类
在软件开发中,为程序建立Log日志是很必要的,它可以记录程序运行的状态以及出错信息,方便维护和调试. 下面实现了一个简单的Log类,使用非常简单,仅供参考. // CLogHelper.h : hea ...
- 用Python写一个简单的Web框架
一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...
- 一个简单的web框架实现
一个简单的web框架实现 #!/usr/bin/env python # -- coding: utf-8 -- __author__ = 'EchoRep' from wsgiref.simple_ ...
- 自己实现的一个简单的EF框架(反射实现)
我实现了一个简单的EF框架,主要用于操纵数据库.实现了对数据库的基本操纵--CRUD 这是项目结构 这是一个 core 下的 DLL 写了一个数据库工厂,用于执行sql语句.调用sql语句工厂 写了一 ...
- python+selenium之自定义封装一个简单的Log类
python+selenium之自定义封装一个简单的Log类 一. 问题分析: 我们需要封装一个简单的日志类,主要有以下内容: 1. 生成的日志文件格式是 年月日时分秒.log 2. 生成的xxx.l ...
- Core1.1环境下,自己实现的一个简单的CRUD框架(反射实现)
我实现了一个简单的EF框架,主要用于操纵数据库.实现了对数据库的基本操纵--CRUD 这是项目结构 这是一个 core 下的 DLL 写了一个数据库工厂,用于执行sql语句.调用sql语句工厂 写了一 ...
随机推荐
- 多参数请求 C# webApi
今天在写项目然后发现了一个 webapi 的一个小功能 可能有些人 不知道 所以顺手分享一下 希望大牛不要喷... webapi 创建的时候 的 get 请求 默认模板是俩个 一个不带参数的Get ...
- 浏览器兼容性--new Date
ie浏览器下new Date("2013/04")与new Date("2016-04")会报错: //将201601格式的字符串转为Date对象,月份从0开始 ...
- 开涛spring3(4.2) - 资源 之 4.2 内置Resource实现
4.2 内置Resource实现 4.2.1 ByteArrayResource ByteArrayResource代表byte[]数组资源,对于“getInputStream”操作将返回一个By ...
- NetFramework各个版本的特性笔记
公式记忆: .Net 2.0=CLR+BCL+C#(VB.Net)+Win Form+Web Form .Net 3.0=.Net 2.0+WCF+WPF+WF+WCS .Net 3.5=.Net 3 ...
- 读 Zepto 源码之集合元素查找
这篇依然是跟 dom 相关的方法,侧重点是跟集合元素查找相关的方法. 读Zepto源码系列文章已经放到了github上,欢迎star: reading-zepto 源码版本 本文阅读的源码为 zept ...
- 分布式锁2 Java非常用技术方案探讨之ZooKeeper
前言: 由于在平时的工作中,线上服务器是分布式多台部署的,经常会面临解决分布式场景下数据一致性的问题,那么就要利用分布式锁来解决这些问题.以自己结合实际工作中的一些经验和网上看到的一些资料 ...
- java模拟报文
为了以后节约时间,记录下模拟报文的实现 模拟报文思路:就是后台把接口数据先写在文档里面写死,接口地址不变,在每个接口里面控制是访问的模拟报文还是数据库里面的数据, 对于前端来说所有都是不变的,就是说我 ...
- 【JAVAWEB学习笔记】29_文件的上传------commons-fileupload
今天内容: 文件的上传------commons-fileupload 文件上传和下载的实质:文件的拷贝 文件上传:从本地拷贝到服务器磁盘上 客户端需要编写文件上传表单---->服务端需要编 ...
- VMware 创建多台Linux机器并配置IP
1.查看并分配虚拟网络 我们首先要知道 VMware 三种网络模式的区别. ①.Bridged(桥接模式):就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信.在桥接的作用下,类似于把物理主机虚拟为 ...
- 关于 vue-cli v2.8.2
我在撰写<Vue2实践揭秘>时采用的 vue-cli 版本是 v2.5.1,由于实体书的出版周期比电子书的要长,所以到全书出版vue-cli已经更新到 v2.8.2 了,我在书中曾经对 v ...