Json 将消息作为HTTP消息发布的Logback appender

Json 将消息作为HTTP消息发布的Logback appender,json,log4j,logback,slf4j,Json,Log4j,Logback,Slf4j,根据我的要求,我只想将HTTP消息发送到另一端,该消息由org.slf4j.LoggerFactory.getLogger()记录 以下JSON字符串记录在信息级别 { "studentName": "My Name", "Deratment": "Computer Science", "address": { "Address Line1": "My Address Line1", "Address Line2": "My Address Line2",

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

以下JSON字符串记录在
信息级别

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

  • Http消息应使用MIME类型
    application/json

  • 应该只处理特定的登录
    INFO
    级别,而不是全部

  • Logback中是否有内置的appender来实现这一点


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

    Logback与logstash配合使用非常好:

    第一步是配置logback到logstash的连接

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
      <appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
          <destination>127.0.0.1:4560</destination>
    
          <!-- encoder is required -->
          <encoder class="net.logstash.logback.encoder.LogstashEncoder" />
      </appender>
    
      <root level="DEBUG">
          <appender-ref ref="stash" />
      </root>
    </configuration>
    

    (请参阅)

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

    步骤1:添加maven依赖项

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.11.1</version>
    </dependency>
    
    步骤3:配置log4j2.xml,如果使用spring boot(yourUrl=),则从application.properties将yourUrl-目标url配置在其中


    这不是HTTP,只是TCP。
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.11.1</version>
    </dependency>
    
    <dependency>
         <groupId>com.google.code.gson</groupId>
         <artifactId>gson</artifactId>
         <version>2.8.5</version>
    </dependency>
    
    @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");
        }
    
    }
    
    <?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>
    
    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");