2013-08-26 2 views
1

Ниже приведена моя конфигурация регистрации. Он регистрирует именно то, что я хочу, но он записывает его только в файл. Я хотел бы видеть ту же информацию на консоли. Я попробовал несколько вариантов, но с каждой вариацией я могу получить информацию только в консоли или файле, а не в обоих.Использование нескольких регистраторов в одном приложении

def appName = grails.util.Metadata.current.'app.name' 
    def catalinaBase = System.properties.getProperty('catalina.base') 
    catalinaBase = catalinaBase ?: "." 
    def logDirectory = "${catalinaBase}${File.separator}logs${File.separator}${appName}" 

    // log4j configuration 
    log4j = { 
     appenders { 
      rollingFile name: 'stdout',  file: "${logDirectory}${File.separator}${appName}.log".toString(), maxFileSize: '100MB' // Use the same file for stdout and stacktrace 
      rollingFile name: 'stacktrace', file: "${logDirectory}${File.separator}${appName}.log".toString(), maxFileSize: '100MB' // Use the same file for stdout and stacktrace 
     } 

     warn 'org.codehaus.groovy.grails.web.servlet',  // controllers 
       'org.codehaus.groovy.grails.web.pages',   // GSP 
       'org.codehaus.groovy.grails.web.sitemesh',  // layouts 
       'org.codehaus.groovy.grails.web.mapping.filter', // URL mapping 
       'org.codehaus.groovy.grails.web.mapping',  // URL mapping 
       'org.codehaus.groovy.grails.commons',   // core/classloading 
       'org.codehaus.groovy.grails.plugins',   // plugins 
       'org.codehaus.groovy.grails.orm.hibernate',  // hibernate integration 
       'org.springframework', 
       'org.hibernate', 
       'net.sf.ehcache.hibernate' 

     all 'grails.app.controllers.test', 
       'grails.app.domain.test', 
       'grails.app.services.test', 
       'grails.app.taglib.test', 
       'grails.app.conf.test', 
       'grails.app.filters.test' 
    } 

ответ

2

Во-первых, наличие двух разных приложений, которые регистрируются в одном файле, является плохой идеей, если вы хотите, чтобы полные стеки стека переместились в то же место, что и в обычных журналах, вы должны повторно указать объекты на logger. чем appender уровень.

Для вашей реальной проблемы я бы создал консольный appender и один файл appender и привязал их как к корневому регистратору.

log4j = { 
    appenders { 
    console name:'stdout' 
    rollingFile name: 'applog',  file: "${logDirectory}${File.separator}${appName}.log".toString(), maxFileSize: '100MB' 
    'null' name:'stacktrace' // prevent Grails trying to create stacktrace.log 
    } 

    root { 
    warn 'stdout', 'applog' 
    } 

    // Send full stack traces to the main appName.log file 
    warn applog:'StackTrace' 

    // individual warn/all logger configurations as before 
} 

Это будет посылать те же журналы на стандартный вывод и в лог-файл, но будет посылать только полные следы стека в файл (не на консоли). Если вы действительно хотите полный стек следы на консоли тоже измените его на

warn applog:'StackTrace', stdout:'StackTrace' 

В качестве альтернативы, вы можете отключить функцию регистратора StackTrace вообще (удалить всю warn applog:'StackTrace' линии), а затем и отключение стека фильтрации трассировки путем установки системное свойство grails.full.stacktrace - true, чтобы получить полные нефильтрованные трассировки стека, записанные обычными регистраторами.

+0

Спасибо! Я думаю, что это получает. Мне любопытно, однако, почему это плохо, чтобы иметь два приложения для входа в тот же файл? Нет ли шансов на блокировку? Мне легче отлаживать stacktrace, когда он находится в том же контексте, что и информация из журнала приложений. – ubiquibacon

+0

@ubiquibacon Вы _might_ уходите с этим (я не уверен) для простого FileAppender, но для скользящего файла я буду беспокоиться о том, что произойдет, если оба приложения попытаются одновременно скопировать файл журнала (или, что еще хуже , в несколько разное время - appender 1 переименовывает app.log в app.log.1 и открывает новый app.log, appender 2 затем переименовывает этот новый app.log в app.log.1, и вы потеряли исходный файл журнала). –

+0

Теперь я вижу, что по умолчанию кажется, что в 'stdout' включен частичный стек. Это на самом деле все, что я хотел, поэтому мне не нужно объединять полный стек в журнал приложений, чтобы получить то, что я хочу. Спасибо, что помог мне на правильном пути. – ubiquibacon

0

С вашей конфигурации выше, для exmaple, чтобы иметь все «grails.app» события INFO на уровне входа в консоль и ваш «стандартный вывод» Appender, вы хотите что-то вроде следующего:

log4j = { 
    appenders { 
    ... appender configuration here ... 
    } 
    // configure a root logger 
    root { 
    warn 'stdout' 
    additivity = false 
    } 

    info stdout:'grails.app' 
    info console:'grails.app' 

} 
+0

Вы хотите представить пример? Я прочитал документы, и я не понимаю, как это поможет. Я хочу использовать несколько регистраторов в одном приложении. [Grazing Logging Excerpt] (http://grails.org/doc/latest/guide/conf.html#3.1.2%20Logging): *** Аддитивность просто определяет, наследует ли регистратор конфигурацию от своего родителя. *** – ubiquibacon

Смежные вопросы