Logback для регистрации различных сообщений в двух файлах
Я с помощью Logback так/slf4j, чтобы сделать мою регистрацию. Я хочу проанализировать свой файл журнала для анализа некоторых данных, поэтому вместо разбора большого большого файла (в основном состоящего из отладочных операторов) я хочу иметь два экземпляра logger, каждый из которых записывается в отдельный файл; один для аналитики и один для всех целей ведения журнала. Кто-нибудь знает, возможно ли это с помощью Logback или любого другого регистратора?
3 ответов:
это очень возможно сделать что-то вроде этого в logback. Вот пример конфигурации:
<?xml version="1.0"?> <configuration> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>logfile.log</file> <append>true</append> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern> </encoder> </appender> <appender name="ANALYTICS-FILE" class="ch.qos.logback.core.FileAppender"> <file>analytics.log</file> <append>true</append> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern> </encoder> </appender> <!-- additivity=false ensures analytics data only goes to the analytics log --> <logger name="analytics" level="DEBUG" additivity="false"> <appender-ref ref="ANALYTICS-FILE"/> </logger> <root> <appender-ref ref="FILE"/> </root> </configuration>затем вы бы настроили два отдельных регистратора, один для всего и один для данных log analytics следующим образом:
Logger analytics = LoggerFactory.getLogger("analytics");
вы можете иметь столько лесорубов, как вы хотите. Но, лучше у вас есть один для каждого пакета, который вам нужно войти по-разному. Тогда все классы в этом пакете и его подпакетах получат этот конкретный регистратор. Все они могут совместно использовать корневой регистратор и отправлять свои данные журнала в корневой регистратор appender с помощью additivity="true". Вот пример:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <property name="pattern" value="%date{HH:mm:ss.SSS} %-5p %logger{36} %X{akkaSource} [%file:%line] - %m%n" /> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%date{HH:mm:ss.SSS} %-5p %logger{36} %X{akkaSource} [%file:%line] - %m%n</pattern> </encoder> </appender> <appender name="abc" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${catalina.base}/logs/worker.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${catalina.base}/logs/worker-%d{yyyy-MM-dd_HH}.log</fileNamePattern> <maxHistory>360</maxHistory> </rollingPolicy> <encoder> <pattern>${pattern}</pattern> </encoder> </appender> <appender name="xyz" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${catalina.base}/logs/transformer.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${catalina.base}/logs/transformer-%d{yyyy-MM-dd_HH}.log</fileNamePattern> <maxHistory>360</maxHistory> </rollingPolicy> <encoder> <pattern>${pattern}</pattern> </encoder> </appender> <logger name="com.xxx.yyy.zzz" level="INFO" additivity="true"> <appender-ref ref="xyz"/> </logger> <logger name="com.aaa.bbb.ccc" level="INFO" additivity="true"> <appender-ref ref="abc"/> </logger> <root> <level value="INFO" /> <appender-ref ref="STDOUT" /> </root>
в моем случае я хотел оставить имена классов, как имя журнала
private static final Logger log = LoggerFactory.getLogger(ScheduledPost.class);и как у меня было мало таких классов, так и у меня
logback.xml<!--additivity=false ensures this log data only goes to the this log, and no one more --> <logger name="xxx.xxx.xxx.ScheduledPost" level="DEBUG" additivity="false"> <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/> </logger> <logger name="xxx.xxx.xxx.GcmPost" level="DEBUG" additivity="false"> <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/> </logger> <logger name="xxx.xxx.xxx.PushUtils" level="DEBUG" additivity="false"> <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/> </logger>
Comments