создание асинхронных и синхронизирующих регистраторов при условии в log4j2 - PullRequest
0 голосов
/ 27 мая 2018

Мой 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.

...