(1). 概述
在xxl-job-admin可以查看远程job执行日志,那么这一部份是怎么实现的呢?
(2). XxlJobLogger打印日志
// xxl-job要求打印日志,要求通过这个类来进行输出.
XxlJobLogger.log("XXL-JOB, Hello World.");
(3). XxlJobLogger.log
import org.slf4j.helpers.FormattingTuple;
import org.slf4j.helpers.MessageFormatter;
public static void log(String appendLogPattern, Object ... appendLogArguments) {
// 1. 引用的是:slf4j,刚开始我以为是引用了JDK的MessageFormater
// appendLogPattern : 为表达式,例如:log( "hello,[{}]" , "world")
// appendLogArguments : 表达式中的占位符
FormattingTuple ft = MessageFormatter.arrayFormat(appendLogPattern, appendLogArguments);
// 2. 格式化后的字符串信息.
String appendLog = ft.getMessage();
// 3. new Throwable().getStackTrace()
// StackTraceElement返回的是调用栈信息.这里为什么是1,是因为要把当前方法给排除掉.
StackTraceElement callInfo = new Throwable().getStackTrace()[1];
logDetail(callInfo, appendLog);
} // end log
private static void logDetail(StackTraceElement callInfo, String appendLog) {
// 打印日志的格式如下:
/*// "yyyy-MM-dd HH:mm:ss [ClassName]-[MethodName]-[LineNumber]-[ThreadName] log";
StackTraceElement[] stackTraceElements = new Throwable().getStackTrace();
StackTraceElement callInfo = stackTraceElements[1];*/
StringBuffer stringBuffer = new StringBuffer();
stringBuffer
// 时间
.append(DateUtil.formatDateTime(new Date()))
.append(" ")
// 类名称+方法名称
.append("["+ callInfo.getClassName() + "#" + callInfo.getMethodName() +"]").append("-")
// 代码所在的行数
.append("["+ callInfo.getLineNumber() +"]").append("-")
// 线程名称
.append("["+ Thread.currentThread().getName() +"]").append(" ")
// 日志详细内容
.append(appendLog!=null?appendLog:"");
String formatAppendLog = stringBuffer.toString();
// 要写入的文件路径,从ThreadLocal中获取,那么,肯定会先在ThreadLocal中保存.
// 不关注这个内容了.
// appendlog
String logFileName = XxlJobFileAppender.contextHolder.get();
if (logFileName!=null && logFileName.trim().length()>0) {
// 把日志信息写入到文件中
XxlJobFileAppender.appendLog(logFileName, formatAppendLog);
} else {
logger.info(">>>>>>>>>>> {}", formatAppendLog);
}
} //end logDetail
(4). 总结
xxl-job对日志输出这一块,除了日志格式化,其余的内容相当是自己写了一套了.