繁体   English   中英

spring boot 自定义滚动日志文件

[英]spring boot custom rolling log file

我们有一个 spring boot 应用程序,并使用带有滚动文件的 logback 来创建 json 和标准日志文件。

我们使用 filebeat 抓取 log.json 文件并推送到 elk 服务器

我想在日志目录中添加一个 op.json 自定义 json 滚动日志文件。 这是为了收集有关调用和性能信息的操作的信息。

基本上,我只想使用一个管理滚动文件的类。 在类中,会有一个 logOp 函数,它接收一个 java 对象,并对其进行序列化,在 json 输出中添加一些标准的日志字段。

问题:1) {Not linkly, but would be nice} logback 中是否有允许我创建一个命名记录器的功能,该记录器将一个字符串(在我的例子中是序列化的 JSON)附加到 op.json 日志文件的末尾,并且实现滚动记录器功能

2)如果这不能通过logback获得(我会理解)。 是否有管理将字符串附加到滚动文件的 java 包? 我可以创建这个“Appender”的一个实例并向它添加字符串。 这就像 logback 中的独立滚动文件附加程序

我的目标是创建一个简单的 JSON 文件,可以直接查看和/或使用 filebeat 抓取并发送到 logstash 以创建操作性能仪表板。

-------------------- spring-boot-logger.log 和 spring-boot-logger.json 文件的配置 {for log.debug("my log message},包括侦探 ----------

<include resource="org/springframework/boot/logging/logback/defaults.xml"/>

<springProperty scope="context" name="site" source="ci2.application"/>
<springProperty scope="context" name="app" source="spring.application.name"/>


<property name="LOGS" value="./logs" />


<!-- You can override this to have a custom pattern -->
<property name="CONSOLE_LOG_PATTERN"
          value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>

<!-- Appender to log to console -->
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <!-- Minimum logging level to be presented in the console logs-->
    </filter>
    <encoder>
        <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        <charset>utf8</charset>
    </encoder>
</appender>



<appender name="RollingFile"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOGS}/spring-boot-logger.log</file>
    <encoder>
        <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        <charset>utf8</charset>
    </encoder>
    <rollingPolicy
        class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- rollover daily and when the file reaches 10 MegaBytes -->
        <fileNamePattern>${LOGS}/archived/spring-boot-logger-%d{yyyy-MM-dd}.%i.log
        </fileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy
            class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>10MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
</appender>


<appender name="Json"
          class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOGS}/spring-boot-logger.json</file>
    <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
        <providers>
            <timestamp>
                <timeZone>UTC</timeZone>
            </timestamp>
            <pattern>
                <pattern>
                    {
                    "severity": "%level",
                    "service": "${app:-}",
                    "trace": "%X{X-B3-TraceId:-}",
                    "span": "%X{X-B3-SpanId:-}",
                    "parent": "%X{X-B3-ParentSpanId:-}",
                    "exportable": "%X{X-Span-Export:-}",
                    "pid": "${PID:-}",
                    "thread": "%thread",
                    "class": "%logger{40}",
                    "rest": "%message",
                    "schema":"ci2",
                    "group":"devops",
                    "site": "${site}"

                    }
                </pattern>
            </pattern>
        </providers>
    </encoder>  
    <rollingPolicy
        class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- rollover daily and when the file reaches 10 MegaBytes -->
        <fileNamePattern>${LOGS}/archived/spring-boot-logger-%d{yyyy-MM-dd}.%i.json
        </fileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy
            class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>10MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>

</appender>

<!-- LOG everything at INFO level -->
<root level="warn">
    <appender-ref ref="RollingFile" />
    <appender-ref ref="Console" />
    <appender-ref ref="Json" />
</root>

<!-- LOG everything at INFO level -->
<root name="org.springframework" level="info">
    <appender-ref ref="RollingFile" />
    <appender-ref ref="Console" />
    <appender-ref ref="Json" />
</root>


<!-- LOG "com.siemens.pl*" at INFO level -->
<logger name="com.siemens.pl" level="info" additivity="false">
    <appender-ref ref="RollingFile" />
    <appender-ref ref="Console" />
    <appender-ref ref="Json" />
</logger>

----------------- 结束 logback 配置 --------------- ---

我正在尝试向 json 日志动态添加值。

就像是

1) 最高级别的支持,将地图中的值添加为生成的 json 中的 JSON 条目

 something like



    Map myValues = new HashMap<String,String> ();
    myValues.put("startTime",startTime);
    myValues.put("endTime",endTime);
    myValues.put("op",operation);
    myValues.put("user",user);
    // ideal usage format, would add map as "key":"value"  to json output
    log.debug(myValues);

2)如果将用户生成的 sting 附加到日志文件(日志记录不添加任何内容),我可以生成日志字符串(json myKeys + stander logging),然后附加

    Map myValues = new HashMap<String,String> ();
    myValues.put("startTime",startTime);
    myValues.put("endTime",endTime);
    myValues.put("op",operation);
    myValues.put("user",user);

    #Generate JSON String that includes standard logging fields and dynamic
    # user fileds passed in myValues map
    String myLogStringToAppendToLogFile = generateLogString(myValues);


    #Ideal op would accept string and append user provide string to end of
    #logfile with no modification
    log.debug("RawString", myLogStringToAppendToLogFile );
    log.debug(myValues);

以上将是最简单的,我不确定记录器上是否有可以接受地图并添加到日志的 API

记录器的另一个选择是向 json 文件添加一组固定的属性,并且可以在用户日志行中传递属性值。

例如,从上面的 logback def -------------------

<appender name="Json"
          class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOGS}/spring-boot-logger.json</file>
    <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
        <providers>
            <timestamp>
                <timeZone>UTC</timeZone>
            </timestamp>
            <pattern>
                <pattern>
                    {
                    "severity": "%level",
                    "service": "${app:-}",
                    "trace": "%X{X-B3-TraceId:-}",
                    "span": "%X{X-B3-SpanId:-}",
                    "parent": "%X{X-B3-ParentSpanId:-}",
                    "exportable": "%X{X-Span-Export:-}",
                    "pid": "${PID:-}",
                    "thread": "%thread",
                    "class": "%logger{40}",
                    "rest": "%message",
                    "schema":"ci2",
                    "group":"devops",
                    "site": "${site}"

                    }
                </pattern>
            </pattern>
        </providers>
    </encoder>  
    <rollingPolicy
        class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- rollover daily and when the file reaches 10 MegaBytes -->
        <fileNamePattern>${LOGS}/archived/spring-boot-logger-%d{yyyy-MM-dd}.%i.json
        </fileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy
            class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>10MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>

</appender>
-----------------------

In this appender def, the <pattern> is used to add values to the json def for sleuth.    

How can I define entries in this pattern and pass in the dynamic value to the logger.  It looks possible and sleuth may do it with  

                     "trace": "%X{X-B3-TraceId:-}",
                    "span": "%X{X-B3-SpanId:-}",
                    "parent": "%X{X-B3-ParentSpanId:-}",
                    "exportable": "%X{X-Span-Export:-}",

另一个可行的 API 是记录器将接受一个字符串并将用户提供的字符串附加到日志文件的末尾

总而言之:您不需要创建记录器,您需要检查附加程序。 不幸的是,Logback 已经支持带有 JSON 布局的 Console Appender 的 json 序列化。

logback.xml / logback-spring.xml配置控制台 appender:

<appender name="json" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
        <jsonFormatter
            class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
            <prettyPrint>true</prettyPrint>
        </jsonFormatter>
        <timestampFormat>yyyy-MM-dd' 'HH:mm:ss.SSS</timestampFormat>
    </layout>
</appender>

并在 POM 中添加几个依赖项。

在这里查看完整的教程

<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
                <destination>${logging.logstash.uri}</destination>
                <encoder class="net.logstash.logback.encoder.LogstashEncoder">
                    <customFields>
                        {"src": {
                        "component": "${logging.logstash.src.component}",
                        "platform": "${logging.logstash.src.platform}",
                        "app": "${logging.logstash.src.app}",
                        "log_type": "${logging.logstash.src.log_type}"
                        }}
            </customFields>
        </encoder>
</appender>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM