Хороший способ Log 4j для записи в разные файлы в соответствии с модулем - PullRequest
0 голосов
/ 27 июля 2011

Привет, у меня в приложении много модулей, каждый модуль имеет свой пакет.мое приложение предполагает создание разных файлов для каждого модуля. Я делаю это следующим образом:

<appender name="module1" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="File" value="/var/log/camel/module1.log" />
    <param name="DatePattern" value="'.'yyyy-MM-dd" />
    <param name="Append" value="true" />
    <param name="Threshold" value="DEBUG" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d %p [%c] - %m%n" />
    </layout>
    <param name="additivity" value="false" />
</appender>
   <logger name="com.package.module1">
    <level value="DEBUG" />
    <appender-ref ref="module1" />
</logger>

Это прекрасно работает, но требует дальнейших улучшений

  1. будеттак много записей в журнале, как для любого модуля?Могу ли я связать некоторый файл свойств и обеспечить отображение класса / пакета там.

  2. Как я могу обрабатывать общий класс платформы на данный момент, я рассматриваю его как модуль?

Спасибо за помощь

Ответы [ 2 ]

2 голосов
/ 27 июля 2011

Вы должны переключиться на Logback и рассмотреть возможность использования SiftingAppender.Этот разделит ваши лог-файлы так, как вы хотите.

1 голос
/ 27 июля 2011

Я не уверен ни в каком методе, использующем файл свойств в базовом API Log4j, но вы, безусловно, можете попробовать это программно в некотором коде инициализации. Сначала создайте основные определения в XML, как у вас есть:

<appender name="baseModuleAppender" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="File" value="/var/log/camel/${module}.log" />
    <param name="DatePattern" value="'.'yyyy-MM-dd" />
    <param name="Append" value="true" />
    <param name="Threshold" value="DEBUG" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d %p [%c] - %m%n" />
    </layout>
</appender>
<logger name="com.package.module.base" additivity="false">
    <level value="DEBUG" />
    <appender-ref ref="baseModuleAppender" />
</logger>

Затем сделайте это в некотором Java-коде, который вызывается при запуске вашего приложения до того, как ваши модули нуждаются в регистрации:

String[] modules = new String[] {"module1", "module2", "module3"};
Logger baseLogger = Logger.getLogger("com.package.module.base");
DailyRollingFileAppender baseAppender = (DailyRollingFileAppender) baseLogger.getAppender("baseModuleAppender");

for (String module : modules) {
    Logger logger = Logger.getLogger("com.package." + module);
    logger.setLevel(baseLogger.getLevel());
    logger.setAdditivity(baseLogger.getAdditivity());

    String filename = baseAppender.getFile().replaceAll("\\$\\{module}", module);
    DailyRollingFileAppender appender = new DailyRollingFileAppender(baseAppender.getLayout(), filename, baseAppender.getDatePattern());
    appender.setAppend(baseAppender.getAppend());
    appender.setThreshold(baseAppender.getThreshold());
    logger.addAppender(appender);
}

Вы можете решить, как modules получать значения, как вам нравится (с помощью отражения, файла свойств и т. Д.) Я не пробовал этот код, но думаю, что стоит попробовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...