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

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

暨鹭洋
2023-03-14

我正在使用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个答案

卢光远
2023-03-14

使用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可以将事情解耦,因此应用程序不会受到损害。

 类似资料:
  • 我决定使用slf4j而不是Java自己的日志记录。我已经成功地使用SLF4J登录到控制台。但我不知道如何将其写入日志文件。日志文件将帮助我们收集运行时可能出现的错误。 我通过这样做来实现slf4j, 私有静态最终org.slf4j.LOGGER LOGGER=org.slf4j.loggerfactory.getlogger(class1.class); PropertyConfigurator.

  • 问题内容: 我遇到一种情况,我想将我创建的所有日志写入文本文件。 我们正在使用java.util.logging.Logger API生成日志。 我试过了: 但是仍然只能在控制台上获取我的日志。 问题答案: 试试这个样本。这个对我有用。 在MyLogFile.log产生输出 编辑: 要删除控制台处理程序,请使用 因为ConsoleHandler已向父记录器注册,所有记录器都源自该记录器。

  • 问题内容: 我正在尝试使用Go写入日志文件。 我尝试了几种方法,但都失败了。这是我尝试过的: 日志文件被创建,但是没有任何打印或附加到该文件。为什么? 问题答案: 过去的工作方式一定不同,但这对我有用: 基于Go文档,不能用于,因为它会打开文件“供阅读:” 打开命名文件以供读取。如果成功,则可以使用返回文件上的方法进行读取;关联的文件描述符具有mode 。如果有错误,它将是类型。 编辑 检查后移至

  • 我正在docker容器中运行Apache2,不想向磁盘写入任何内容,只想向stdout和stderr写入日志。我见过几种不同的方法(Supervisord和stdout/stderr,Apache访问stdout日志),但这些方法看起来像是黑客。难道就没有办法默认这样做吗? 需要说明的是,我不想对日志进行跟踪,因为这将导致将内容写入容器中的磁盘。 签入Docker Hub(https://Hub.

  • 问题内容: 我目前正在实施ping / pong缓冲方案,以安全地将文件写入磁盘。我在Linux / CentOS计算机上使用C ++ / Boost。现在,我面临的问题是强制将文件实际写入磁盘。不管文件系统的所有缓存策略(ext3 / ext4)/ SO自定义规则/ RAID控制器/硬盘控制器如何,都可以这样做吗? 最好使用普通的fread()/ fwrite(),c ++ ostream或bo