项目中实现多日志实现与管理

7 篇文章 0 订阅
5 篇文章 0 订阅

前言

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,其实你用任何日志都一样,这只是一个项目中的日志管理的轮子。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值