2017-11-10 13 views
0

標準セットを私のアプリケーションの重要なログポイントすべてに提供できるAPIが必要です。具体的には、(基本的に加えて)次の情報を複数行メッセージのようになります。詳細な(複数行の)ログ用のJavaロギングAPI

  1. ログカテゴリ
  2. 短い説明タイトル
  3. 説明
  4. レスポンスアクション(ダメージコントロール)私のアプリケーションは、電子のために、探して単一のマルチラインログで

(など例外情報、)

  • 詳細がかかりますXAMPLE、そのよう:

    2017-11-10 14:26:59,156 [main] WARN o.s.t.c.s.ExampleClass: 
        Caption: Unconformable data 
        Description: The data provided from the X datasource in order to perform Y operation could not be translated 
        Response Action: Application will discard unusable data into this component's DLQ 
        Details: The data string "x" was not of expected Integer type 
         <Some stacktrace>.... 
    

    これはまさにそれが起こったこと起こった、そしてどのようなアプリケーションが例外のイベントに応答してやっているについて非常に有益だろう冗長な文です。

    最も近いのは、JBossのロギングAPIと、ActiveMQ Artemis sourceで見つかったコードの例です。

    @LogMessage(level = Logger.Level.WARN) 
        @Message(id = 202008, value = "Failed to check Address list {0}.", 
         format = Message.Format.MESSAGE_FORMAT) 
        void failedToParseAddressList(@Cause Exception e, String addressList); 
    

    そして、もう一つは、書面により自分のコードでline with this messageが記録されます:: メッセージ形式の宣言は、そのような単一のファイルで定義することができ

    私は見つけることができる最も近いです
    ActiveMQUtilLogger.LOGGER.failedToParseAddressList(e, addressList); 
    

    何I探していたとてもかっこいい。しかし、私はJBossを使用していません(また、そのAPIにロックしたくない)。

    私はLOG4Jを使用することができます。これは、レイアウトで使用できるStructuredDataMessage and Structured Data Lookupを持っています。私はデフォルトでそれを使用して終了します。私のコードはこれを解決するためにStructuredDataMessage工場に委譲することができます。しかし、このJBoss APIのようなものを使用するよりも少し嵩張ります。

    他のAPI、コードパターン、または気の利いたトリックなど、誰でもこの問題の提案がありますか?

  • +0

    あなたは何らかのコンテナで動いていますか?あなたはパターンでそれを行う可能性がありますが、使用しているログマネージャに依存する可能性があります。 –

    答えて

    1

    log4j2を使用しない理由が明記されていないので、そのルートに進んでください。あなたが指摘しているように、それはあなたのニーズに合わせて使うことができるStructuredDataMessageを提供します。この例では、StructuredDataMessageクラスに組み込まれているidtypeのようなものは含まれていないため、MapMessageを使用することをおすすめします。

    import org.apache.logging.log4j.LogManager; 
    import org.apache.logging.log4j.Logger; 
    import org.apache.logging.log4j.message.MapMessage; 
    
    public class MapMessageExample { 
    
        private static final Logger log = LogManager.getLogger(); 
    
        public static void main(String[] args){ 
         log.info(buildMsg("My title", "This is the description", 
           "No response needed", "Some details here"));   
        } 
    
        // This could be moved into a factory class 
        public static MapMessage buildMsg(String title, String description, 
          String responseAction, String details) 
        { 
         MapMessage mapMsg = new MapMessage(); 
         mapMsg.put("title", title); 
         mapMsg.put("desc", description); 
         mapMsg.put("response", responseAction); 
         mapMsg.put("details", details); 
         return mapMsg; 
        } 
    } 
    

    とlog4j2:

    はここにいくつかの簡単なサンプルコードです。それに沿って行くためのXML設定ファイル:

    <?xml version="1.0" encoding="UTF-8"?> 
    <Configuration status="WARN"> 
        <Appenders> 
         <Console name="Console" target="SYSTEM_OUT"> 
          <PatternLayout pattern="%d{HH:mm:ss.SSS} [%M] %-5level %logger{36}%n\tCaption: ${map:title}%n\tDescription: ${map:desc}%n\tResponse Action: ${map:response}%n\tDetails: ${map:details}%n" /> 
         </Console> 
        </Appenders> 
    
        <Loggers> 
         <Root level="debug"> 
          <AppenderRef ref="Console" /> 
         </Root> 
        </Loggers> 
    </Configuration> 
    

    ここではいくつかのサンプル出力です:

    00:40:45.810 [main] INFO example.MapMessageExample 
        Caption: My title 
        Description: This is the description 
        Response Action: No response needed 
        Details: Some details here 
    

    いくつかの最終的な思考:

    は私のコードは、この問題を解決するために、いくつかのStructuredDataMessage工場に委任することができ

    私は同意する、工場のパターンは良いchoここに氷。サンプルコードでコメントしたとおり、buildMsgメソッドをファクトリクラスに移動できます。

    ただし、このJBoss APIのようなものを使用するよりも少し嵩張ります。

    私はそれがどのようにかさばるかは実際にはわかりません。ほとんどの場合、MapMessageの項目のうち1つまたは2つだけが変更されているとわかった場合は、あなたが述べたAPIに似た非常に特殊なメソッドを簡単に書くことができます。上記の例に追加するには:

    public static MapMessage reallySpecificLogMessage(String details){ 
        return buildMsg("My specific message title", "My specific description", 
          "My specific response action", details); 
    } 
    

    あなたは、おそらくこの方法で使用されている文字列に定数を割り当てたいだろうが、私は、これは単なる簡単な例であるとして。

    +0

    ええ、私はこれと同じように使うと思っていましたが、そこに何か他のアイデアがあるかどうかを見たいと思っていました。ありがとう – Dovmo

    関連する問題