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 消息发布 的相关文章

  • 使用 Django 添加额外 \\ 字符的 JSON 编码

    我正在尝试创建一个函数 将包含消息和 Django 模型实例的字典转换为 JSON 然后我可以将其传回客户端 例如 我在 models py 中定义了模型 Test from django db import models class Te
  • 使用 catch all 字典属性将 json 序列化为对象

    我想使用 JSON net 反序列化为对象 但将未映射的属性放入字典属性中 是否可以 例如给定 json one 1 two 2 three 3 和 C 类 public class Mapped public int One get se
  • Mongoose查询结果是只读的吗?

    如何修改 Mongoose 查询返回的对象 假设我们有以下模式 var S new mongoose Schema name String field String 我对结果进行了以下查询和修改 var retrieve function
  • 使用 Rails 中的 postgres json 字段更新嵌套键

    我一直在尝试更新以下内容 boxes book 2 moving 2 goods to boxes book new 2 moving 2 goods 无需使用正则表达式或在 ruby 中执行此操作 但似乎有点棘手 我想添加新密钥 然后删除
  • log4j-extras MaxBackupIndex 或类似的

    我正在使用 log4j extras 1 2 17 org apache log4j rolling RollingFileAppender with a org apache log4j rolling TimeBasedRollingP
  • 返回视图作为 JSON 对象的一部分

    我有一个应用程序只加载一次完整视图 我这样做的原因并不重要 重要的是 其余内容只会以部分视图的形式返回 除了一些内容之外 我还有一些 JSON 对象 我想通过每个 AJAX 请求在服务器之间来回传递 有没有办法返回一个 JSON 对象 并将
  • mysql_query 保留返回时在表中创建的数据类型?

    我在mysql中有一个表 CREATE TABLE user id INT name VARCHAR 250 我查询表 result mysql query SELECT id name FROM user 我收集结果 while row
  • slf4j-log4j12 和 log4j-over-slf4j 之间的区别

    slf4j log4j12 和 有什么区别log4j over slf4j https www slf4j org legacy html log4j over slf4j以及什么时候应该使用它们
  • 清理 MongoDB 的输入

    我正在为 MongoDB 数据库程序编写 REST 接口 并尝试实现搜索功能 我想公开整个 MongoDB 接口 我确实有两个问题 但它们是相关的 所以我将它们放在一篇文章中 使用 Python json 模块解码不受信任的 JSON 是否
  • 如何将 JSON 文本转换为 PHP 关联数组

    我将以下 JSON 对象存储在文本文件 data txt 中 player black time 0 from 2c to 3d 我使用 php 阅读 问题 有没有简单的方法可以转换 data到 PHP 关联数组 我尝试过使用json de
  • 在 Node.js 中创建 JSON 数组

    我需要在用 Node js 编写的服务器中创建一个 JSON 字符串 以便在请求时发送到客户端 问题是这个 JSON 取决于服务器中的可用数据 因此 JSON 数组的大小并不总是相同 我已经尝试了一整天 但尽管我感觉很接近 但我仍然不明白
  • 如何将 Json 放入 asynctask - Android

    我有一个连接到数据库并返回结果的 json 函数 它会执行此操作大约 15 次或根据数据库中有多少条评论执行此操作 json 函数位于 while 循环内 并重复自身 直到从数据库中获取所有评论或达到 15 条评论 问题是当应用程序加载评论
  • JSON(Gson)反序列化为超类对象然后转换为子类对象的最佳方法是什么

    我目前正在研究在Android上使用Gson for Json 刚刚遇到这个问题 假设我们有如下类 class Command public int id COMMAND ID UNSPECIFIED class CommandSpecif
  • Logback线程池

    我使用 Logback 进行日志记录 我有一个问题 我将 AsyncAppender 与 ConsoleAppender 结合使用 当应用程序启动时 它会创建具有 logback 线程名称的线程池 所有日志记录工作均由 AsyncAppen
  • 如何解析多态 JSON 数组?

    我有一个 JSON 格式的文件 其中包含个人用户的记录 一些用户的记录中间有一个评论字段 我只想解析顶级项目 全名 贡献者姓名 电子邮件 使用 Newtonsoft JSON 解析器 但我似乎无法让它识别单个对象 当我将整个字符串解析为一个
  • 将新属性动态添加到 Node 中现有的 JSON 数组中

    我需要添加当前 JSON 中不存在的属性 json 对象如下所示 var jsonObj result OK data 我想在 数据 中添加温度 我可以像下面那样做 jsonObj data push temperature 然后 我想在
  • 在 postgresql 9.4 或 9.5 中查询 json 对象的嵌套数组中的元素

    studentID 1 StudentName jhon Data schoolname school1 enrolmentInfo year 2015 info courseID csc213 school IT enrollmentda
  • 气流:如何将读取 json 文件的方法放入本地库中

    我必须产生一些DAG 我已将 json 表架构文件保存在GCP铲斗 https cloud google com storage docs json api v1 buckets GCP 存储桶上的文件关联到composer将被重新映射到
  • Google 地图查询返回的 JSON 包含像 \x26 这样的编码字符(如何解码?)

    在 Java 应用程序中 我获取 JSON 来自 Google 地图 其中包含以下字符 x26我想将其转换为其原始字符 据我所知 这是一个 UTF 8 表示法 但我不完全确定 在源 JSON 中 可能会出现各种编码字符 例如 x3c div
  • 覆盖hadoop中的log4j.properties

    如何覆盖hadoop中的默认log4j properties 如果我设置 hadoop root logger WARN console 它不会在控制台上打印日志 而我想要的是它不应该在日志文件中打印 INFO 我在 jar 中添加了一个

随机推荐

  • 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