每个servlet调用组Java日志条目

时间:2017-05-23 11:38:17

标签: java servlets logging

在我目前正在开发的应用程序中,我们有一个内部构建的日志记录设置,其中来自业务方法的日志消息缓存在ThreadLocal变量中。实际的日志记录将延迟到servlet调用结束,其中有一个Filter可以选择所有消息,将它们连接在一起,用映射的诊断上下文中的信息标记它们,然后将它们保存到SQL数据库中单日志条目。

我们希望摆脱这种内部记录器,因为代码质量不是很好,而且维护起来有点困难。上述用例是否可以通过任何公开的Java日志框架实现?我在Logback和Log4j文档中查了一下但是找不到类似的东西。

2 个答案:

答案 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();
        }
    }
}