Javaアプリケーションログ

frankiegao123 里芋の道ソース

 

非常に、非常に重要であり、優れたログ情報を迅速にすると、プログラムのバグを見つけるために私たちを助けることができる、と理由を見つけるために、アプリケーションにログインします。

 

しかし、多くの場所が導入されたログはAOPを紹介採用している、実際には、使用するログをカットし、それは非常に非科学的です!ログのために、それは方法の始まりに過ぎない、異常出力何かの終わりには、それが絶対的に足りないので、ログ分析のためのログはどんな意味がありません。全体のログ方法、及びその方法、それの開始と終了の場合?この方法は、ログインしていない場合、それは完全にその意味ログを失いました!アプリケーションは、あなたがどのような原因によって引き起こされる問題を見つけたい場合は、効果はありません。このログは、同様にないかもしれません!

 

この記事のアプリケーションがログに重点できる可能にするように、開発者は、アプリケーションログ出力の意味ができる、願っています。

 

ログの基本フォーマット

 

主にログ出力ファイルに次を含める必要があります。

 

  • 時間

  • ログレベルの主な用途

  • コールチェーン識別(オプション)

  • スレッド名

  • ロガー名

  • ログの内容

  • 例外のスタック(必ずしも)

 

11 : 44 : 44.827 WARN [93ef3E0120160803114444- 1.2 ] [main] [ClassPathXmlApplicationContext] Exception encountered during context initialization - cancelling refresh attempt

 

ログ時刻

 

生成されたログの日付と時刻のように、このデータは、ミリ秒に一般的には非常に重要です。一般による日間ローリングログファイルとして、日付がHHを使用して、この時間を置く必要はありません:MM:SS.SSS形式とすることができます。

 

ログレベル

 

ログレベルDEBUGの主な用途は、INFOは、ERRORをWARN。

 

デバッグ

コンテンツ出力DEUBGレベルデバッグ性質、主として開発のためのログのレベル、位相出力をテストします。ロギングのこのレベルは、として詳細であると開発、テストフェーズの問題や異常を容易にする必要があり、分析されます。

 

INFO

出力INFOレベルの内容は、主に出力本番環境を記録するために、ログのレベルの性質を促しました。レベル以上のログは、ループに表示されない起動またはサイクルの出力サイクルだけでなく、他の重要なデータの終了時刻することができます。

 

  • アプリケーションのスタートアップコンフィギュレーションパラメータの値がロードされ(例:接続パラメータ、パラメータスレッドプール、タイムアウトなど、ならびにいくつかの関連する環境設定、または全体の構成パラメータ)

  • オブジェクトの依存性注入のいくつかの重要なクラス名

  • 基準値にいくつかの方法が非常に大きいので、プロセス(サービスメソッド)入力パラメータ値は、値を返す場合、その入り口出力一度非サービング方法を出力する必要がない、サービスの内部または呼び出し

  • 方法等の重要な部分、:データベースから取得し、より重要なデータ、及び入力パラメータ値とインターフェイスの戻り値を呼び出すサードパーティインターフェース

 

INFOレベルのログは、INFO、より高いレベルのログを、原則的に本番環境では、システムの動作条件を理解することができ、かつ問題や異常、問題はすぐに見つけることができたときに、呼び出し時にコンテキストデータを復元し、重くすることができ今の問題。

 

これは、プロジェクトがログレベルINFOにテスト環境で、完成した後、状況は問題が発生した場合、これらのログは、問題のトラブルシューティングに有用な情報を提供することができるかどうか、INFOレベルのアプリケーションによる情報の使用を理解することができるかどうかを確認されることをお勧めします。

 

WARN

メインレベルの警報出力が予測され、計画があるコンテンツの性質を警告、例えば、本方法は、空であるか、パラメータの値は、プロセス動作パラメータの条件を満たしていません。出力のWARNレベルでは、イベント後のログの分析に、より詳細な情報でなければなりませんに直接書き込みません。

 

バート・ログ

log.warn( "name is null" );

 

警告の理由が、他のパラメータの出力に加えて、我々は、参照ログ解析のためのより多くの情報を持っているために、コンテンツを出力する必要があります。

 

推奨されるログ

log.warn( "[{}] name is null, ignore the method, arg0: {}, arg1: {}" , methodName , arg0 , arg1 );

 

エラー

全体的なプロセスシステムにはほとんど影響、ログレベルがWARNに使用することができる場合はcatchブロックで捕捉エラー、異常、例えば、ネットワークトラフィック、このような異常のようなデータベース接続異常:主に予測不可能な情報のいくつか、などに向けエラーレベル出力。エラーで生成されたデータ中のパラメータ出力方法にできるだけエラーログレベルの出力、オブジェクトの実行方法等は、例外オブジェクトのデータは、オブジェクトは、で一緒に出力する必要があるとき場合:

 

推奨されるログ

log.error( "Invoking com.service.UserService cause error, username: {}" , username , e );

 

書いてはいけません(以下、このコンテンツは、パラメータ、例外スタックなしe.toString()一貫性のある出力を使用することの効果として、電子を記録します):

 

バート・ログ

log.error( "Invoking com.service.UserService cause error, username: {}, e: {}" , username , e );

 

実行スタック自体に以下のログに出力このログは、出力のE e.getMessageの内容、ログラインに再びそれをエクスポートする必要はありません、問題を追跡するために、このようなログが無意味であるだろうしないでください!

 

バート・ログ

log.error( e.getMessage() , e );

 

コールチェーンのロゴ

 

分散アプリケーションでは、ユーザーはこれらのサービスは、まだ異なるサーバー上の異なるアプリケーション内のノードをこのようにログファイルにアプリケーションのログを記録しません要求を完了し、呼び出しを入れ子になったが、分散させることができる、サービスコールの数が完了した要求することができますログファイル。この識別は、システム全体の要求のコールログに直列に接続されています。

 

チェーンの識別フォーマットを呼び出します。

 

  • 一意の文字列(トレースID)

  • コール階層(スパンID)

 

出力データがないときにのみ、オプションとしてチェーンのロゴを呼び出す[]ことができます。

 

スレッド名

 

このログ出力スレッド、典型的には1つのアプリケーションで同期要求を同じスレッドによって完了し、スレッド名の出力は、各要求に分類することができるが、ログ生成、ログは現在の要求コンテキストを区別することが容易になります。

 

ロガー名

 

ロガー名、一般的に使用されるクラス名、ログファイルには、実際の状況は、パッケージ名を使用する必要があるかどうかを確認するために、単純なクラス名で出力することができます。ログソーは、主にログ出力が問題を見つけるためにするクラスを見つけるために使用されます。

 

ログの内容

 

注意事項

 

無効にするSystem.out.println

生産は、出力ログの方法で使用されるコードは、出力の損失をもたらすことができれば、出力をファイルにリダイレクトするために、一般的に標準出力とエラーではありませんので、SRC /メインコードは、使用するSystem.out.printlnの出力を禁止しました。

 

選択的スプライシングされた様々なパラメータのログ

使用SLF4Jロガーのような出力関数をログ参照変数、ログにスプライスされるべきではない文字列を使用して処理しました。

 

推奨されるログ

log.debug( "Load No.{} object, {}" , i , object );

 

書いてはいけませんlog.debug ( "Load No." + i + " object, " + object );ときに、ログレベルINFOまたはレベルを超えて上昇、これは怖いもの知らずの文字列連結を増加させるためです。

 

toString()を実装

必要な出力ターゲットログを出力するようにのみオブジェクトのクラス名とhashCode時にログ出力、toStringメソッドは、そのクラスに高速である必要があります。toStringメソッドクラスは、すべてのフィールドを処理する必要があります。toStringメソッドのToString関数は、IDEの自動機能によって生成されてもよいです。toStringメソッドは、反射またはいくつかのツールによって生成されたのtoString推奨されていない、直接どちらの反射を用いて処理し、出力のみがよりインパクトアプリケーションのパフォーマンスを記録している、ツールに配列JSON JSON文字列を使用しません。

 

予防NULLポインタ

オブジェクトは確かにあるため、アプリケーションログに起因する問題のnullではないか、と思われるが、nullポインタ例外を生成したことを確実にすることである場合を除き、ログ取得値にオブジェクトのメソッドを呼び出さないでください。

 

バート・ログ

log.debug( "Load student(id={}), name: {}" , id , student.getName() );

 

(学生がnullのときにnullポインタ例外が発生しないように、)それは変更することができます。

 

推奨されるログ

log.debug( "Load student(id={}), student: {}" , id , student );

 

一部必ずしもスプライシングされた文字列を解析する、またはログ出力などのログの内容を生成するために、メモリの浪費に時間がかかる必要が、スプライシングプロセス前log.isXxxxxEnable()を使用し、等。

 

推奨されるコード

if ( log.isDebugEnable() ) {
    StringBuilder builder = new StringBuilder();
    for ( Student student : students ) {
        builder.append( "student: " ).append( student );
    }
    builder.append( "value: " ).append( JSON.toJSONString(object) );
    log.debug( "debug log example, detail: {}" , builder );
}

 

情報セキュリティ

 

コンテンツに関連したパスワードや個人情報をログに記録しないように覚えておいてください!ポジショニングの問題を容易にするために、次の機密情報がログ出力(以上、プレーンテキストのデータだけ少なくありません)の要件を対象とする場合に最も緩和されています。

 

タイプ
請求

説明
パスワード
出力なし
******
ログインパスワード、および支払パスワードパスワードの他のタイプ
クレジットカードのCVV2
出力なし
***
 
クレジットカードの有効性
出力なし
****
 
検証コード
出力なし
******
キャプチャコード、SMSの検証コード、PINメーラーなど
キー、塩
出力なし
******
鍵暗号化アルゴリズム、公開鍵と秘密鍵の塩のメッセージダイジェスト、およびデジタル署名及び署名検証アルゴリズムを使用する、等

セッションID

デバイスフィンガープリント(ID)

指紋認証トークン

暗号文データ

フロント55
7SuA8 *** TtslB

次のタイプがあります。

など1.アプリケーション・セッション識別子、:ウェブ、APP、H5及びセッション識別子を識別するための他の状態情報

デバイスまたはデバイスID 2 APP指紋識別装置

指紋認証用トークン3. APP

4.暗号文データは、データの暗号化を参照します

仮面の文字出力3どのように多くのビットに関係なく*

クレジットカードの番号
第6 4の後
****** 0831 622666 19桁までのクレジットカードの番号
電話番号
まず3 4
137 **** 9574 11桁の固定長
ID番号
1前後1
3 ****** X
固定長18
フルネーム
隠し姓
*シレン
姓を隠します
IPアドレス
1前後1
10。*。*。27
パラグラフ2の隠すIPアドレス、3
E-mailアドレス
1前後1
w**[email protected] メールボックス名の@の前にのみ***どのように多くのビットを出力しているに関係なく、マスク部分をマスクしません
アドレス
隠し番号
チベット北路、上海*** *** ***ルームフロア
 

データのみの表示要求を抽出カラム部は、他の表示原理は、データマスクによって元のデータを知ることができないと述べました。

 

ツールとして実現マスク、参照します。https://github.com/frankiegao123/mask-utils

 

例外スタック

 

异常堆栈一般会出现在 ERROR 或者 WARN 级别的日志中,异常堆栈含有方法调用链的系统,以及异常产生的根源。异常堆栈的日志属于上一行日志的,在日志收集时需要将其划至上一行中。

 

日志文件

 

日志文件放置于固定的目录中,按照一定的模板进行命名,推荐的日志文件名称:

 

  • 当前正在写入的日志文件名:<应用名>[-<功能名>].log

  • 已经滚入历史的日志文件名:<应用名>[-<功能名>].log.<yyyy-MM-dd>

     

 

日志配置

 

输出

 

根据不同的环境配置不同的日志输出方式:

 

  • 本地调试可以将日志输出到控制台上

  • 测试环境或者生产环境输出到文件中,每天产生一个文件,如果日志量庞大可以每个小时产生一个日志文件

  • 生产环境中的文件输出,可以考虑使用异步文件输出,该种方式日志并不会马上刷新到文件中去,会产生日志延时,在停止应用时可能会导致一些还在内存中的日志未能及时刷新到文件中去而产生丢失,如果对于应用的要求并不是非常高的话,可暂不考虑异步日志

 

logback 日志工具可以在日志文件滚动后将前一文件进行压缩,以减少磁盘空间占用,若使用 logback 对于日志量庞大的应用建议开启该功能。

おすすめ

転載: www.cnblogs.com/xiang--liu/p/11597404.html