Java 阿克卡:可追踪日志

Java 阿克卡:可追踪日志,java,logging,akka,Java,Logging,Akka,我正在使用Akka和Java。我想知道,在Akka环境中,是否有跟踪日志记录场景的最佳实践/模式 下面是一个非常简单的场景: 源设备参与者向传播者参与者发送状态消息 传播者参与者将状态消息转发给其侦听器(其他设备参与者) 每个侦听器(设备)向传播者参与者发送一条确认消息 基本要求: 每个运行场景在日志中都应该是可区分的 场景启动器标识符(这里是设备id)应显示在所有日志中 对增加需求有什么建议吗?可能是启动消息的类名 我的方法是将可跟踪信息放入logger的MDC中:1)引入用于标记消息的接口,

我正在使用Akka和Java。我想知道,在Akka环境中,是否有跟踪日志记录场景的最佳实践/模式

下面是一个非常简单的场景:

  • 设备
    参与者向
    传播者
    参与者发送
    状态
    消息
  • 传播者
    参与者将
    状态
    消息转发给其侦听器(其他
    设备
    参与者)
  • 每个侦听器(
    设备
    )向
    传播者
    参与者发送一条
    确认
    消息
  • 基本要求:

  • 每个运行场景在日志中都应该是可区分的
  • 场景启动器标识符(这里是设备id)应显示在所有日志中 对增加需求有什么建议吗?可能是启动消息的类名

    我的方法是将可跟踪信息放入logger的MDC中:1)引入用于标记消息的接口,2)将抽象类作为所有参与者的基类:

    1-
    可跟踪
    ,由所有(相关)消息类实现:

    public interface Traceable {
    
        String traceId(); // An unique id (UUID) in each scenario (Req#1)
    
        int deviceId(); // Device which initiated the scenario (Req#2)
    
    }
    
    2-
    AbstractActorWithLogging
    作为所有参与者的基类,将可跟踪信息放入记录器的MDC中:

    public abstract class AbstractActorWithLogging extends AbstractActor {
    
        protected final DiagnosticLoggingAdapter logger = Logging.getLogger(this);
    
        @Override
        public void aroundReceive(PartialFunction<Object, BoxedUnit> receive, Object msg) {
            try {
                if (msg instanceof Traceable) logger.setMDC(extractMdc(((Traceable) msg)));
                if (logger.isDebugEnabled()) logger.debug("Received: {}.", msg);
                super.aroundReceive(receive, msg);
                if (logger.isDebugEnabled()) logger.debug("Processed: {}.", msg);
            } finally {
                logger.clearMDC();
            }
        }
    
        protected Map<String, Object> extractMdc(Traceable traceable) {
            Map<String, Object> mdc = new HashMap<>();
            mdc.put("traceId", traceable.traceId());
            mdc.put("deviceId", traceable.deviceId());
            return mdc;
        }
    }
    
    公共抽象类AbstractActorWithLogging扩展了AbstractActor{
    受保护的最终诊断日志适配器记录器=Logging.getLogger(此);
    @凌驾
    接收周围的公共无效(PartialFunction接收,对象消息){
    试一试{
    if(msg instanceof Traceable)logger.setMDC(extractMdc(((Traceable)msg));
    if(logger.isDebugEnabled())logger.debug(“接收:{}.”,msg);
    super.aroundReceive(receive,msg);
    if(logger.isDebugEnabled())logger.debug(“已处理:{}”,msg);
    }最后{
    logger.clearMDC();
    }
    }
    受保护地图提取MDC(可跟踪){
    Map mdc=newhashmap();
    put(“traceId”,traceable.traceId());
    put(“deviceId”,traceable.deviceId());
    返回mdc;
    }
    }
    
    你知道追踪吗?