如果redis失败,如何使用redis-logback-appender将日志行写入磁盘中的文件?

时间:2015-02-27 11:59:33

标签: java redis logback

我正在使用logback redis appender将logback日志存储到redis。 redis-logback-appender的pom依赖关系如下所示。

    <dependency>
        <groupId>com.cwbase</groupId>
        <artifactId>logback-redis-appender</artifactId>
        <version>1.1.0</version>
    </dependency>

logback.xml文件如下所示。作为回退机制,如果redis失败,我需要将日志文件存储在本地磁盘中。

<?xml version="1.0" encoding="UTF-8"?>
    <configuration>
    <timestamp key="byDay" datePattern="yyyyMMdd'T'HHmmss" />
    <appender name="LOGSTASH" class="com.cwbase.logback.RedisAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %-5line %logger{36} - %msg%n
            </pattern>
        </encoder>
        <host>localhost</host>
        <port>6379</port>
        <source>my-test-app</source>
        <type>test</type>
        <key>my-testlog-app</key>
    </appender>
    <root level="debug">
        <appender-ref ref="LOGSTASH" />
    </root>
</configuration>

有人可以告诉我如何配置logback.xml以便在redis失败时将日志行写入磁盘中的文件吗?

1 个答案:

答案 0 :(得分:3)

使用JSON编写日志文件,如:

<configuration>
    <timestamp key="byDay" datePattern="yyyyMMdd'T'HHmmss"/>
    <appender name="LOGSTASH" class="com.cwbase.logback.RedisAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %-5line %logger{36} - %msg%n
            </pattern>
        </encoder>
        <host>localhost</host>
        <port>6379</port>
        <source>my-test-app</source>
        <type>test</type>
        <key>my-testlog-app</key>
    </appender>

    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="LOGSTASH"/>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>testFile.log</file>
        <append>true</append>
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
                <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
                    <!-- prettyPrint is probably ok in dev, but usually not ideal in production: -->
                    <prettyPrint>true</prettyPrint>
                </jsonFormatter>
                <context>api</context>
                <timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSS'Z'</timestampFormat>
                <timestampFormatTimezoneId>UTC</timestampFormatTimezoneId>
                <appendLineSeparator>true</appendLineSeparator>
            </layout>
            <!-- <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> -->
        </encoder>
    </appender>
    <root level="debug">
        <appender-ref ref="FILE"/>
        <appender-ref ref="ASYNC"/>
    </root>
</configuration>

我还添加了异步appender,因为慢速/不可用的Redis会减慢/中断您的应用程序,因为所有Redis通信都是使用TCP同步的。使用logstash从日志文件中解析连续的JSON流或使用GELF可以解耦事物,因此您的应用程序不会受到损害。