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

标签 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 失败时将日志行写入磁盘中的文件?

最佳答案

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

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

关于java - 如果 redis 失败,如何在使用 redis-logback-appender 时将日志行写入磁盘中的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28764640/

相关文章:

java - 为什么 Android 计算器无法使用?

java - 如何在 Android 的后台服务中使用相机拍照?

php - Redis(键/值数据库)和关联数组之间的区别?

logback - 如何在 logback groovy 配置中添加 contextListener?

java - 在 Junit 中,如何防止打印故意抛出并已在日志中捕获的预期异常?

java - Logback:如何获取日志文件路径?

java - 如何从字符串创建 BufferedReader?

java - 如何在hadoop中设置默认的Java选择而不在运行时重叠

redis - 了解redis中键的内存消耗

java - Storm redis spout元组无一异常(exception)地丢失