Logback 附加程序将消息作为 HTTP 消息发布

2024-05-03

根据我的要求,我只想将 HTTP 消息发布到另一端,该消息由org.slf4j.LoggerFactory.getLogger().

以下 JSON 字符串记录在INFO level.

{
  "studentName": "My Name",
  "Deratment": "Computer Science",
  "address": {
     "Address Line1": "My Address Line1",
     "Address Line2": "My Address Line2",
     "Address Line3": "My Address Line3"
  }
}

考虑因素,

  1. Http 消息应使用 MIME 类型发布application/json

  2. 应该只处理特定的登录INFO级别不是全部。

Logback 中有内置的appender 可以实现这一点吗?

如果没有,最好的方法是什么?


我认为发布 json 消息的最佳方法是使用 org.apache.logging.log4j 。

第一步:添加maven依赖

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.11.1</version>
</dependency>

以及构建 json 的任何依赖项,例如

<dependency>
     <groupId>com.google.code.gson</groupId>
     <artifactId>gson</artifactId>
     <version>2.8.5</version>
</dependency>

第 2 步:编写自定义布局来创建 json

@Plugin(name = "CustomJsonLayout", category = Node.CATEGORY, elementType = Layout.ELEMENT_TYPE)
public class CustomJsonLayout extends AbstractStringLayout {
    private static final Gson gson = new Gson();

    public CustomJsonLayout(Configuration config, Charset aCharset, Serializer headerSerializer, Serializer footerSerializer) {
        super(config, aCharset, headerSerializer, footerSerializer);
    }

    @PluginFactory
    public static CustomJsonLayout createLayout(@PluginConfiguration final Configuration config,
                                                @PluginAttribute(value = "charset", defaultString = "US-ASCII") final Charset charset) {
        return new CustomJsonLayout(config, charset, null, null);
    }

    @Override
    public String toSerializable(LogEvent event) {
        JsonObject jsonObject = new JsonObject();

        // as example
        jsonObject.addProperty("application_name", "MyApp");
        jsonObject.addProperty("timestamp", "" + System.currentTimeMillis());

        // some log Information
        jsonObject.addProperty("level", event.getLevel().name());
        jsonObject.addProperty("thread", event.getThreadName());
        jsonObject.addProperty("thread_id", event.getThreadId());
        jsonObject.addProperty("logger_name", event.getLoggerName());

        // extra information
        final StackTraceElement source = event.getSource();
        JsonObject sourceObject = new JsonObject();
        sourceObject.addProperty("class", source.getClassName());
        sourceObject.addProperty("method", source.getMethodName());
        sourceObject.addProperty("file", source.getFileName());
        sourceObject.addProperty("line", source.getLineNumber());
        jsonObject.add("source", sourceObject);

        // your log message
        jsonObject.addProperty("message", event.getMessage().getFormattedMessage());

        // Exceptions
        if (event.getThrownProxy() != null) {
            final ThrowableProxy thrownProxy = event.getThrownProxy();
            final Throwable throwable = thrownProxy.getThrowable();

            final String exceptionsClass = throwable.getClass().getCanonicalName();
            if (exceptionsClass != null) {
                jsonObject.addProperty("exception", exceptionsClass);
            }

            final String exceptionsMessage = throwable.getMessage();
            if (exceptionsMessage != null) {
                jsonObject.addProperty("cause", exceptionsMessage);
            }

            final String stackTrace = thrownProxy.getExtendedStackTraceAsString("");
            if (stackTrace != null) {
                jsonObject.addProperty("stacktrace", stackTrace);
            }
        }

        return gson.toJson(jsonObject).concat("\r\n");
    }

}

步骤 3:配置 log4j2.xml,其中 yourUrl - 如果使用 Spring Boot,则为 application.properties 中的目标 url (yourUrl=http://... http://....)

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="urlProp">${bundle:application:yourUrl}</Property>
    </Properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
        <Http name="Http" url="${urlProp}">
            <Property name="X-Java-Runtime" value="$${java:runtime}" />
            <CustomJsonLayout/>
        </Http>
        <File name="LogToFile" fileName="logs/app.log">
            <PatternLayout>
                <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="10"/>
        </File>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Http"/>
            <AppenderRef ref="Console"/>
            <AppenderRef ref="LogToFile"/>
        </Root>
    </Loggers>
</Configuration>

第 4 步:最后,您可以在任何课程中使用记录器

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

private static final Logger logger = LogManager.getLogger(App.class);

logger.info("Application started");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Logback 附加程序将消息作为 HTTP 消息发布 的相关文章

随机推荐

  • TEdit onclick 全选?

    每当用户单击 TEdit1 或单击选择其中的某些文本时 如何选择 TEdit1 的所有文本 执行超出默认行为的任何操作都可能非常危险TEdit控制 您的用户知道标准 Windows 控件的行为方式 任何偏离此的行为都可能导致混乱 默认情况下
  • 在 ggplot2 facet_wrap 标签上使用半填充的正方形

    我正在尝试使用标签上的一半 以及四分之一填充 方块来生成 ggplot2 图表 但 Mac 上的 ggplot2 似乎不支持某些符号 例如 当我输入 print u25E9 它显示一个半黑的正方形 但是当我尝试在 ggplot 中使用它时
  • 如何检查一组行中是否至少有一个具有特定值

    我需要找到属于满足特定条件的任何组的所有行 我将组定义为共享 组 列中的值的几行 相关组必须至少包含一行且 Eligible 设置为 true 并且该组中至少有两行在 Group 或 Eligible 以外的任何列中必须彼此不同 示例表 G
  • 为什么 ThreadLocal 实用程序在 Spring MVC 应用程序中总是返回 null?

    我编写了这个实用程序类来在 Spring MVC 应用程序中保存临时数据 public abstract class FooUtil private static final ThreadLocal
  • 对 python 2.7 的支持结束了吗?

    是否有一个已知的日期 时间范围 将不再支持 python 2 7 转而支持 python 3 截至 2014 年 4 月 13 日 从http hg python org peps rev 76d43e52d978 http hg pyth
  • ruby 1.9 如何将数组转换为不带括号的字符串

    我的问题是关于如何在 ruby 1 9 中将数组元素转换为字符串而不需要括号和引号 我有一个数组 数据库提取 我想用它来创建定期报告 myArray Apple Pear Banana 2 15 12 在 ruby 1 8 中我有以下行 r
  • 如何让iOS 7下的UISwitch不采用其后面视图的背景颜色?

    关闭时看起来像这样 虽然我更喜欢灰色背景 我真的必须使用 UIImageView 吗 以下是我更改 iOS7 UISwitch 的填充颜色的方法 首先您需要导入 QuartzCore import
  • C++中的引用类型是POD类型吗?

    C 中的引用类型也是POD类型吗 是int 是POD类型吗 那么呢 struct Q int i 有人可以帮助我吗 No 设置引用某些内容的成员的唯一方法是通过用户声明的构造函数 因此 您的结构是非 POD 的 Update 答案仍然是否定
  • 如何检查并关闭Excel文件是否已在Java中打开[重复]

    这个问题在这里已经有答案了 可能的重复 Java 检查文件是否已打开 https stackoverflow com questions 1390592 java check if file is already open 我正在制作一个
  • limit 关键字在 gcc/g++ 中是否提供了显着的好处?

    有没有人见过关于是否使用 C C 的任何数字 分析restrictgcc g 中的关键字实际上在现实中 而不仅仅是理论上 提供了任何显着的性能提升 我读过各种推荐 贬低其使用的文章 但我还没有遇到任何实际数字可以证明双方的论点 EDIT 我
  • 如何使用 nuxt 和 @vue/composition-api 提供/注入 Vue 根实例?

    我正在尝试使用 vue apollo 可组合 https v4 apollo vuejs org guide composable setup html 1 install vue apollo composable与我的 Nuxt Ts
  • 找不到我的绑定的 inflate 方法(使用 Android,数据绑定。)

    我正在使用数据绑定来绑定 Android 应用程序中的布局 我已经设置了布局 my custom xml 并生成了绑定类 MyCustomBinding 但 Android Studio 似乎没有立即找到 Binding 类的 inflat
  • 滚动 swiftUI 列表时,未调用单元格的任务修改器。怎么修?

    我写了一个异步图像视图 with swiftui 并在列表单元格中使用 AsyncImgView 使用任务修饰符在 Img 出现时从缓存或网络下载 Img 在 iOS16 之前一切正常 但在iOS16我发现当我滚动列表新细胞的AsyncIm
  • OTP(令牌)应自动从消息中读取

    我正在开发一个 Android 应用程序 其中服务器发送 OTP 用户需要在应用程序中输入此 OTP 才能注册我的应用程序 我想要的是 我的应用程序应该能够自动读取服务器发送的 OTP 我怎样才能实现这个目标 在这方面的任何帮助或指导将不胜
  • 在 ng-repeat 中使用 bootstrap popover

    我有一个引导程序弹出窗口 它在有角度的外部工作ng repeat a href class tt1 Hover over me a 一旦我在 ng repeat 中使用它 它就会停止工作 我在角度控制器构造函数中初始化弹出窗口 tt1 po
  • Ansible 循环直到条件匹配。

    我想进行一系列 API 调用 每次调用后检查结果中的特定参数 如果它大于特定值 则将其保存在寄存器中并继续进一步执行剧本 基本上 我正在对 RHEV 进行 API 调用来检查存储域 然后我想检查存储域是否有足够的空间 如果有 则将该存储域i
  • 如何在 Visual Studio 中打开 .rdl 文件?

    我有一个 rdl 文件 需要在 Visual Studio 中打开 当我尝试打开该文件时 我得到了一个 XML 文件 但是 我无法看到设计器格式 我不知道使用哪个版本的 Visual Studio 创建此 rdl 文件 是否可以在 Visu
  • 如何引导用户为我的应用程序启用辅助功能服务

    我知道不可能以编程方式启用应用程序的辅助功能服务 因此我想将用户引导至此屏幕 System settings gt Accessibility gt app name gt enable disable screen 那可能吗 您可以将它们
  • Java中使用JsonPath解析JSON

    我是 Json Path 的新手 我已将 json path 0 8 0 jar 添加到我的 Eclipse 构建路径中 我从以下位置复制了 JSON http code google com p json path http code g
  • Logback 附加程序将消息作为 HTTP 消息发布

    根据我的要求 我只想将 HTTP 消息发布到另一端 该消息由org slf4j LoggerFactory getLogger 以下 JSON 字符串记录在INFO level studentName My Name Deratment C