ホームページ  >  記事  >  Java  >  SpringBoot でログバック ログを mongoDB に保存する方法

SpringBoot でログバック ログを mongoDB に保存する方法

PHPz
PHPz転載
2023-05-18 19:01:04929ブラウズ

Appender のカスタマイズは非常に簡単で、AppenderBase クラスを継承するだけです。

AppenderBase、UnsynchronizedAppenderBase、および UnsynchronizedAppenderBase を継承する AsyncAppenderBase があることがわかります。違いは、非同期、通常、ロック解除という名前からわかります。

UnsynchronizedAppenderBase を継承する MongoDBAppender を定義します

public class MongoDBAppender extends 
    UnsynchronizedAppenderBase<ILoggingEvent> { 
 
  @Override 
  protected void append(ILoggingEvent eventObject) { 
    MongoTemplate mongoTemplate = ApplicationContextProvider.getBean(MongoTemplate.class); 
    if (mongoTemplate != null) { 
      final BasicDBObject doc = new BasicDBObject(); 
      doc.append("level", eventObject.getLevel().toString()); 
      doc.append("logger", eventObject.getLoggerName()); 
      doc.append("thread", eventObject.getThreadName()); 
      doc.append("message", eventObject.getFormattedMessage()); 
      mongoTemplate.insert(doc, "log"); 
    } 
  } 
 
}

append メソッドを実装する必要があります。このメソッドは、logback がログを出力する場所です。ログは、eventObject オブジェクトに保存されます。必要なのは、取得するには オブジェクトの値を取得して独自の処理を行うだけです。

システムの ConsoleAppender は常に System.out.print (eventObject.getXXX) であり、FileAppender は OutpuptStream を使用してファイルに出力すると想像できます。

私たちがしなければならないのは、ログを mongo に保存することです。Springboot は MongoTemplate テンプレートを提供しています。ログの出力はシステムの起動時に開始され、MongoTemplate は初期化されていないことに注意してください。 Spring が MongoTemplate に値を割り当てるまで待つ必要があります。したがって、最初は null であり、MongoTemplate に値が設定される前に Spring が初期化されるまで待つ必要があります。

この Appender は Spring で管理されていないため、別途 Bean を取得する方法を使用します。 ApplicationContextProvider は次のとおりです:

@Component 
public class ApplicationContextProvider implements ApplicationContextAware { 
  private static ApplicationContext context; 
 
  public static ApplicationContext getApplicationContext() { 
    return context; 
  } 
 
  @Override 
  public void setApplicationContext(ApplicationContext ac) 
      throws BeansException { 
    context = ac; 
  } 
 
  public static <T> T getBean(Class<T> tClass) { 
    return context.getBean(tClass); 
  } 
 
  public static <T> T getBean(String name, Class<T> tClass) { 
    return context.getBean(name, tClass); 
  } 
}

上記の mongo 操作ログ ストレージは比較的単純であり、フィールドが使い果たされることはありません。保存したい属性に応じて mongo 構造を設計できます。それをデータベースに保存します。

pom.xml

<dependency>
      <groupId>org.mongodb</groupId>
      <artifactId>mongo-java-driver</artifactId>
      <version>3.4.2</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
      <version>1.1.11</version>
    </dependency>
    <dependency> 
      <groupId>ch.qos.logback</groupId> 
      <artifactId>logback-classic</artifactId> 
      <version>1.1.11</version> 
    </dependency>

Spring-logback.xml での使用も非常に簡単です

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
  <include resource="org/springframework/boot/logging/logback/base.xml" /> 
 
  <appender name="MY_FILE" class="com.example.demo.mongo.MongoDBAppender"> 
  </appender> 
  <!-- 测试环境+开发环境. 多个使用逗号隔开. --> 
  <springProfile name="test,dev"> 
    <logger name="org.springframework.web" level="INFO"> 
      <appender-ref ref="MY_FILE"/> 
    </logger> 
    <logger name="com.example" level="INFO" /> 
  </springProfile> 
 
 
</configuration>

必要なのはアペンダー クラスを指定することだけです。

以上がSpringBoot でログバック ログを mongoDB に保存する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。