还是因为日志统一管理,作为一个工具开放出去以后再Layout 中的%只能打印到日志类,无法打印到实际调用类中。上次阅读了代码【slf4j 之 ch.qos.logback 源码阅读】 。这次主要实操进行修改。
主要日志管理类:
public class RLogger {
final static Logger log = LoggerFactory.getLogger("BUSINESS");
final static Logger error = LoggerFactory.getLogger("ERROR");
final static Logger debug = LoggerFactory.getLogger("DEBUGGER");
final static Logger sys = LoggerFactory.getLogger("RSYS");
public static void sysinfo(String mess) {
sys.info(mess);
}
public static void sysinfo(String format, Object... arguments) {
sys.info(format, arguments);
}
public static void sysError(String mess, Throwable t) {
sys.error(mess, t);
error.error(mess, t);
}
public static void info(String mess) {
log.info(mess);
}
public static void info(String format, Object... arguments) {
log.info(format, arguments);
}
public static void warn(String mess) {
log.warn(mess);
}
public static void warn(String format, Object... arguments) {
log.warn(format, arguments);
}
public static void debug(String mess) {
if (debug.isDebugEnabled())
debug.debug(mess);
}
public static void debug(String format, Object... arguments) {
debug.debug(format, arguments);
}
public static void error(String mess, Throwable t) {
log.info(mess);
error.error(mess, t);
}
public static void error(String mess) {
log.info(mess);
error.error(mess);
}
public static boolean isDebugEnabled() {
return debug.isDebugEnabled();
}
}
这个类作为内置的方法别的类或者多开发者直接调用相关静态方法就行不用再每个类中声明静态logger对象。
Layout 重写
public class RLogLayout extends PatternLayout{
public RLogLayout() {
super();
defaultConverterMap.put("C", RLogClassOfCallerConverter.class.getName());
}
}
这个很简单主要是为了修改再%C 配置时的获取调用类的类名具体实际操作是RLogClassOfCallerConverter.class
RLogClassOfCallerConverter
public class RLogClassOfCallerConverter extends NamedConverter {
protected String getFullyQualifiedName(ILoggingEvent event) {
StackTraceElement[] cda = event.getCallerData();
if (cda != null && cda.length > 1) {
return cda[1].getClassName();
} else {
return CallerData.NA;
}
}
}
这里是主要的获取调用类方法。原方法为ClassOfCallerConverter 类可以参考。
logback.xml 配置部分
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<!-- 控制台输出的日志 的格式 -->
<layout class="RLogLayout">
<Pattern>
%d{HH:mm:ss.SSS}[%thread][ %-5level] > %logger %C > %msg%n
</Pattern>
</layout>
</appender>
直接再 layout 节点中指定重写的RLogLayout 即可