在我目前正在开发的应用程序中,我们有一个内部构建的日志记录设置,其中来自业务方法的日志消息缓存在ThreadLocal
变量中。实际的日志记录将延迟到servlet调用结束,其中有一个Filter
可以选择所有消息,将它们连接在一起,用映射的诊断上下文中的信息标记它们,然后将它们保存到SQL数据库中单日志条目。
我们希望摆脱这种内部记录器,因为代码质量不是很好,而且维护起来有点困难。上述用例是否可以通过任何公开的Java日志框架实现?我在Logback和Log4j文档中查了一下但是找不到类似的东西。
答案 0 :(得分:0)
您可以使用Logstash
Logstash是一个开源的服务器端数据处理管道 同时从多个源摄取数据,进行变换 它,然后将它发送到你最喜欢的“藏匿处”。
答案 1 :(得分:0)
我们正在做与log4j类似的事情:我们有一个引擎在后台处理请求并将log4j消息记录到临时文件中;在处理结束时,如果记录了某些内容,则通过电子邮件发送临时文件的内容。
开始录制到临时文件:
String root = props
.getProperty("gina.nas.log-capture.root", "gina.nas");
String thresholdLogLevel = props.getProperty(
"gina.nas.log-capture.threshold", "WARN");
String fullLogLevel = props.getProperty("gina.nas.log-capture.level",
"INFO");
String pattern = props.getProperty("gina.nas.log-capture.pattern",
"%d * %-5p * %m [%c]%n");
includeFullLog = Boolean.parseBoolean(props.getProperty(
"gina.nas.log-capture.full-log", "true"));
this.layout = new PatternLayout(pattern);
this.logger = root == null ? Logger.getRootLogger() : Logger
.getLogger(root);
// Threshold log
this.thresholdLogFile = File.createTempFile("thcap", ".log");
thresholdLogAppender = initWriterAppender(thresholdLogFile, layout,
Level.toLevel(thresholdLogLevel));
logger.addAppender(thresholdLogAppender);
停止录制:
logger.removeAppender(thresholdLogAppender);
thresholdLogAppender.close();
if (thresholdLogFile.isFile()) {
if (sendMail && thresholdLogFile.length() > 0) {
LOG.info("Error(s) detected, sending log by email...");
MailService mail = new MailService(props);
Map<String, Object> vars = new HashMap<String, Object>();
vars.put("username", username);
vars.put("taskid", taskID);
vars.put("instance", instance);
vars.put("exception", exception);
vars.put("thresholdLogFile", getFileContent(thresholdLogFile));
mail.sendMessage(LOGCAPTURE_TEMPLATE, null, null, vars);
}
thresholdLogFile.delete();
}
方法initWriteAppender:
private WriterAppender initWriterAppender(File file, PatternLayout layout,
Level level) throws IOException {
OutputStream stream = new FileOutputStream(file);
boolean ok = false;
try {
Writer writer = new OutputStreamWriter(stream, "UTF-8");
try {
WriterAppender result = new WriterAppender(layout, writer);
ok = true;
result.setThreshold(level);
return result;
} finally {
if (!ok) {
writer.close();
}
}
} finally {
if (!ok) {
stream.close();
}
}
}