マイクロサービスビジネスログ収集スキーム


背景
ログの内容は複雑で多様で、価値のあるログをどのように収集するかが注目されています.ログの価値は、ビジネス・オペレーションによって異なり、ビジネス・シーンによって同じタイプのログの価値が異なります.従来のビジネス実践に基づいて、エンタープライズクラスのビジネスニーズと組み合わせて、以下のログに注目します.
•トレースログ【trace.log】Serverエンジンのデバッグログは、システムメンテナンス担当者がシステム運転の問題を特定するために使用します.•システムログ【system.log】大粒度のエンジン運転の入口、出口のログは、スタック分析を呼び出すために使用され、性能分析の使用が可能です.•デプロイメントログ【deploy.log】システムの起動、停止、コンポーネントパッケージの配置、クラスタ通知などの情報を記録するログ.•エンジンログ【engine.log】細粒度のエンジン運転ログは、ビジネス上の問題を特定するためにコンテキストデータを印刷することができる.•コンポーネントパッケージログ【contribution.log】コンポーネントパッケージに記録されたビジネスログ(ベースコンポーネントライブラリのログ出力API書き込みログを使用)
ここでは、システム・ログの収集について、いくつかの収集スキームについて説明します.
シナリオ1:ログコンポーネントによる収集
ここでは、logback、log 4 jなどのログコンポーネントを介してファイルを出力し、ファイルを介してlogstash、kibanaなどのログコンポーネントに出力し、これらのログコンポーネントを介して可視化統計と分析を行い、ここでは重要なログ出力フォーマットを統一して後日統計検索を容易にする必要がある.
メリット
  • 操作が簡単で、収集が便利で
  • ビジネス依存度を削減
  • 粒度細
  • 欠点
  • はlogstash、kibana
  • に依存する.
  • は簡単なログ操作のみを満たすことができ、詳細点または個性的な需要操作は比較的複雑である
  • .
    シナリオ2:aopを使用してcontrollerをブロックする
    Controllerレイヤをブロックし、Controllerのメソッド名にinsert、update、deleteなどのキーワードが含まれているかどうかでビジネスログを記録します.
    メリット
  • 操作が簡単で、収集が便利で
  • 欠点
  • 単純ログのみ記録
  • 人によってネーミングの習慣が異なり、ログが正確ではない可能性があります.
    シナリオ3:注釈を使用して、少し正確なビジネスログ記録を行う
    このスキームは粒度が大きくても小さくてもよく,コード侵入性も小さく,操作性が強く,パラメータ情報や戻り値情報を取得する必要がある場合は,fastjsonのjpathを集めてパラメータ値の下にいくつかの擬似コードを取得して参照できる注釈構成で取得できる.
    @Slf4j
    @Aspect
    public class SysLogAspect {
    
    	@Around("@annotation(sysLog)")
    	@SneakyThrows
    	public Object around(ProceedingJoinPoint point, SysLog sysLog) {
    		//              
    		Operation logVo = SysLogUtils.getOperationModel();
    		Object obj=null;
    		try{
    			//     
    			logVo.setOperationName(sysLog.value());
    			//     
    			logVo.setOperationTime(new Date());
    			logVo.setObjectType(sysLog.objectType().name());
    			logVo.setAppName(StringUtils.defaultString(sysLog.appName(),"TSP"));
    			//         
    			obj = point.proceed();
    			if(StringUtils.isNotBlank(sysLog.objectIdKey())&&StringUtils.isNotBlank(sysLog.objectNameKey())){
    				Map<String,Object> params=Maps.newHashMap();
    				params.put("args",point.getArgs());
    				params.put("response",obj);
    				logVo.setObjectId(getKeyValue(sysLog.objectIdKey(),params));
    				logVo.setObjectName(getKeyValue(sysLog.objectNameKey(),params));
    			}
    		}catch (BusinessException e){
    			logVo.setException(e.getMessage());
    			throw new Exception(e);
    		}catch (RuntimeException e){
    			logVo.setException(e.getMessage());
    			throw new Exception(e);
    		}catch (Exception e){
    			logVo.setException(e.getMessage());
    			throw new Exception(e);
    		}finally {
    			ApplicationContextUtils.publishEvent(new OperationEvent(logVo));
    		}
    		return obj;
    	}
    
    	private String getKeyValue(String key,Map<String,Object> params){
    		try{
    			Object mm= JSONPath.eval(params,key);
    			if(mm!=null){
    				return mm.toString();
    			}
    		}catch (Exception e){
    			log.error("JSONPath.eval:",e);
    		}
    		return null;
    	}
    
    
    }
    

    ``
    @SysLog(value = "xxxxxx",objectType = LogObjectType.OFFLINE_THRONG,
            objectIdKey = "$['args'][0][0]['id']",objectNameKey = "$['response'][0][0]['throngName']")
    

    メリット
  • 操作簡単
  • は比較的柔軟で、粒度は大きくても小さくても
  • である.
    欠点
  • コード侵入
  • 個人化ニーズが
  • を満たさない
    シナリオ4:複雑なシーンや監査ニーズに対して手動で記録し、侵入性が強い
    一部のビジネスでは、方法が共通している場合、より小さな粒度が必要な場合や、ビジネスデータの変更記録が必要な場合は、侵入型の強い方法でログを記録するしかなく、ビジネスコードにログを直接記録することができます.
    logClient.logObject(LogObjectType.XXX,id,UserContext.getUserName(),"  xxx","xxx   xxxxx");
    

    シナリオ5:sqlログの記録
    mybatisブロッキングはmybatisで行い、mybatisが使用されていない場合は、汎用的なpreparestatementおよびstatementエージェントとして使用できます.
    もちろん、jeager、javamelody、druidなど、監視コンポーネントがこのニーズを満たすことができます.
    まとめ
    一般的に、ビジネス・ログを記録する方法はいくつかあります.これは、具体的なニーズに基づいて、どの方法で製品のニーズをよりよく達成できるかを評価します.