前言
1 在项目中,我们有时候需要对内部的日志进行管理,比如桌面信息的打印,或者对后台的日子前台显示,还有对日志在kafka的上传记录。多需求的日志管理,我们可以进行同一入口。那么我就进行了一个日志管理的框架创建。
上代码
记录日志的实体
class LoggingInfo {
/**
* 日志级别
*/
public LoggingLevel loggingLevel;
public LoggingInfo(LoggingLevel loggingLevel, Object message, Throwable t){
this.message = message;
this.t = t;
this.loggingLevel = loggingLevel;
}
/**
* 日志信息
*/
public Object message;
/**
* 异常信息
*/
public Throwable t;
}
日志管理器
核心 管理器
package com.supermap.digicity.sdm.common.log;
import lombok.extern.log4j.Log4j;
import java.util.Queue;
import java.util.Vector;
import java.util.concurrent.ConcurrentLinkedQueue;
/**
* @Author: zhangjun
* @Description: 日志管理
* @Date: Create in 10:56 2019-9-11
*/
@Log4j //这里使用的是lombok.extern.log4j.Log4j的日志管理
public class LoggingManager {
private static boolean isEixt;
//日志执行的线程,一直在后台
private static Thread thread;
static {
loggingServices = new Vector<>();
loggingInfoQueue = new ConcurrentLinkedQueue<>();
}
/**
* 日志服务列表
*/
private static Vector<ILoggingService> loggingServices;
private static Queue<LoggingInfo> loggingInfoQueue;
/**
* 注册日志服务 日志服务才是具体的实现
* @param loggingService 日志服务
*/
public static void registerLoggingService(ILoggingService loggingService){
loggingServices.add(loggingService);
}
/**
* 安装日志管理 ,就是创建一个线程,让他不断地执行 ,达到不断地输出日志的目的
* @return
*/
public static boolean install(){
isEixt = false;
thread = new Thread(new Runnable(){
@Override
public void run() {
try {
LoggingInfo loggingInfo = null;
//isEixt的条件一直就是ture,所以这个循环会一直执行,达到监视日志的功能
while (!isEixt || loggingInfo != null ) {
if (loggingInfo != null) {
for (ILoggingService loggingService : loggingServices) {
switch (loggingInfo.loggingLevel) {
case INFO:
loggingService.info(loggingInfo.message, loggingInfo.t);
break;
case ERROR:
loggingService.error(loggingInfo.message, loggingInfo.t);
break;
case DEBUG:
loggingService.debug(loggingInfo.message, loggingInfo.t);
break;
case WARN:
loggingService.warn(loggingInfo.message, loggingInfo.t);
break;
case OPERATION:
loggingService.operation(loggingInfo.message);
break;
}
}
}
//将队列的头放在loggingInfo 变量中
loggingInfo = loggingInfoQueue.poll();
Thread.sleep(100);
}
}catch (Exception ex){
log.error("日志管理器运行出错," + ex.getMessage(),ex);
}
}
});
thread.setDaemon(true);
thread.start();
return true;
}
/**
* 卸载日志管理
* @return
*/
public static boolean uninstall(){
//这里将iseist设置为ture,那就会导致 前面的循环条件达到 不满足,就可以将日志管理卸载掉
isEixt = true;
try {
//防止 有日志还在队列中,先休眠,再进行停止
Thread.sleep(2000);
} catch (Exception ex) {
log.error("日志管理器退出失败," + ex.getMessage(),ex);
}
return true;
}
/**
* 警告日志
* @param message 日志信息
*/
public static void warn(Object message){
warn(message,null);
}
/**
* 警告日志
* @param message 日志信息
* @param t 异常捕获
*/
public static void warn(Object message, Throwable t){
loggingInfoQueue.add(new LoggingInfo(LoggingLevel.WARN, message,t));
}
/**
* 错误日志
* @param message 日志信息
*/
public static void error(Object message){
error(message,null);
}
/**
* 错误日志
* @param message 日志信息
* @param t 异常捕获
*/
public static void error(Object message, Throwable t){
//添加日志信息到队列中
loggingInfoQueue.add(new LoggingInfo(LoggingLevel.ERROR, message,t));
}
/**
* 输出信息
* @param message 日志信息
*/
public static void info(Object message){
info(message,null);
}
/**
* 输出信息
* @param message 日志信息
* @param t 异常捕获
*/
public static void info(Object message, Throwable t){
loggingInfoQueue.add(new LoggingInfo(LoggingLevel.INFO, message,t));
}
/**
* 调试日志
* @param message 日志信息
*/
public static void debug(Object message){
debug(message,null);
}
/**
* 调试日志
* @param message 日志信息
* @param t 异常捕获
*/
public static void debug(Object message, Throwable t){
loggingInfoQueue.add(new LoggingInfo(LoggingLevel.DEBUG, message,t));
}
/**
* 操作日志
* @param message 日志信息
*/
public static void operation(Object message){
loggingInfoQueue.add(new LoggingInfo(LoggingLevel.OPERATION, message,null));
}
}
···
日志服务的接口
package com.supermap.digicity.sdm.common.log;
/**
* @Author: zhangjun
* @Description: 日志服务接口
* @Date: Create in 10:59 2019-9-11
*/
public interface ILoggingService {
/**
* 警告日志
* @param message 日志信息
* @param t 异常捕获
*/
void warn(Object message, Throwable t);
/**
* 错误日志
* @param message 日志信息
* @param t 异常捕获
*/
void error(Object message, Throwable t);
/**
* 输出信息
* @param message 日志信息
* @param t 异常捕获
*/
void info(Object message, Throwable t);
/**
* 调试日志
* @param message 日志信息
* @param t 异常捕获
*/
void debug(Object message, Throwable t);
/**
* 操作日志
* @param message 日志信息
*/
void operation(Object message);
}
日子服务的实现 1 桌面
日志服务 1 桌面
package com.supermap.digicity.sdm.desktop.core.Logs;
import com.supermap.desktop.core.Application;
import com.supermap.digicity.sdm.common.log.ILoggingService;
import lombok.extern.log4j.Log4j;
@Log4j
public class DesktopLoggingService implements ILoggingService {
@Override
public void warn(Object message, Throwable t) {
if(message instanceof String) {
log.warn(message.toString(),t);
}
}
@Override
public void error(Object message, Throwable t) {
if(message instanceof String) {
log.error(message.toString(),t);
}
}
/**
* 输出信息,不添加异常
* @param message 日志信息
* @param t 异常捕获
*/
@Override
public void info(Object message, Throwable t) {
if(message instanceof String) {
log.info(message.toString(), t);
}
}
@Override
public void debug(Object message, Throwable t) {
if(message instanceof String) {
log.debug(message.toString(), t);
}
}
@Override
public void operation(Object message) {
}
}
日子服务的实现 2 kafka
日志服务2 kafka 留空 ,暂未实现,
package com.supermap.digicity.sdm.desktop.core.Logs;
import com.supermap.digicity.sdm.common.log.ILoggingService;
public class KafkaLoggingService implements ILoggingService {
@Override
public void warn(Object message, Throwable t) {
}
@Override
public void error(Object message, Throwable t) {
}
@Override
public void info(Object message, Throwable t) {
}
@Override
public void debug(Object message, Throwable t) {
}
@Override
public void operation(Object message) {
}
}
```
### 日子服务的实现 3 网页页面
与2一致
## 加载方式 (如何使用)
1 启动方式:在你的项目启动的main函数中加入·这一段代码即可
```LoggingManager.registerLoggingService(new DesktopLoggingService());
LoggingManager.registerLoggingService(new KafkaLoggingService());
LoggingManager.install();
```
2: 使用方式:在你认为需要进行日志记录的地方使用如下语句即可
```
1.LoggingManager.info("初始化影像管理");
2.try { }
catch (Exception ex){
LoggingManager.error("" + ex.getMessage(),ex);
}
```
总结
这样的可以将 一个项目中实现很多个日志服务,然后可以对项目中的日志的处理在服务类里面进行实现。,比如我们在桌面日志服务中实现桌面的日志显示,与桌面日志的文件记录,并且还可以在kafka日志服务中可以实现对日志的上传。我们还可以自定义日志的实现。这里使用了log4j,其实你用任何日志都一样,这只是一个项目中的日志管理的轮子。