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

Spring Boot自定义滚动日志文件

微生毅
2023-03-14

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

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

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

-------------------------------------------------------------------------------------------------------------------------------------------------

<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>

----------------------------------------------------------------------------------

我试图动态地添加值到json日志中。

类似于

1)最高级别的支持,将map中的值作为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);
    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);

例如,从上面的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是,记录器将接受一个字符串,并将用户提供的字符串追加到日志文件的末尾

共有1个答案

程俊力
2023-03-14

总而言之:您不需要创建记录器,您需要检查追加器。另外,Logback已经支持具有json布局的控制台Appender的json序列化。

logback.xml/logback-spring.xml中配置控制台追加器:

<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中添加两个依赖项。

 类似资料:
  • 本文向大家介绍magento 自定义日志文件,包括了magento 自定义日志文件的使用技巧和注意事项,需要的朋友参考一下 示例 这将登录到            

  • 请帮助我plz为Apache日志添加一个自定义部分,我希望在Apache access中获得以下代码片段的结果。日志,不仅在UI上: 现在我有以下的外出日志 (IP)-[24/Apr/2016:16:55:31 0000]“GET/tt.php?cmd=ls HTTP/1.1“200 331”-“Mozilla/5.0(Macintosh;英特尔Mac OS X 10_10_5)AppleWebK

  • 我正在测试使用PostSharp记录我的方法(log4net)的进入和退出。我遇到的问题是我希望日志消息是一个json对象,而不是您默认获得的内容,即: 输入:MyClass。MyMethod(参数) 我想要一些东西,比如{“动作”:“进入”,“类”:“我的类”,“方法”:“我的方法”等} 这是因为我使用loggly来解释日志,而使用json日志消息可以更好地进行过滤、搜索等。 这有可能吗?

  • 日志采集配置 在应用详情页中间有一个叫作“日志采集”的模块 点击右边的“添加”按钮,在弹出的对话框中选择日志的路径及正则规则 文件路径:你日志文件的位置 日志规则:如果没有特殊需求的话默认就好 提交后服务会自动重启动。 日志采集 如果配置了上面采集器,那么它会向服务所在的Pod注入一个Filebeat采集器对应用服务的业务日志进行采集。把采集到的日志入到kafka集群,然后logstash进行消息

  • 使用Log4j2.8,有没有一种方法可以让我的日志每天旋转,但使当前文件具有恒定的名称? 示例: 我尝试了以下配置,但没有成功: 此外,当我在某一天首次启动应用程序时,我会遇到以下例外情况:

  • 当我在conf文件的虚拟主机部分中没有指定日志文件时,日志会写入httpd中指定的文件中。conf(=访问日志)。日志条目如下所示: SOMEIP--[22/Jan/2013:18:34:08 0100]“GET/HTTP/1.1”200 1752-“Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.17(KHTML,比如Gecko)Chrome/S