当前位置: 首页 > 知识库问答 >
问题:

用于详细(和多行)日志的Java日志API

祝高超
2023-03-14
    null

例如,对于单个多行日志,如下所示:

2017-11-10 14:26:59,156 [main] WARN o.s.t.c.s.ExampleClass:
    Caption: Unconformable data
    Description: The data provided from the X datasource in order to perform Y operation could not be translated
    Response Action: Application will discard unusable data into this component's DLQ
    Details: The data string "x" was not of expected Integer type
        <Some stacktrace>....

这是一个详细的语句,它将非常详细地说明发生了什么,发生在哪里,以及应用程序在响应异常事件时正在做什么。

我能找到的最接近的是JBoss日志API和在ActiveMQ Artemis源代码中找到的一些代码示例。可以在单个文件中定义消息格式声明,如下所示:

   @LogMessage(level = Logger.Level.WARN)
   @Message(id = 202008, value = "Failed to check Address list {0}.",
      format = Message.Format.MESSAGE_FORMAT)
   void failedToParseAddressList(@Cause Exception e, String addressList);
ActiveMQUtilLogger.LOGGER.failedToParseAddressList(e, addressList);

有人对这个问题有什么建议吗--不管是另一个API、代码模式还是一个漂亮的技巧?

共有1个答案

尚宏硕
2023-03-14

您还没有说明不使用log4j2的具体原因,所以我建议您使用该方法。正如您所指出的,它提供了structuredDataMessage,您可以使用它来满足您的需要。虽然在本例中,我建议使用MapMessage,因为您的示例中没有包含idtype,这些都内置在structuredDataMessage类中。

下面是一些快速示例代码:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.message.MapMessage;

public class MapMessageExample {

    private static final Logger log = LogManager.getLogger();   

    public static void main(String[] args){
        log.info(buildMsg("My title", "This is the description", 
                "No response needed", "Some details here"));        
    }

    // This could be moved into a factory class
    public static MapMessage buildMsg(String title, String description, 
            String responseAction, String details)
    {
        MapMessage mapMsg = new MapMessage();
        mapMsg.put("title", title);
        mapMsg.put("desc", description);
        mapMsg.put("response", responseAction);
        mapMsg.put("details", details);
        return mapMsg;
    }
}

和一个log4j2.xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%M] %-5level %logger{36}%n\tCaption: ${map:title}%n\tDescription: ${map:desc}%n\tResponse Action: ${map:response}%n\tDetails: ${map:details}%n" />
        </Console>
    </Appenders>

    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

下面是一些示例输出:

00:40:45.810 [main] INFO  example.MapMessageExample
    Caption: My title
    Description: This is the description
    Response Action: No response needed
    Details: Some details here

我同意,工厂模式将是一个很好的选择。正如我在示例代码中所评论的,您可以将buildMsg方法移动到工厂类中。

但是,它比使用像这样的JBoss API要大一点。

我真的不知道它有什么更大的。如果您发现大多数时候MapMessage中只有一两个项在更改,那么您可以轻松地编写与您提到的API类似的非常特定的方法。要添加到上面的示例中:

public static MapMessage reallySpecificLogMessage(String details){
    return buildMsg("My specific message title", "My specific description",
            "My specific response action", details);
}
 类似资料:
  • 我刚拿到一台新的索尼Xperia XA,在这台设备上发现了一个奇怪的问题。它没有显示任何详细的调试日志。我尝试了Android Studio中的每个设置,使用adb logcat检查Android Studio是否只是过滤它们。我甚至使用了不同的电缆。我没主意了,请帮帮我。

  • 我从syslog得到了关于mysql的日志,但是它们太简短了,因为它们没有告诉我(或者至少我认为)是什么导致mysql以状态1终止。有人能帮我拿更详细的日志吗? 最好,袁 5月25日18:32:21巴纳德内核:[1587749.902491]type=1400审核(1337985141.215:263):apparmor=“STATUS”operation=“profile_replace”nam

  • 我有一个程序,在FTP和SFTP之间交替使用,以便在远程服务器上执行一些操作。 对于FTP部分,我使用Apache Commons FTP客户端,而对于SFTP,我使用JSch库。 ApacheCommons可以也将完全详细地打印出客户机向服务器发出的所有命令,以及服务器的响应。 为了使我的应用程序在这两种情况下的日志记录方式保持一致,我想对JSch做一些类似的事情。 我已经尝试成功地实现了JSc

  • 本文向大家介绍python logging日志模块以及多进程日志详解,包括了python logging日志模块以及多进程日志详解的使用技巧和注意事项,需要的朋友参考一下 本篇文章主要对 python logging 的介绍加深理解。更主要是 讨论在多进程环境下如何使用logging 来输出日志, 如何安全地切分日志文件。 1. logging日志模块介绍 python的logging模块提供了灵

  • 本文向大家介绍Tomcat 日志切割(logrotate)详细介绍,包括了Tomcat 日志切割(logrotate)详细介绍的使用技巧和注意事项,需要的朋友参考一下 Tomcat 日志切割 logrotate是个强大的系统软件,它对日志文件有着一套完整的操作模式,譬如:转储、邮件和压缩等,并且默认logrotate加到cron(/etc/cron.daily/logrotate)作为每日任务执行

  • 本文向大家介绍XenServer 日志清理方法详细介绍,包括了XenServer 日志清理方法详细介绍的使用技巧和注意事项,需要的朋友参考一下  XenServer日志清理 相信很多人被Xenserver日志填满磁盘空间,导致机器最终挂掉的问题所困扰,我遇见了2次(有一次是pool master挂掉,200号人1个小时无法办公)。令人很是头疼。 服务器使用时间长了,XenServer产生了很多日志