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 サイトの他の関連記事を参照してください。