Мой log4j2.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} [%sn] [%t] %-5level %logger{36} - %msg%n" />
</Console>
<RandomAccessFile name="randomAccessFile" fileName="temp\\logs.log" immediateFlush="false" append="false">
<!-- <PatternLayout pattern="%d %p %class{2.} [%t] %location %m %ex%n" /> -->
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</RandomAccessFile>
<JDBC name="databaseAppender" tableName="app_logs" bufferSize="1000">
<!-- <DataSource jndiName="java:/comp/env/jdbc/testLog" /> -->
<!-- <BurstFilter level="TRACE" rate="20" maxBurst="2" /> -->
<ConnectionFactory class="com.mc.loggerProvider.ConnectionFactory" method="getDatabaseConnection" />
<Column name="LOG_ID" pattern="%u{TIME}" isUnicode="false" />
<Column name="LOG_TIMESTAMP" isEventTimestamp="true" isUnicode="false" />
<!-- <Column name="CORR_ID" pattern="%X{CORR_ID}" isUnicode="false" /> -->
<Column name="LOG_LEVEL" pattern="%level" isUnicode="false" />
<Column name="LOGGER_NAME" pattern="%logger" isUnicode="false" />
<Column name="MESSAGE" pattern="%msg %ex{full}" isUnicode="false" />
<!-- <Column name="EXCEPTION" pattern="%ex{full}" isUnicode="false" /> -->
</JDBC>
</Appenders>
<Loggers>
<Logger name="console" level="trace" includeLocation="false" additivity="false">
<AppenderRef ref="console" />
</Logger>
<AsyncLogger name="asyncFile" level="trace" includeLocation="false" additivity="false">
<AppenderRef ref="randomAccessFile" />
</AsyncLogger>
<Logger name="syncFile" level="trace" includeLocation="false" additivity="false">
<AppenderRef ref="randomAccessFile" />
</Logger>
<AsyncLogger name="asyncDB" level="trace" includeLocation="false" additivity="false">
<AppenderRef ref="databaseAppender" />
</AsyncLogger>
<Logger name="syncDB" level="trace" includeLocation="false" additivity="false">
<AppenderRef ref="databaseAppender" />
</Logger>
<AsyncLogger name="asyncDBasyncFile" level="trace" includeLocation="false" additivity="false">
<AppenderRef ref="databaseAppender" />
<AppenderRef ref="randomAccessFile"></AppenderRef>
</AsyncLogger>
<Logger name="syncDBsyncFile" level="trace" includeLocation="false" additivity="false">
<AppenderRef ref="databaseAppender" />
<AppenderRef ref="randomAccessFile"></AppenderRef>
</Logger>
<Root level="info" includeLocation="false">
<AppenderRef ref="console" />
</Root>
</Loggers>
</Configuration>
Поскольку есть несколько регистраторов, которые я уже определил для синхронизации / асинхронного файла / записи в журнал БД.Проблема, с которой я сталкиваюсь здесь, когда я хочу использовать какой-либо из регистраторов, я не могу определить для них имя.
LogManager.getLogger("asyncDB") -- will give me logger with name asyncDB
Однако, согласно соглашению, создание регистраторов с именем класса будет проще, так какотладка, если вы пишете% logger в выходных данных журнала.
LogManager.getLogger(MyClass.class)
Мое требование просит меня создать регистратор с именем класса, однако он должен быть асинхронным или синхронным в зависимости от требований пользователей.
У меня естьсоздал небольшое имя класса LogProvider, имеющее метод registerFor, который снова имеет аргументы типа AppendersType.Ниже приведен код.
public class LogProvider {
public static Logger registerFor(AppendersType type) {
switch (type) {
case DATABASE_ASYNC:
return LogManager.getLogger("asyncDB");
case DATABASE_SYNC:
return LogManager.getLogger("syncDB");
case FILE_ASYNC:
return LogManager.getLogger("asyncFile");
case FILE_SYNC:
return LogManager.getLogger("syncFile");
case FILE_DATABASE_SYNC:
return LogManager.getLogger("syncDBsyncFile");
case FILE_DATABASE_ASYNC:
return LogManager.getLogger("asyncDBasyncFile");
default:
break;
}
return null;
}
Я хочу использовать asyncLoggers, но иметь имя класса, а не имя, определенное в файле XML.