كيفية تكوين Log4J متعددة للحرب مختلفة في أذن واحدة؟

StackOverflow https://stackoverflow.com/questions/762918

  •  11-09-2019
  •  | 
  •  

سؤال

لدي أذن مع هياكل مثل:

APP.ear 
- APP1.war
    - WEB-INF/classes/log4j.properties
- APP2.war
    - WEB-INF/classes/log4j.properties
- app1-ejb.jar
- app2-ejb.jar
- log4j.jar
- spring.jar
- commons-lang.jar (...and other jar)

أريد أن يكون كل حرب سجل تطبيقه الخاص. ولكن يبدو أن التكوين أعلاه لا يعمل. تسجيل الدخول ل App1 و App2 يذهب إلى سجل App1. هل هناك على أي حال لإنشاء سجلات تطبيق منفصلة؟

هل كانت مفيدة؟

المحلول

اتضح أنه من المستحيل بسبب الفصل الدراسي. التسلسل الهرمي الكلاسي هو مثل:

تطبيق Classloader -> EJB Classloader -> حرب الكلاس

للحصول على سجل Sepearte للحرب الفردية، يمكن للمرء أن يضع log4j.jar داخل الحرب والسماح ل LOG4J باستخدام حرب الكلمة. ولكن نظرا لأن كل من App1-EJB.JAR و App2-Ebj.Jar تحتاج أيضا إلى استخدام Log4J، لا يمكن إلا أن يتم وضع log4j.jar عند المستوى العلوي. لذا فإن log4j هو على مستوى تصنيف التطبيق.

يمكنني تحديد تكوين LOG4J واحد لتسجيل حزمة مختلفة إلى ملفات مختلفة. ولكن بالنسبة للمكتبة المشتركة مثل الربيع، لا يمكن أن يكون السجل هو الرد.

نصائح أخرى

السبب في أنه لم يعمل لأن LOG4J موجود في موقع الجذر، بدلا من ذلك، دع كل حرب يحتوي على log4j.jar في دليل Web-INF / LIB وإزالة LOG4J.JAR من الجذر.

لمزيد من المعلومات حول هذا إحضار مقال بلدي بلوق على هذاhttp://techcrawler.wordpress.com/

يمكنك أيضا القيام بذلك عن طريق تغيير خاصية الملف بشكل حيوي في ملف الخصائص باستخدام PropertyConfigurator في التعليمات البرمجية.

Logback هو حل قابل للتطبيق لمعالجة هذه المشكلة. بعد أن تنظر حول الاختراقات المختلفة لجعل هذا العمل مع Log4J، قررنا التبديل إلى Logback. لقد استخدمت التكوين التالي مع جرة Logback داخل WebApp.

ملف تسجيل الدخول داخل WebApp الذي يتضمن ملف خارجي:

    <?xml version="1.0" encoding="UTF-8" ?>
    <configuration scan="true" scanPeriod="10 seconds">
        <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
            <resetJUL>true</resetJUL>
        </contextListener>

        <contextName>${project.artifactId}</contextName>

        <jmxConfigurator />

        <include file="${logback.configuration.filepath}" />
    </configuration>

${logback.configuration.filepath} يتم استبداله أثناء تصفية Maven بالمسار الدقيق، الخارجي إلى Webapp لملف التكوين (شيء مثل / pt/server/conf/loback.included.conf.).

وبعد ذلك، محتوى logback.included.conf (هذا الملف جزء من projetct، تسليمها مع build-helper:attach-artifact, ، وبالتالي ${project.artifactId} يتم استبداله أيضا أثناء تصفية Maven):

    <?xml version="1.0" encoding="UTF-8" ?>
    <included>
        <appender name="file" class="ch.qos.logback.core.FileAppender">
            <file>/var/log/server/${project.artifactId}.log</file>
            <encoder>
                <pattern>[@/%contextName] %date{ISO8601} [%-5level] %thread:[%logger] %msg%n</pattern>
            </encoder>
        </appender>

        <root level="INFO">
            <appender-ref ref="file" />
        </root>
    </included>

فقط الحد، يجب أن تكون محتوى الملف المضمن متوافقا مع واحد من includer. مجرد كتابة القواعد في الواقع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top