MiraiForum

    • 注册
    • 登录
    • 搜索
    • 热门
    • 最新
    • 未解决
    • 标签
    • 群组
    • 友情链接

    如何在java中使自定义Mirai的日志系统?

    开发交流
    3
    14
    889
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 2
      2446694 最后由 编辑

      回复: 如何完全使用其他日志系统

      1. 我创建了com.config.MiraiLoggerFactory实现了net.mamoe.mirai.utils.MiraiLogger.Factory
      public class MiraiLoggerFactory implements MiraiLogger.Factory {
          @NotNull
          @Override
          public MiraiLogger create(@NotNull Class<?> aClass, @Nullable String s) {
              return (MiraiLogger) LoggerFactory.getLogger(aClass);
          }
      }
      
      1. 我在META-INF/services创建了文件net.mamoe.mirai.utils.MiraiLogger.Factory
      com.config.MiraiLoggerFactory
      

      但不知到为什么,Mirai-Core还是没有使用我的日志配置

      1 条回复 最后回复 回复 引用 0
      • Nambers
        Nambers 摸鱼 最后由 编辑

        https://github.com/Nambers/MiraiCP/blob/main/kotlin/loader/src/nativeMain/kotlin/console/Appender.kt#LL88C1-L105C2
        你可以需要用 Services.register 注册

        1 条回复 最后回复 回复 引用 0
        • cssxsh
          cssxsh 最后由 编辑

          https://github.com/mamoe/mirai/tree/dev/logging#readme

          2 1 条回复 最后回复 回复 引用 1
          • 2
            2446694 @cssxsh 最后由 编辑

            @cssxsh @Nambers
            翻看源码发现:BotConfiguration提供了方法setNetworkLoggerSupplier和setBotLoggerSupplier。

            然后我实现了MiraiLogger接口,然后定义了LoggerFactory内部类

            import net.mamoe.mirai.utils.MiraiLogger;
            import org.jetbrains.annotations.NotNull;
            import org.jetbrains.annotations.Nullable;
            import org.slf4j.Logger;
            
            public class SpringMiraiLogger implements MiraiLogger {
                private final Logger logger;
                private final String identity;
                private boolean enabled = true;
            
                public SpringMiraiLogger(Class<?> clazz, String identity) {
                    logger = org.slf4j.LoggerFactory.getLogger(clazz);
                    this.identity = clazz.getSimpleName();
                }
            
                public SpringMiraiLogger(Class<?> clazz, String identity, boolean enabled) {
                    logger = org.slf4j.LoggerFactory.getLogger(clazz);
                    this.identity = clazz.getSimpleName();
                    this.enabled = enabled;
                }
            
                public static class LoggerFactory implements MiraiLogger.Factory {
                    public static final MiraiLogger.Factory INSTANCE = new LoggerFactory();
            
                    @NotNull
                    @Override
                    public MiraiLogger create(@NotNull Class<?> clazz) {
                        return new SpringMiraiLogger(clazz, clazz.getSimpleName());
                    }
            
                    @NotNull
                    @Override
                    public MiraiLogger create(@NotNull Class<?> clazz, @Nullable String identity) {
                        return new SpringMiraiLogger(clazz, identity);
                    }
                }
            
                @Nullable
                @Override
                public String getIdentity() {
                    return identity;
                }
            
                public boolean setEnabled(boolean enabled) {
                    return this.enabled = enabled;
                }
            
                @Override
                public boolean isEnabled() {
                    return enabled;
                }
            
                @Override
                public void debug(@Nullable String s) {
                    logger.debug(s);
                }
            
                @Override
                public void debug(@Nullable String s, @Nullable Throwable throwable) {
                    logger.debug(s, throwable);
                }
            
                @Override
                public void error(@Nullable String s) {
                    logger.error(s);
                }
            
                @Override
                public void error(@Nullable String s, @Nullable Throwable throwable) {
                    logger.error(s, throwable);
                }
            
                @Override
                public void info(@Nullable String s) {
                    logger.info(s);
                }
            
                @Override
                public void info(@Nullable String s, @Nullable Throwable throwable) {
                    logger.info(s, throwable);
                }
            
                @Override
                public void verbose(@Nullable String s) {
                    logger.trace(s);
                }
            
                @Override
                public void verbose(@Nullable String s, @Nullable Throwable throwable) {
                    logger.trace(s, throwable);
                }
            
                @Override
                public void warning(@Nullable String s) {
                    logger.warn(s);
                }
            
                @Override
                public void warning(@Nullable String s, @Nullable Throwable throwable) {
                    logger.warn(s, throwable);
                }
            }
            

            我在BotConfiguration中调用了setNetworkLoggerSupplier和setBotLoggerSupplier。

                    this.setBotLoggerSupplier(bot -> SpringMiraiLogger.LoggerFactory.INSTANCE.create(bot.getClass()));
                    this.setNetworkLoggerSupplier(bot -> SpringMiraiLogger.LoggerFactory.INSTANCE.create(bot.getClass()));
            

            成功实现日志转接!

            1 条回复 最后回复 回复 引用 0
            • cssxsh
              cssxsh 最后由 编辑

              你没必要自己手动写我给的链接都说明了
              你引用这个包就好
              net.mamoe:mirai-logging-slf4j

              2 3 条回复 最后回复 回复 引用 0
              • 2
                2446694 @cssxsh 最后由 编辑

                @cssxsh 引入那个包会报错,不知道为什么

                2 1 条回复 最后回复 回复 引用 0
                • 2
                  2446694 @2446694 最后由 编辑

                  @2446694 mirai-logging-log4j2

                  cssxsh 1 条回复 最后回复 回复 引用 0
                  • 2
                    2446694 @cssxsh 最后由 2446694 编辑

                    @cssxsh
                    03f39cf9-a6ae-4e34-b56d-740c11a71253-image.png

                    2 1 条回复 最后回复 回复 引用 0
                    • 2
                      2446694 @2446694 最后由 编辑

                      @2446694 不过这个报错好像没啥影响 Failed to load class "org.slf4j.impl.StaticLoggerBinder".

                      1 条回复 最后回复 回复 引用 0
                      • 2
                        2446694 @cssxsh 最后由 编辑

                        @cssxsh 在 如何在java中使自定义Mirai的日志系统? 中说:
                        这两个依赖同时加上就没问题了

                        <dependency>
                                    <groupId>org.springframework.boot</groupId>
                                    <artifactId>spring-boot-starter-log4j2</artifactId>
                                    <scope>runtime</scope>
                                </dependency>
                                <dependency>
                                    <groupId>net.mamoe</groupId>
                                    <artifactId>mirai-logging-log4j2</artifactId>
                                    <version>${mirai.version}</version>
                                    <scope>runtime</scope>
                                </dependency>
                        
                        1 条回复 最后回复 回复 引用 0
                        • cssxsh
                          cssxsh @2446694 最后由 编辑

                          @2446694

                          ?

                          我不是说了 net.mamoe:mirai-logging-slf4j 吗

                          2 1 条回复 最后回复 回复 引用 0
                          • 2
                            2446694 @cssxsh 最后由 编辑

                            @cssxsh

                            <dependency>
                                        <groupId>org.springframework.boot</groupId>
                                        <artifactId>spring-boot-starter-log4j2</artifactId>
                                        <scope>runtime</scope>
                                    </dependency>
                                    <dependency>
                                        <groupId>net.mamoe</groupId>
                                        <artifactId>mirai-logging-slf4j</artifactId>
                                        <version>${mirai.version}</version>
                                        <scope>runtime</scope>
                                    </dependency>
                            
                            Exception in thread "main" java.lang.ExceptionInInitializerError
                            	at com.MiraiApplication.main(MiraiApplication.java:11)
                            Caused by: org.apache.logging.log4j.LoggingException: log4j-slf4j-impl cannot be present with log4j-to-slf4j
                            	at org.apache.logging.slf4j.Log4jLoggerFactory.validateContext(Log4jLoggerFactory.java:60)
                            	at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:44)
                            	at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:33)
                            	at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:53)
                            	at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:33)
                            	at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:363)
                            	at org.apache.commons.logging.LogAdapter$Slf4jAdapter.createLocationAwareLog(LogAdapter.java:130)
                            	at org.apache.commons.logging.LogAdapter.createLog(LogAdapter.java:91)
                            	at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:67)
                            	at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:59)
                            	at org.springframework.boot.SpringApplication.<clinit>(SpringApplication.java:178)
                            	... 1 more
                            
                            cssxsh 1 条回复 最后回复 回复 引用 0
                            • cssxsh
                              cssxsh @2446694 最后由 编辑

                              @2446694 在 如何在java中使自定义Mirai的日志系统? 中说:

                              <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> <scope>runtime</scope> </dependency>

                              spring-boot-starter-log4j2 和 mirai-logging-slf4j
                              冲突

                              我的意思是 spring-boot 的默认 日志系统是 slf4j
                              所以你 直接使用 mirai-logging-slf4j 就好

                              2 1 条回复 最后回复 回复 引用 0
                              • 2
                                2446694 @cssxsh 最后由 编辑

                                @cssxsh 哦,我还以为加上mirai-logging-slf4j以后,就可以引入任意的日志系统(/捂脸)

                                1 条回复 最后回复 回复 引用 0
                                • 1 / 1
                                • First post
                                  Last post
                                Powered by Mamoe Technologies & NodeBB | 友情链接 | 服务监控 | Contact