Пытаюсь разобраться с логированием activeweb в отдельный файл

Я пытаюсь использовать активную веб-библиотеку по умолчанию, чтобы записывать все в отдельный файл журнала. Прямо сейчас я запускаю все под IntelliJ (через mvn jetty: run), и все журналы выводятся только на консоль.

Я попытался добавить файл log4j.properties в каталог WEB-INF; не сработало (я не добавлял зависимость log4j в свою помпу, так как не хочу ее там).

Глядя на slf4j, я не могу найти какие-либо свойства или файл конфигурации, которые позволяют мне определить, как я буду входить в определенный файл журнала. И я не уверен, что ведение журнала использует AW, поэтому трудно понять, что мне нужно настроить.

Застрял на этом этапе и просто погуглил и прочитал сайт slf4j, чтобы попытаться заставить это работать.


person Nibarulabs    schedule 13.08.2018    source источник
comment
вы пишете: отдельный файл - отдельный от чего?   -  person ipolevoy    schedule 13.08.2018
comment
Я хотел бы перенаправить ведение журнала в файл ${project.basedir}/logs/log.txt. В настоящее время я делаю это, говоря IntelliJ отправлять все журналы консоли в этот файл. Но я хотел бы настроить его где-нибудь. В log4j я мог создавать все свои логгеры и конфиги прокатных файлов, как мне заблагорассудится. Это полезно для меня, когда я записываю определенные части базы кода в отдельные файлы. Я хочу отделить ведение журнала AW по умолчанию от своего кода, а также вывести ведение журнала по имени пакета, если захочу.   -  person Nibarulabs    schedule 14.08.2018
comment
да, смотрите мой ответ, я считаю, что в нем есть все, что вам нужно.   -  person ipolevoy    schedule 14.08.2018


Ответы (1)


В общем, если вы хотите, чтобы Log4j и Slf4j выполняли ведение журнала, вам нужно будет добавить соответствующие зависимости. Вот конфигурация одного из наших проектов:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
       <version>1.7.5</version>
    </dependency>

это принесет соответствующие deps.

Вот содержимое файла log4j.properties.

log4j.rootLogger=INFO, ${logger-name}, SPLUNK

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout

log4j.appender.SPLUNK=org.apache.log4j.DailyRollingFileAppender
log4j.appender.SPLUNK.File=${catalina.home}/logs/worker-splunk.log
log4j.appender.SPLUNK.Append=true
log4j.appender.SPLUNK.Encoding=UTF-8

# This is a filter that will filter out junk we do not want to sent to Splunk
log4j.appender.SPLUNK.filter.1=app.utils.SplunkLogFilter
log4j.appender.SPLUNK.layout=org.javalite.logging.JsonLog4jLayout


log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.FILE.File=${catalina.home}/logs/worker.log
log4j.appender.FILE.Append=true
log4j.appender.FILE.Encoding=UTF-8
log4j.appender.FILE.layout=org.javalite.logging.JsonLog4jLayout

logger-name — это свойство, отфильтрованное Maven. Локально оно разрешается в CONSOLE, а когда приложение создается, оно разрешается в FILE. Таким образом, мы можем наблюдать за журналом в консоли во время разработки.

Класс SplunkLogFilter выглядит так:

import org.apache.log4j.spi.Filter;
import org.apache.log4j.spi.LoggingEvent;

public class SplunkLogFilter extends Filter {

    private static final String[] EXCLUDED_LOGGERS = new String[]{"***ServiceImpl", "app.utils.ProcessUtil"};
    private static final String[] EXCLUDED_MESSAGES = new String[]{"****Command"};

    @Override
    public int decide(LoggingEvent event) {
        String loggerName = event.getLoggerName();
        for (String excludedLogger : EXCLUDED_LOGGERS) {
            if(loggerName.equals(excludedLogger)){
                return Filter.DENY;
            }
        }
        String message = event.getMessage().toString();
        for (String excludedMessage : EXCLUDED_MESSAGES) {
            if(message.contains(excludedMessage)){
                return Filter.DENY;
            }
        }
        return Filter.NEUTRAL;
    }
}

Итак, мы параллельно логинимся в два файла, один из которых загружается в Splunk. Файл Splunk меньше, поэтому мы платим за Splunk меньше, но на всякий случай сохраняем полные файлы.

person ipolevoy    schedule 13.08.2018
comment
Имеет общий смысл и то, что я сделал в других проектах. Извините за неясность - я надеялся не вводить еще одну зависимость. В моем текущем pom есть эта зависимость: <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.6.4</version> </dependency> Итак, что я пытаюсь сделать, так это использовать сам slf4j и настроить его вместо добавления в log4j deps, а затем настроить это. Спасибо за ответ); Я просто пытаюсь понять, что я могу и не могу делать со стандартным AW. - person Nibarulabs; 14.08.2018
comment
Поймите, AW имеет подключаемую архитектуру для логирования, вам решать, что в нее подключать. - person ipolevoy; 14.08.2018
comment
У меня это почему-то не работает. У меня есть настройка фильтра ведения журнала, а также приложение. У меня есть вывод в файл, но ничего из моего конкретного пакета. В своих контроллерах я использую метод logDebug() и нигде не вижу сообщений журнала. Я убедился в своей строке EXCLUDED_LOGGERS, что в ней нет моих пакетов или классов. Я также использую Jetty, а не tomcat - не то чтобы это должно было иметь значение. Думаю, я продолжу заниматься, но сегодня утром я уже потратил несколько часов, и у меня нет результатов, которые я ищу. - person Nibarulabs; 14.08.2018
comment
Кроме того, я установил rootLogger на DEBUG, поэтому у меня не должно быть проблем с logDebug(). На самом деле я вижу всевозможные сообщения activemq (я использую async) и TemplateLoader отладочные сообщения. Итак, я знаю, что это работает, в некоторой степени. - person Nibarulabs; 14.08.2018
comment
В итоге я просто использовал log4j2 вне ведения журнала AW. Все работает как положено. - person Nibarulabs; 14.08.2018
comment
У нас нет таких вопросов. Убедитесь, что ваш log4j.properties устанавливает правильный уровень журнала. - person ipolevoy; 15.08.2018