Menyesuaikan Appender adalah sangat mudah, hanya mewarisi kelas AppenderBase.
Anda boleh melihat bahawa terdapat AppenderBase, UnsynchronizedAppenderBase dan AsyncAppenderBase yang mewarisi UnsynchronizedAppenderBase. Perbezaannya boleh dilihat dari nama, tak segerak, biasa, dan tidak berkunci.
Kami mentakrifkan MongoDBAppender yang mewarisi UnsynchronizedAppenderBase
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"); } } }
Mesti melaksanakan kaedah tambahkan ini ialah log keluaran log disimpan dalam objek eventObject dapatkan Hanya ambil nilai dalam objek dan lakukan pemprosesan anda sendiri.
Kita boleh bayangkan bahawa ConsoleAppender sistem sentiasa System.out.print (eventObject.getXXX), dan FileAppender menggunakan OutpuptStream untuk mengeluarkan ke fail.
Apa yang perlu kita lakukan ialah menyimpan log ke mongo Springboot telah menyediakan templat MongoTemplate Perlu diingat bahawa output log bermula apabila sistem bermula, dan MongoTemplate belum dimulakan. pada mulanya, anda perlu menunggu Spring untuk menetapkan nilai kepada MongoTemplate. Jadi ia adalah batal pada permulaan, dan anda perlu menunggu sehingga musim bunga dimulakan sebelum MongoTemplate mempunyai nilai.
Memandangkan Appender ini tidak diuruskan oleh musim bunga, saya menggunakan kaedah mendapatkan kacang secara berasingan. ApplicationContextProvider adalah seperti berikut:
@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); } }
Log operasi mongo di atas agak mudah untuk disimpan, dan medan tidak digunakan Anda boleh mereka bentuk struktur mongo mengikut atribut yang anda ingin simpan, dan kemudian simpan di perpustakaan.
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>
Ia juga sangat mudah digunakan dalam 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>
Anda hanya perlu menentukan kelas appender .
Atas ialah kandungan terperinci Bagaimana untuk menyimpan log balik ke mongoDB dalam SpringBoot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!