Во время работы проекта часто необходимо выполнять функциональную отладку и отслеживать и записывать поведение пользователей. Некоторые люди привыкли использовать System.out, но это не рекомендуется. Это просто легко использовать, но не прост в обслуживании и не имеет масштабируемости. По сравнению с log4j, log4j может управлять пунктом назначения, выходного формата и уровня информации журнала и т. Д., Чтобы мы могли более тщательно контролировать процесс генерации журнала.
Log4J2 - это обновление до LOG4J1, со значительными улучшениями в производительности и функциональности, включая повышенную пропускную способность в многопользовании, поддержку заполнителей, автоматическое перезагрузка файлов конфигурации и т. Д.
1. Введение
1. Загрузите пакет JAR
Pox.xml
<Depectiandy> <Dependency> <groupId> org.apache.logging.log4j </GroupId> <artifactid> log4j-api </artifactid> <sersive> 2.10.0 </version> </degy artifactid> <groupd> org.apache.logging.log4j </artifactid> </artifactid> <версия> 2.10.0 </version> </vehyederian> </depertiances>
2. Файл конфигурации
Log4J содержит четыре реализации заводов конфигурации: JSON, YAML, Properties и XML. В этой статье представлен обычно используемый метод XML.
Log4J имеет возможность автоматически настроить себя во время инициализации. При запуске log4j он найдет все файлы, соответствующие именам, под классной точкой, с приоритетом заказа: log4j2-test.properties> log4j2-test.xml> log4j2.properties> log4j2.xml
3. Простой пример
Конфигурация XML:
<?xml version="1.0" encoding="UTF-8"?><Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <root level = "info"> <appenderRef ref = "console"/> </root> </loggers> </configuration> Код Java:
Private Static Final Logger logger = logManager.getLogger (myApp.class); @Test public void testlog4j () {logger.info ("Привет, мир!"); }}Информация о консоли
22: 17: 47.146 [Main] Информация MyApp - Hello World!
2. Введение модуля
<Конфигурация>
| свойство | описывать |
| MonitorInterval | Если файл изменен, конфигурация будет перезагружена после указанного времени. Единицы секунд минимальное значение - 5 |
| пакеты | Отдельный список имен пакетов, используемые для поиска плагинов, таких как пользовательские фильтры, приложения и т. Д. Плагин будет загружаться только один раз, поэтому вы должны перезапустить проект, если он хочет вступить в силу после изменения. |
| статус | Уровень внутреннего журнала, установление значения для отладки может четко увидеть весь поток событий журнала на консоли. Используемый журнал org.apache.logging.log4j.core.logger |
| строгий | Строгий формат XML допускается. Конфигурация JSON не поддерживается |
| многословный | Включить диагностическую информацию при загрузке плагина |
<ppersenders>
Log4J позволяет напечатать запросы журнала в несколько направлений. На языке log4j пункт назначения вывода называется appender. В настоящее время аппендины существуют в консолях, файлах, серверах удаленных сокетов, Apache Flume, JMS, удаленном Syslog Unix Daemons и различных API базы данных. Следующее вводит несколько более часто используемых аппендеров. Если вам нужно узнать больше, вы можете проверить это на официальном сайте.
1. Консоляпендер
Вывод к консоли, <Консоль>
Имя параметра | тип | описывать |
фильтр | Фильтр | Фильтр |
макет | Макет | Формат вывода журнала |
Следовать | логический | |
прямой | логический | |
имя | Нить | Имя приложения |
Игнорирование | логический | По умолчанию истинность, игнорируйте исключения записи |
цель | Нить | System_out или System_err, по умолчанию System_out |
2. FileAppender
Вывод в файл, <File>
параметр | тип | описывать |
|---|---|---|
добавлять | логический | По умолчанию верно, и новые записи будут добавлены к концу файла |
Буферио | логический | По умолчанию верно, использование буферов может значительно повысить производительность |
Buffersize | инт | Когда Bufferedio верен, размер буфера этого свойства по умолчанию составляет 8192 байт. |
CreateOndemand | логический | Приложение создает файлы по требованию. Приложение создаст этот файл только тогда, когда событие журнала проходит через все фильтры и направляется в приложение. Значение по умолчанию неверно |
фильтр | Фильтр | Фильтр, чтобы определить, следует ли обрабатывать событие этим приложением. Можно использовать несколько фильтров с композитными фильтрами |
имя файла | Нить | Имя файла, который будет записан. Если файл или какой -либо из его родительских каталогов не существует, они будут созданы |
Непосредственно | логический | По умолчанию верно, после каждой записи будет обновление. Это гарантирует, что данные буфера записаны на диск, но могут повлиять на производительность. |
макет | Макет | Формат журнала |
блокировка | логический | Блокировка файла, false по умолчанию |
имя | Нить | Имя приложения |
Игнорирование | логический | По умолчанию истинность, игнорируйте исключения записи |
FilePermissions | Нить | Определите разрешения на файлы Пример: RW ------ или RW-RW-RW- и т. Д. |
Файлоул | Нить | Определите владельца файла |
FileGroup | Нить | Определите группы файлов |
3. Jdbcaappender
JDBCAppender использует стандартные JDBC для записи событий журнала в таблицах реляционных баз данных. Его можно настроить для получения соединения JDBC с использованием источника данных JNDI или пользовательского метода завода. Независимо от метода, он должен поддерживать пул соединений.
В противном случае, производительность регистрации будет сильно затронута.
Если настроенный драйвер JDBC поддерживает партийные операторы и настраивает размер буфера на положительное число, событие журнала будет пакетно.
(1) <jdbc>
параметр | тип | описывать |
|---|---|---|
имя | Нить | Должен, имя приложения |
Игнорирование | логический | По умолчанию True, игнорируйте исключения события журнала |
фильтр | Фильтр | Фильтр |
Buffersize | инт | Если целое число превышает 0, это приведет к тому, что приложение будет буферизовать событие журнала и обновить данные записи, когда буфер достигнет этого размера |
Connectionsource | Connectionsource | Необходимо получить подключение к базе данных |
табличное имя | Нить | Требуется, вставьте имя таблицы данных события журнала |
ColunConfigs | ColunConfig [] | Необходимо, поля, которые необходимо вставить в базу данных, состоит из нескольких элементов <born> |
столбцы | Столбец [] | Требуется конфигурация картирования поля |
(2) Используйте <TaSource> для получения соединения JDBC, здесь указан только JNDI:
| параметр | тип | описывать |
|---|---|---|
| Jndiname | Нить | Требуется, если настроенный JNDI - JDBC/loggingDatabase, значение здесь - Java: Comp/env/jdbc/loggingDatabase. Источник данных должен поддерживаться пулом соединений; В противном случае журнал будет очень медленной. |
(3) Используйте <столбец>, чтобы указать, какие столбцы написать в таблицу и как их написать. У него нет уязвимости в инъекциях SQL.
| параметр | тип | описывать |
|---|---|---|
| имя | Нить | Требуется имя поля таблицы |
| шаблон | Нить | Вставьте значения, используя режим PatternLayout. ПРИМЕЧАНИЕ. В том же элементе столбца только один из трех атрибутов шаблона, буквального и Iseventtimestamp может существовать в одном и том же элементе столбца. |
| буквальный | Нить | Это значение будет непосредственно включено в оператор SQL и выполнено, например: функция rand () будет генерировать случайные числа, аналогичные $ {} в Myibats |
| iseventtimestamp | логический | Будь то формат времени java.sql.types.timestamp |
| Исиникод | логический | Это свойство игнорируется, если не указан шаблон. Если это правда, значение будет вставлено в Unicode. В противном случае значение будет вставлено в не Unicode. |
| isclob | логический | Это свойство игнорируется, если не указан шаблон. Если истина, значение будет вставлено в клоб, в противном случае Varchar, NVARCHAR будет вставлен в |
Пример:
<? xml version = "1.0" Encoding = "utf-8"?> <vatusts = "error"> <pplicenders> <jdbc name = "databaseappender" tablename = "dbo.application_log"> <dataSource jndiname = "java:/comp/jdbc/loggingdaSource jndiname =" java:/comp/jdbc/loggingdasour iseventtimestamp = "true" /> <column name = "level" pattern = "%level" /> <name = "logger" pattern = "%logger" /> <column name = "message" pattern = "%message" /> <column = "Исключение" pattern = "%ex {full}" /> < /jdbc> < /appenders> <loggers> <root level = "warn" /> < /jdbc> < /appenders> <loggers> <root level = "warn" /> < /jdbc> ref = "DatabaseAppender"/> </root> </loggers> </configuration><tlemplelayout>
(1) Дата, %d/ %Дата
Шаблон | Пример |
|---|---|
%d {по умолчанию} | 2012-11-02 14: 34: 02,781 |
%d {iso8601} | 2012-11-02T14: 34: 02,781 |
%d {iso8601_basic} | 20121102T143402,781 |
%d {абсолютный} | 14: 34: 02,781 |
%d {дата} | 02 ноября 2012 г. 14: 34: 02,781 |
%d {Compact} | 20121102143402781 |
%d {HH: MM: SS, SS} | 14: 34: 02,781 |
%d {dd mmm yyy hh: mm: ss, ss} | 02 ноября 2012 г. 14: 34: 02,781 |
%d {hh: mm: ss} {gmt+0} | 18:34:02 |
%d {unix} | 1351866842 |
%d {unix_millis} | 1351866842781 |
Конечно, вы также можете настроить формат, такой как %d {yyyy-mm-dd HH: MM: SS}
(2) Logger, %c/ %logger
Образец конверсии | Имя регистрации | результат |
|---|---|---|
%c {1} | org.apache.commons.foo | Фу |
%c {2} | org.apache.commons.foo | Commons.foo |
%c {10} | org.apache.commons.foo | org.apache.commons.foo |
%c {-1} | org.apache.commons.foo | apache.commons.foo |
%c {-2} | org.apache.commons.foo | Commons.foo |
%c {-10} | org.apache.commons.foo | org.apache.commons.foo |
%c {1.} | org.apache.commons.foo | OACFOO |
%c {1.1. ~. ~} | org.apache.commons.test.foo | oa ~. ~ .foo |
%c {.} | org.apache.commons.test.foo | .... foo |
{?} - Когда ? является положительным целым числом, это означает, что n части взяты справа, а отрицательное целое число означает, что n части удаляются слева. Так почему %c {-10}-полное имя, я не знаю. Добро пожаловать, чтобы оставить сообщение
(3) Информация о журнале,%m/%msg/%
(4) Уровень журнала, %уровня
<Filter>
log4j2 поставляется с различными фильтрами для прямого использования, и мы также можем определить фильтры сами:
Myfilter.java
Import org.apache.logging.log4j.level; import org.apache.logging.log4j.marker; import org.apache.logging.log4j.threadContext; import org.apache.logging.log4j.core.logevent; import org.apache.logging.log.core.logger; org.apache.logging.log4j.core.config.plugins.import org.apache.logging.log4j.core.config.plugins.pluginfactory; импорт org.apache.logging.log4j.core.filter.abstractfilter; import org.apache.logging.log4j.message.message; @plugin (name = "myfilter", category = "core", elementtype = "filter", printobject = true) public class myfilter extrablefilter {приватный уровень окончательного уровня; private myfilter (уровень уровня, результат Onmatch, результаты Onmismatch) {Super (Onmatch, Onmismatch); this.level = level; } Фильтр публичных результатов (Logger Logger, уровень уровня, маркер, строка MSG, Object [] params) {return Filter (level); } Фильтр публичных результатов (Logger Logger, уровень уровня, маркер, объект MSG, Throwable T) {return Filter (level); } Фильтр публичных результатов (регистратор регистрации, уровень уровня, маркер, Messe MSG, Throwable T) {return Filter (level); } @Override Public Result Filter (Event LogEvent) {return Filter (event.getlevel ()); } Частный фильтр результатов (уровень уровня) { / * * Business Logic * * / return Level.ismorpecificthan (this.level)? Onmatch: Onmismatch; } @Override public String toString () {return level.toString (); } @Pluginfactory public static myfilter createfilter (@pluginattribute (value = "level", defaultriting = "error") уровня, @pluginattribute (value = "onmatch", defaultring = "Нейтральный") onmatch, @pluginattrube (value = "onmismathtr Myfilter (level, onmatch, onmismatch); }}log4j2.xml
<? xml version = "1.0" encoding = "utf-8"?> <configuration status = "warn" monitorinterval = "5" packages = "your packages" verbose = "false" strict = "true"> <pprenders> <Консольный имя = "Консоль". HH: MM: SS} %Level %logger {10} - %msg "/> <myfilter level =" info "onmatch =" Accept "/> </console> </appenders> <loggers> <root level =" info "> <adpenderRef ref =" Консоль "/> </root> </loggers> </configuration>Пополнить:
В практических приложениях иногда необходимо записывать информацию о доступе пользователя, такую как параметры запроса, идентификатор пользователя и т. Д. В Log4J1 мы будем использовать MDC и NDC для хранения информации о контексте приложения, в то время как Log4J2 использует ThreadContext для реализации функций как MDC, так и NDC.
(1) NDC использует стек-подобный механизм для хранения контекстной информации, а потоки независимы.
Используйте %x для вывода в PatternLayout, обратите внимание, что x является нижним регистом.
Пример:
Тест. Ява
ThreadContext.push («Привет, мир!»);
log4j2.xml
<Column name = "tip" pattern = "%x" />
(2) MDC использует MAP-подобный механизм для хранения информации, а потоки независимы.
Используйте %x {userId} в PatternLayout для вывода, обратите внимание, что x заглаживается.
Пример:
Тест. Ява
ThreadContext.put ("userId", "1");log4j2.xml
<Column name = "userid" pattern = "%x {userid}" />Обратите внимание, что после его использования вызовите clearall (), чтобы очистить контекстную карту и стек.
API: http://logging.apache.org/log4j/2.x/javadoc.html
Официальный адрес веб -сайта: https://logging.apache.org/log4j/2.x/index.html
Приведенный выше пример кода компонента журнала проекта Log4J2 - это все контент, которым я делюсь с вами. Я надеюсь, что вы можете дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.