实现一个简单的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语句工厂 写了一 ...
随机推荐
- Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring
IOC(Inverse of Control) 可翻译为“控制反转”,但大多数人都习惯将它称为“依赖注入”.在Spring中,通过IOC可以将实现类.参数信息等配置在其对应的配置文件中,那么当 需要更 ...
- [原创]MLCC全球性缺货分析
2017首季开始全球片式多层陶瓷电容器(MLCC)供应火爆,目前部分厂商交期已延长4周以上,供需缺口达15%.再加之苹果iPhone 8第二季已提前启动备货期,其需求数量极为庞大,至少上亿只,而各大M ...
- JDFS:一款分布式文件管理实用程序第二篇(更新升级、解决一些bug)
一 前言 本文是<JDFS:一款分布式文件管理实用程序>系列博客的第二篇,在上一篇博客中,笔者向读者展示了JDFS的核心功能部分,包括:服务端与客户端部分的上传.下载功能的实现,epoll ...
- grunt基础配置
grunt基础配置 要使用grunt来管理项目,一般需要如下的几个步骤: 安装grunt命令行工具grunt-cli 在项目中安装grunt 安装grunt插件 建立并配置Gruntfile.js 安 ...
- 微信小程序封装http访问网络库实例代码
之前都是使用LeanCloud为存储,现在用传统API调用时做如下封装 var HOST = 'http://localhost/lendoo/public/index.php/'; // 网站请求接 ...
- 【T-SQL进阶】02.理解SQL查询的底层原理
本系列[T-SQL]主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础]04.表表达式 ...
- VR全景:vr元年过后,这些企业如何发动“vr+”应用引擎?
2016年,VR可谓是四处衍生.从如痴如迷的游戏行业到喜闻乐见的影视行业,再到医疗.军事.房地产,随便呼出一个"+",VR便能左右逢源,VR+各行各业,俨然成为一种标配.最近,Ma ...
- Spring Boot的properties配置文件读取
我在自己写点东西玩的时候需要读配置文件,又不想引包,于是打算扣点Spring Boot读取配置文件的代码出来,当然只是读配置文件没必要这么麻烦,不过反正闲着也是闲着,扣着玩了.具体启动过程以前的博客写 ...
- Windows 7 下安装mysql-5.7.18-winx64.zip
mysql-5.7以后压缩包安装有了不小的变化 第一步:到官网下载https://dev.mysql.com/downloads/mysql/ 第二步:解压到一个文件夹 第三步:配置环境变量 把;%M ...
- PowerShell管道入门,看看你都会不(管道例子大全)
PowerShell的一个重中之重的功能就是管道(pipeline),本文从浅入深,一步一步详解管道的使用方法和例子,来看看有没有你所不知道的吧,如果全知道,恭喜你已经很厉害啦--适用于所有Power ...