java.util.logging.config.class = xyz.cofe.cxconsole.groovy.log.LogStart/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) с передачей функций в качестве параметров (функциональное программирование)
Создает 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(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(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(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
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(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)
}