Логгирование с использоваем cxgroovy

Системные свойства

Скрипт logging.groovy

// функция listen (String ... name, Closure logConf) - указывает имя логгера(ов) к которым присоединяется обработчик
// переменная root = "" - предопредела
listen(root){

    // функция level( Level|String name ) - указывает уровень логирования
    // fine,finer,finest,all,info,off,warning,severe,config - предопределенные уровни логирования
    level fine

    // функция publish( Closure pubFn ) - добавляет к обработчику процедуру публикации записи
    publish { rec -> println "$rec.message" }

    // функция filter( Closure fltrFn ) - устанавливает фильтр для записией
    filter { rec -> true }

    // функция write( Closure writeConf ) - добавляет к обработчику запись в файлы/т.д
    write {
        // функция xml( filePattern ) - указывает шаблон имени файла куда будут записываться сообщения лога
        xml("logtest1.xml"){
            // так же можно указать фильтр
           filter { rec -> true }
        }

        // а можно просто указать файл xml
        xml "logtest1.xml"
    }
}

// здесь можно задать настройки логгеров
level {
    // сначала указываем уровень логирования (fine,finer,finest,all,info,off,warning,severe,config)
    // потом имя логгера
    finer xyz.cofe.cxconsole.groovy.log.TestLog1

    // имя логгера можно указать в виде строки
    // а так же приципить фильтр и другие настройки
    finer 'xyz.cofe.cxconsole.groovy.log.TestLog2' filter { rec -> true } parent true
}

Описание структуры скрипта

Скрипт подразумевает из себя вызов функций (Closure) с передачей функций в качестве параметров (функциональное программирование)

listen()

Создает Handler и прикрепляет к указанному логгеру

Синтаксис

listen(String|Class name, Closure listenFn)
listen(Iterable<String|Class> name, Closure listenFn)

Тело

listenFn = {
    // Указывает уровень логгирования
    // синтаксис:
    level(String|java.util.logging.Level level)

    // Пример
    level 'all'

    // Пример с предопределлеными переменными
    // Предопределенны переменные: fine,finer,finest,all,info,off,warning,severe,config
    level fine

    // Указывает фильтр
    // синтаксис:
    filter(Closure filter)

    // Пример с регулярным выражением
    filter { rec -> rec.loggerName ==~ /(?is)com\.app.+\./ }

    // Указывает цепочку фильтров
    // синтаксис:
    filters(Closure filterChainFn)

    // Добавляет функцию публикации сообщения
    // синтаксис:
    publish(Closure publishFn)

    // Пример
    publish { rec -> println "$rec.message" }

    // Добавляет функцию записи накопленных сообщений на диск/сеть/т.д...
    // синтаксис:
    flush(Closure flushFn)

    // Пример
    flush { /* запись данных */ }

    // Добавляет функцию закрытия обработчика
    // синтаксис:
    close(Closure closeFn)

    // Пример
    close { /* закрытие файла/бд/... */ }

    // Куда писать сообщения
    // синтаксис:
    write(Closure writeFn)
}

level()

Указывает уровень сообщений логгера

Синтаксис

level(Closure levelFn)

Тело

levelFn = {
    // логировать все сообщения
    // синтаксис:
    LoggerConf all(Class|String logger)

    // логировать сообщения уровня FINEST
    // синтаксис:
    LoggerConf finest(Class|String logger)

    // логировать сообщения уровня FINER
    // синтаксис:
    LoggerConf finer(Class|String logger)

    // логировать сообщения уровня FINER
    // синтаксис:
    LoggerConf fine(Class|String logger)

    // логировать сообщения уровня CONFIG
    // синтаксис:
    LoggerConf config(Class|String logger)

    // логировать сообщения уровня INFO
    // синтаксис:
    LoggerConf info(Class|String logger)

    // логировать сообщения уровня WARNING
    // синтаксис:
    LoggerConf warning(Class|String logger)

    // логировать сообщения уровня SEVERE
    // синтаксис:
    LoggerConf severe(Class|String logger)

    // не логировать сообщения
    // синтаксис:
    LoggerConf off(Class|String logger)
}

publish()

Добвляет к обработчику функцию публикации сообщения

Синтаксис

publish(Closure publishFn)

Тело

publishFn = { LogRecordExt rec ->
}

Класс LogRecordExt

class LogRecordExt extends java.util.logging.LogRecord {
    // методы LogRecordExt
    // Возвращает строку сообщения вместе с параметрами
    public String getText(){ ... }

    // Возвращает дату из свойства millis
    public Date getDate(){ ... }

    // Возвращает строку с датой из свойства millis
    public String time(String format, Locale loc){ ... }

    // Возвращает строку с датой из свойства millis
    public String time(String format){ ... }

    // Возвращает строку с датой из свойства millis
    public String getTime(){ ... }

    // методы из java.util.logging.LogRecord
    // уровень сообщения
    Level getLevel()

    // Имя логгера
    String getLoggerName()

    // текст сообщения без параметров
    String getMessage()

    // Время кода произошла сообщение
    long getMillis()

    // Параметры сообщения
    Object[] getParameters()

    ResourceBundle getResourceBundle()
    String getResourceBundleName()

    // Последовательный номер сообщения
    long getSequenceNumber()

    // Исходный класс
    String getSourceClassName()

    // Исходный метод
    String getSourceMethodName()

    // Ид потока/треда
    int getThreadID()

    // Ошибка
    Throwable getThrown()
}

filters()

Указывает цепочку фильтров

Синтаксис

filters(Closure filterChainFn)

Тело

filterChainFn = {
    // Добавляет фильтр в список
    // если фильтр вернут true, то сообщение будет опубликованно
    include( Closure filter )

    // Добавляет фильтр для исключения совпавшего с указанным условием
    // если фильтр вернут true, то сообщение Не будет опубликованно
    exclude( Closure filter )

    // Добавляет фильтр в список
    include( Map opts=[logger:String|Pattern, message:String|Pattern] )

    // Пример с использоваем маски в имени логгера и тексте
    // если указаны logger и message, то проверются оба с использоваем операции AND
    include logger:'com.app1.wildcard.*', message: 'text*message*'

    // Добавляет фильтр для исключения совпавшего с указанным условием
    exclude( Map opts=[logger:String|Pattern, message:String|Pattern] )

    // Фильтры проверяются в последовательности вызовов соответ функций
    // Пример
    include { rec -> rec.loggerName ==~ /(?is)com\.app.+\./ } // сообщение из пакета com.app* будет опубликовано
    exclude { rec -> rec.loggerName ==~ /(?is)info\.app.+\./ } // а из info.app* не будет
    include all // будут опобуликованы все остальные сообщения
    // либо последним можно поставить так
    exclude all // тогда все остальные не будут опуликованы
}

LoggerConf

Класс LoggerConf

class LoggerConf {
    // ...

    // Указыавет уровень логирования
    LoggerConf level( Level level )
    LoggerConf level( String levelName )

    // Укажите, должен ли этот логгер/регистратор отправлять свой вывод своему родительскому Logger-у.
    // Это означает, что любые LogRecords также будут записываться в обработчики родителя
    // и потенциально к его родительскому объекту рекурсивно вверх по пространству имен.
    LoggerConf parent(boolean useParentHandlers)

    // Устанавливает родительский элемент для этого регистратора.
    // Этот метод используется LogManager для обновления регистратора при изменении пространства имен.
    // Его не следует вызывать из кода приложения.
    LoggerConf parent(Logger lgr)

    // Устанавливает фильтр для управления выходом на этом Logger.
    // После прохождения начальной проверки уровня, Logger вызовет этот фильтр,
    // чтобы проверить, действительно ли должна быть опубликована запись журнала.
    // синтаксис:
    filter(Closure filter)

    // Пример с регулярным выражением
    filter { rec -> rec.loggerName ==~ /(?is)com\.app.+\./ }

    // Указывает цепочку фильтров
    // синтаксис:
    filters(Closure filterChainFn)

    // ...
}

write()

Указывает вывод в файл/другие пункты назначения

Синтаксис

write(Closure writeFn)

Тело

writeFn = {
    // Вывод в xml
    // Синтаксис
    xml(Map opts, String xmlFile, Closure xmlFn)
    xml(Map opts, String xmlFile)
    xml(String xmlFile, Closure xmlFn)
    xml(String xmlFile)

    // xmlFile - шаблон имени файла
    // "/" - разделить имен файлов/каталогов
    // "%t" - системный временный каталог
    // "%h" - домашний каталог пользователя
    // "%g" - номер покаления, чтоб отличать ротируемые логи
    // "%u" - уникальный номер для разрешения конфликтов
    // "%%" - транслиует в %

    // где opts - карта опциальнаых параметров
    // уровень логирования, по умолчанию all
    opts.level : String|Level

    // кодировка файла, по умолчанию utf-8
    opts.charset : String
    opts.encoding : String

    // Ограничение на размер файла
    limit : int

    // Ограничение на кол-во файлов
    count : int

    // Добавлять к существующему файлу
    append : boolean

    // Примеры
    xml "app.log"
    xml "app2.log", charset: 'utf-8', level: finer, append: false, count: 10, limit: (1024*1024*16)
}

xmlFn = { HandlerConf ->
    // Указывает уровень логгирования
    // синтаксис:
    level(String|java.util.logging.Level level)

    // Пример
    level 'all'

    // Пример с предопределлеными переменными
    // Предопределенны переменные: fine,finer,finest,all,info,off,warning,severe,config
    level fine

    // Указывает фильтр
    // синтаксис:
    filter(Closure filter)

    // Пример с регулярным выражением
    filter { rec -> rec.loggerName ==~ /(?is)com\.app.+\./ }

    // Указывает цепочку фильтров
    // синтаксис:
    filters(Closure filterChainFn)
}