官方建网站哪个好,响应式网站和传统网站,海南网站优化公司,做足球采集软件和预测软件的网站slf4j 是一个日志规范框架#xff1b;基本上所有的 JAVA 日志都要实现这个规范#xff1b;比如#xff1a;Logback、log4j、log4j2#xff1b;本文档记载如何实现 slf4j 规范#xff1b;实现自己的日志框架#xff1b;
slf4j 分为两个部分#xff0c;其中包含 #xf…slf4j 是一个日志规范框架基本上所有的 JAVA 日志都要实现这个规范比如Logback、log4j、log4j2本文档记载如何实现 slf4j 规范实现自己的日志框架
slf4j 分为两个部分其中包含 1.7.x 及其以前的版本、1.7.x 以后的版本之所以这么说是因为他们区分注册方式前面的版本使用固定的类路径进行注册后面版本使用 JAVA SPI 进行注册
1. 重写日志实现
实现日志打印类包含了日志输出的逻辑方法
package com.maple.logger;import org.slf4j.Logger;import java.io.Serializable;public final class MapleLogger implements Logger, Serializable {private final String loggerName;public MapleLogger(String loggerName) {this.loggerName loggerName;}Overridepublic String getName() {return this.loggerName;}
}实现日志打印类获取工厂
package com.maple.logger;import org.slf4j.ILoggerFactory;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;public class MapleLoggerFactory implements ILoggerFactory {private final ConcurrentMapString, MapleLogger loggerMap new ConcurrentHashMap();Overridepublic MapleLogger getLogger(String name) {MapleLogger logger loggerMap.get(name);if (logger ! null) {return logger;} else {MapleLogger newInstance new MapleLogger(name);MapleLogger oldInstance loggerMap.putIfAbsent(name, newInstance);return oldInstance null ? newInstance : oldInstance;}}
}2. 日志绑定
这里才是不同版本的区别负责把日志框架绑定到运行的程序上下文中
首先说 1.7.x 之前的版本绑定方法
创建一个绑定类用于返回日志工厂实力但是此类路径必须固定死为 org.slf4j.impl.StaticLoggerBinder 如果不是这个全限定名则无法进行绑定
package org.slf4j.impl;import com.maple.logger.MapleLoggerFactory;
import org.slf4j.ILoggerFactory;public class StaticLoggerBinder implements org.slf4j.spi.LoggerFactoryBinder {private static StaticLoggerBinder SINGLETON new StaticLoggerBinder();public static String REQUESTED_API_VERSION 1.0;private static final String loggerFactoryClassStr MapleLoggerFactory.class.getName();private final ILoggerFactory loggerFactory;private StaticLoggerBinder() {loggerFactory new MapleLoggerFactory();}Overridepublic ILoggerFactory getLoggerFactory() {return loggerFactory;}Overridepublic String getLoggerFactoryClassStr() {return loggerFactoryClassStr;}public static StaticLoggerBinder getSingleton() {return SINGLETON;}
}
再说 1.7.x 之后的版本绑定方法
这里采用 SPI 方式进行加载日志绑定类首先创建日志绑定类
package com.maple.logger;import org.slf4j.ILoggerFactory;
import org.slf4j.IMarkerFactory;
import org.slf4j.helpers.BasicMDCAdapter;
import org.slf4j.helpers.BasicMarkerFactory;
import org.slf4j.spi.MDCAdapter;
import org.slf4j.spi.SLF4JServiceProvider;public class MapleSLF4JServiceProvider implements SLF4JServiceProvider {public static String REQUESTED_API_VERSION 2.0.16;private ILoggerFactory loggerFactory;private IMarkerFactory markerFactory; // 可以根据自己需求进行重写private MDCAdapter mdcAdapter; // 可以根据自己需求进行重写Overridepublic void initialize() {loggerFactory new MapleLoggerFactory();markerFactory new BasicMarkerFactory();mdcAdapter new BasicMDCAdapter();}Overridepublic ILoggerFactory getLoggerFactory() {return loggerFactory;}Overridepublic IMarkerFactory getMarkerFactory() {return markerFactory;}Overridepublic MDCAdapter getMDCAdapter() {return mdcAdapter;}Overridepublic String getRequestedApiVersion() {return REQUESTED_API_VERSION;}
}然后添加 SPI 文件在 resources/META-INF/services 下创建 org.slf4j.spi.SLF4JServiceProvider 文件文件内容即上面方法的全限定名