Предисловие
Поскольку размер проекта становится все больше и больше, новые модули будут представлены непрерывно. Различные модули будут печатать свои собственные журналы, что в конечном итоге приведет к тому, что журнал не сможет просмотреть. Например, в моем собственном проекте существуют следующие журналы:
Среди них объем данных журнала журнала сообщений и фонового потока очень большой. Если все журналы напечатаны в одном файле и с использованием файла tail -f log.log , вы обнаружите, что журналы быстро прокручиваются, и вы не можете просматривать или даже найти конкретный SQL или журнал доступа к сервису.
Решение состоит в том, чтобы классифицировать и выводить разные журналы, чтобы взаимные журналы не влияли друг на друга. Доступ к журналам с особенно важными интерфейсами может легко найти и устранять проблемы.
Шаг 1: Настройка в log4j.properties
Первый публикацию всех моих собственных конфигураций log4j.properties :
log4j.rootlogger = info, console, файл log4j.appender.console = net.czt.log.asynconsoleappenderlog4j.appender.console.layout = org.apache.log4j.patternlayoutlog4j.appender.console.layout.conversionpatterpatterpattern =. %-17c {2} (%13f:%l)%x {user_id} |%x {user_ip} |%x {server_address} |%x {server_name} |%x {request_uri} |%x {session_id} - %m %nlog4j.appender.console.buffersize = 10000log4j.appender.console.encoding = utf-8 log4j.appender.file = org.apache.log4j.rollingfileAppenderlog4j.appender.file.file =/home/work/apache-tomcat-6.0.39/logs/crazyant.loglog4j.appender.file.maxb ackupindex = 5log4j.appender.file.maxfilesize = 1gblog4j.appender.file.layout = org.apache.log4j.patternlayoutlog4j.appender.file.layout.conversionpattern = [%-5p] Crazyant-web%d {yyyy-mm-dd hh: mm: ss, sss}%x {user_id} |%x {user_ip} |%x {server_address} |%x {server_name} |%x {request_uri} |%x {session_id} Метод:%l%n%m%nlog4j.appender.file.buffersize = 10000log4j.appender.file.encoding = utf-8 log4j.logger.net.czt.crainant.msg = отладка,, messageLog4j.additiation.net.czt.crazyant.msg = falselog4j.appender.message = org.apache.log4j.rollingfileapenderlog4j.appender.message.file =/home/work/apache-tomcat-6.0.39/srazyAnt_messe.Loger. age.Append = truelog4j.appender.message.maxfilesize = 1gblog4j.appender.message.maxbackupindex = 5log4j.appender.message.layout = org.apache.log4j.patternlayoutlog4j.appender.message.layout.conversionpatterpattern =%d.myyyyy-m-messyy-m-meSyyyoutlog4j. HH: MM: SS} [%-5p] [%c {1}] [%t]-%m%nlog4j.appender.message.encoding = utf-8 log4j.logger.net.czt.crazyant.async.service = отладка, asynclog4j.additivity.net.czt.crazyant.async.service = falselog4j.appender.async = org.apache.log4j.rollingfileAppenderlog4j.appender.Async.file =/home/apache-tomcat-6.0.39/logs/srazyant. r.async.append = truelog4j.appender.async.maxfilesize = 1gblog4j.appender.async.maxbackupindex = 5log4j.appender HH: MM: SS} [%-5p] [%c {1}] [%t]-%m%nlog4j.appender.async.encoding = utf-8 log4j.logger.net.czt.orm.mybatis.sqlmonitormanager = debug, Showqlog4j.additivity.net.czt.orm.mybatis.sqlmonitormanager = falselog4j.logger.net.czt.transaction.interceptor.smarttransactionInterceptor = отладка,, showqlog4j.additivity.net.czt.transaction.interceptor.smarttransactionInterceptor = falselog4j.appender.showsql = org.apache.log4j.rollingfileAppenderlog4j.appender.showsql.file =/home/apache-tomcat-6.0.39/gows-qlog.log. og4j.appender.showsql.append = truelog4j.appender.showsql.maxfilesize = 1gblog4j.appender.showsql.maxbackupindex = 5log4j .appender.showsql.layout = org.apache.log4j.patternlayoutlog4j.appender.showsql.layout.conversionpattern =%d {yyyy-mm-dd HH: MM: SS} [%-5p] [%c {1}] [%t]-%m%nlog4j.appender.showsql.encoding = utf-8 log4j.logger.net.czt.crazyant.service = отладка, ServiceLog4j.additiation.net.czt.crazyant.service = falselog4j.appender.service = org.apache.log4j.rollingfileappenderlog4j.appender.service.file =/home/apache-tomcat-6.0.39/srazyant_service.log rvice.append = truelog4j.appender.service.maxfilesize = 1gblog4j.appender.service.maxbackupindex = 5log4j.appender.service.layout = org.apache.log4j.patternlayoutlog4j.appender.service.layout.conversionpatherpathrytyoutlog4j.appender HH: MM: SS} [%-5p] [%c {1}] [%t]-%m%nlog4j.appender.service.encoding = utf-8Ниже файла конфигурации вы можете легко увидеть, что я выводит сообщение (сообщение), Async (Backend Think), Showql (журнал базы данных) и Service (Interface Call) для различных файлов журнала соответственно.
Некоторые из этих объяснений:
log4j.rootLogger=INFO, console, file
Log4J имеет концепцию rootlogger и обычного регистратора. По умолчанию нам нужен только rootlogger, то есть все журналы будут выходить только в этот файл журнала.
Взгляните на конфигурацию обычного регистратора (в качестве примера принимая службу журнала интерфейса):
1. log4j.logger.net.czt.crazyant.service=DEBUG, service
« net.czt.crazyant.service » в этом предложении указывает на полный путь пакета, который вступает в силу в нормальной конфигурации журнала журнала журнала
Цветовая служба указывает название обычного регистратора
2. log4j.additivity.net.czt.crazyant.service=false
« net.czt.crazyant.service » в нем такой же, как выше, что указывает на пакет, предназначенный для элемента конфигурации.
Значение конфигурации в этом предложении заключается в том, что не выводит журнал пакета в журнал rootlogger, а выводит его только в настройку журнала;
3. log4j.appender.service=org.apache.log4j.RollingFileAppender и элементы конфигурации под этим разделом конфигурации
Строка «Сервис» здесь такая же, как и «Сервис» первого элемента конфигурации выше, что указывает на конфигурацию обычного регистратора;
Приведенные ниже элементы конфигурации такие же, как rootlogger, указывая на выходной файл каждый день, кодируя UTF8, правила шардинга, режим вывода для каждой строки и т. Д.
Проблема, с которой я столкнулся, заключалась в том, что после настройки log4j.properties выше я обнаружил, что каждый файл журнала был создан, но в нем не было контента. Почему это? Давайте посмотрим на второе, на что вы обращаете внимание ниже;
Шаг 2: При выводе журнала необходимо установить конкретный класс, соответствующий объекту журнала.
Что это значит? В приведенном выше элементе конфигурации есть строка пакета " net.czt.crazyant.service ". Итак, давайте сами подумаем об этом, как регистрирует журналы выходных данных log4j в разных пакетах в разных файлах? Подумайте об этом, есть два метода:
1. Используйте метод перехвата или AOP, log4J определяет выходной выход. Когда он обнаружит, какой пакет генерируется журнал, он будет выводиться в соответствующий файл;
2. Пользователь передает параметр класса, log4j получает соответствующий пакет класса и использует его в качестве основы для поиска различных файлов журнала;
Глядя на код, очевидно, что log4j использует последний простой и прямой метод:
Import org.apache.commons.logging.log; импорт org.apache.commons.logging.logfactory; открытый класс MyClassImpl реализует myClass { / ** * loger * / private static final logger = logfactory.getlog (myclassimpl.class); / ** * my func */ public void myfunc () {logger.info («Метод вызова myfunc.»); }} В logger = LogFactory.getLog(MyClassImpl.class) параметр класса с использованием logger передается, и адрес пакета, который отражается класс, является адресом пакета, используемый Log4j для вывода журнала.
Этот подход также имеет мощные особенности, которые облегчает логическую классификацию журналов. Например, многие коды не принадлежат к упаковке, но они принадлежат логически вместе. Например, обработка сообщений - это не просто интерфейс, вызывающий пакет услуг, но также может вызвать операцию отправки MSG. Если вы хотите вывести несколько журналов в пакете MSG в службу, то, когда регистратор MSG инициализируется, простой сервисный класс проходит.
Или для всех журналов определенного класса все их объекты регистрации могут быть из одного экземпляра объекта инкапсулированного объекта, и в этом экземпляре единого объекта, который можно использовать только для определения этой логической классификации.
Суммировать
В Log4j.properties поддерживается отдельный вывод журналов пакета или конкретного класса, но также требуется, чтобы инициализация регистрации в коде могла соответствовать пакету в конфигурации журнала.
Хорошо, вышеупомянутое содержимое этой статьи. Я надеюсь, что содержание этой статьи поможет всем, кто учится или работа. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения.