背景
ログの複雑で多様な内容、貴重な収集する方法ログインすることは我々の焦点です。実際にログインし、事業運営の値に依存して、異なるビジネスシナリオログの下で同じ型の値は、完全に異なるだろう。
エンタープライズレベルのビジネス要件の数と組み合わせて、過去のビジネス慣行に基づいて、我々は、ログを選択し、以下のカテゴリに焦点を当てます。
•トレースログ[システムの位置決めシステム保守要員のための問題を実行する]のtrace.logデバッグログServerエンジン。
•システムログ] [system.logに大きなインポートを実行しているエンジンのサイズ、コールスタックの分析のための丸太の輸出、パフォーマンス分析を使用することができます。
•展開のログ記録システム] [deploy.log開始、停止、ログ情報コンポーネントパッケージの展開、クラスタ通知。
•エンジンのログは] [engine.logきめ細かいエンジンで実行ログは、ビジネス上の問題を見つけるためのコンテキストデータを印刷することができます。
•パケットログ[メンバー]メンバーcontribution.logパッケージ記録されたトラフィックのログ(ログを書き込むことが基本となるコンポーネントライブラリのログ出力APIを使用して)
ここでは、システムログ収集プログラムのためのいくつかの特別なコレクションを議論します
プログラム:ログコンポーネントをして集めました
logback、log4jのや他のロギング・コンポーネントによって、出力ファイルを参照し、logstashにファイルを介して出力、などロギング・コンポーネントによって統計と分析を可視化するコンポーネントのログとしてkibanaここでは、将来の統計的検索のためのキーログの出力形式を統一する必要があります。
利点
- シンプルで、簡単に収集するために、
- 依存事業を削減
- ファイン粒度
短所
- それはlogstash、kibanaに依存します
- 単純に、より複雑な動作させるために、操作をログ手の込んだか、個々のニーズだけを満たすことができます
オプション2:インターセプトコントローラに使用AOP
メソッド名により、コントローラ層の傍受は、レコードへのコントローラの挿入、更新、削除、および他の主要なビジネスジャーナルに含まれています。
利点
- シンプルで、簡単に収集するために、
短所
- 単純なログレコード
- 別の人が同じ命名規則はありませんが、ログが正確ではないかもしれません
オプション3:少し正確なサービスのロギングでの使用注釈
取得パラメータA番組の粒子サイズ変化、コード侵襲性が比較的小さい、操作性の強い、戻り値又は情報の所望のパラメータ情報は、注釈の設定を取得することができれば、それはjpath fastjsonで組み立てることができる以下の値参考のためにいくつかの擬似コード
@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のを使用しない場合、あなたは一般のprepareStatementとプロキシ文を行うことができますしMyBatisのインターセプタを使用することができます。
もちろん、今の例のjeager、javamelody、ドルイド、などを監視する必要性を満足させる要素があり、
概要
通常の状況下で、我々は、レコードトラフィックログにさまざまな方法を使用しますが、これは、特定のニーズに応じ満たす製品の需要をより良くすることが可能ないくつかの方法で評価することです。