Debug statements aren't showing src/groovy classes - grails

I have the following in my config.groovy
// default for all environments
log4j = { root ->
appenders {
rollingFile name:'stacktrace', file:"${logDirectory}/app_stack.log".toString(), maxFileSize:'100KB'
}
error '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'
debug 'com.my.code'
root.level = org.apache.log4j.Level.INFO
}
I get debug statements printed to the logs for all classes except for my groovy files placed in package com.my.code I don't get the debug statements printed. Only the info statements are being printed to the log.
Here is an example for one of the groovy classes in src/groovy
#Log4j
class SomeTest {
def someMethod() {
log.info("This will print")
log.debug("This will not print")
println log.isDebugEnabled() //prints false
print log.isInfoEnabled() //prints true
}
}
Question
How can I turn on debugging for all class under package com.my.code ? I'm on grails 2.3.5. When I change root.level to org.apache.log4j.Level.DEBUG then the debug statements do show up but that turns on DEBUG for ALL other classes as well

Here's a configuration that will log all code in packages com.my.code at the DEBUG level, and all other packages at the ERROR level.
The logs will be sent to the console and a file named appLog.txt.
log4j = {
appenders {
def logPattern = '%d{dd-MM-yyyy HH:mm:ss,SSS} %5p %c{2} - %m%n'
console name: 'consoleAppender', layout: pattern(conversionPattern: logPattern)
file name: "fileAppender", file: "appLog.txt"
}
root {
// define the root logger's level and appenders, these will be inherited by all other loggers
error 'consoleAppender', 'fileAppender'
}
def appNamespaces = [
'com.my.code',
'grails.app.conf.com.my.code',
'grails.app.filters.com.my.code',
'grails.app.taglib.com.my.code',
'grails.app.services.com.my.code',
'grails.app.controllers.com.my.code',
'grails.app.domain.com.my.code'
]
appNamespaces.each { debug it }
}

In grails 2.x apps I used next format (with regards to your config):
debug rollingFile 'com.my.code'
Furthermore, if you need to set different log level for a bunch of packages:
debug rollingFile: ['com.example','com.otherpackage']

Related

grails does not write to log file

I have the following in my grails config log4j section:
appenders {
file name: "usageAppender", file: "${logDirectory}/onetract3.log"
}
root { error 'stdout', 'usageAppender' }
info usageAppender: "grails.app.services.com.onetract.onetract.UserService"
The file "onetract3.log" is successfully created, however nothing is written to this file.
I can see in the console that the info is handled correctly.
2014-03-09 20:09:06,912 [http-bio-8080-exec-5] INFO onetract.UserService - New candidateRelations for: com.onetract.onetract.Person : 18
Grails version is 2.3.5
Any ideas on why this isn't getting written to the log file?
Edit: 10.03.1014, set additivity to false.
info additivity: false
usageAppender: "grails.app.services.com.onetract.onetract.UserService"
use this
// Example of changing the log pattern for the default console appender:
//
//appenders {
// console name:'stdout', layout:pattern(conversionPattern: '%c{2} %m%n')
//}
appenders {
rollingFile name:'myLogFile',
file:'log/myLogFile.log',
threshold: org.apache.log4j.Level.ALL,
maxFileSize:10485760
}
root {
error 'myLogFile'
additivity = true
}
info "grails.app","com.test"
warn "grails.app","com.test"
debug "grails.app","com.test"
error "grails.app","com.test"
fatal "grails.app","com.test"
trace "grails.app","com.test"
error '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'
The problem was due to the following entry:
file: "${logDirectory}/onetract3.log"
Before the application is running, this works, afterwards not.
The workaround is to explicitly tell the appender where the file is, i.e.
file: "logs/onetract/onetract3.log"
This then works.

Grails logging not working

I'm developing a grails 2.3.4 application and had some logging problems.
Actually, I couldn't configure any logging at all (accordingly to http://grails.org/doc/latest/guide/conf.html#logging) - had no output result.
After some brainstorming I figured out, that the grails documentation configs are not working for my project. Nevertheless, some configs variation worked fine (I saw the result on my screen):
log4j = {
appenders {
console name:'stdout', layout:pattern(conversionPattern: '%c{2} %m%n')
}
root {
error 'stdout'
additivity = true
}
error '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'
debug stdout: ['edu.dm']
}
The configs like:
debug stdout: ['grails.app.services', 'grails.app.services.edu']
debug stdout: ['grails.app.controllers', 'grails.app.controllers.edu']
failed.
I would be extremely thankful, if anyone could explain my mistakes or share a link with an explanation.
The whole project can be found here: https://github.com/AlexDavljatov/EduDM/tree/master/LoggingMiniProject
Many thanks in advance.
Kind regards,
Alexander Davliatov.
Start like this:
log4j = {
root {
debug()
}
}
You should get a lot of logging to your console. Then (if that works), try this:
log4j = {
info "grails.app"
}
Among the output you should see log.info from your controllers and services. Then slowly add to the config.
Don't forget to restart between the changes in Config.groovy.
This configuration works in Grails 2.3.5 project
// log4j configuration
log4j = {
appenders {
// Use if we want to prevent creation of a stacktrace.log file.
'null' name:'stacktrace'
// Use this if we want to modify the default appender called 'stdout'.
console name:'stdout', layout:pattern(conversionPattern: '%d{yyyy-MM-dd HH:mm} -%x- %-5p-%-10c:%m%n')
// Custom log file.
/* rollingFile name:"appLog",
file:"${globalDirs.logDirectory}${appName}.log".toString(),
maxFileSize:'300kB',
maxBackupIndex:1,
layout:pattern(conversionPattern: '%d{[EEE, dd-MMM-yyyy # HH:mm:ss.SSS]} [%t] %-5p %c %x - %m%n')*/
}
// This is for the built-in stuff and from the default Grails-1.2.1 config.
error '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'
warn 'org.mortbay.log' // Jetty
error 'grails.app' // Set the default log level for our app code.
// Move anything that should behave differently into this section.
switch(Environment.current) {
case Environment.DEVELOPMENT:
// Configure the root logger to output to stdout and appLog appenders.
root {
error 'stdout'
//,'appLog'
additivity = true
}
error 'grails.plugin.springsecurity.web.filter.DebugFilter'
error "grails.plugins.twitterbootstrap"
debug "it.mypackage"
debug "org.hibernate.SQL"
debug 'grails.app.controllers'
debug 'grails.app.services'
debug 'grails.app.taglib'
debug 'grails.app.conf'
debug 'grails.app.jobs'
break
case Environment.TEST:
// Configure the root logger to only output to appLog appender.
root {
error 'stdout'
//,'appLog'
additivity = true
}
//depend how much code write in console
// debug 'grails.app.controllers'
// debug 'grails.app.domain'
// debug 'grails.app.services'
// debug 'grails.app.taglib'
// debug 'grails.app.conf'
// debug 'grails.app.filters'
break
case Environment.PRODUCTION:
// Configure the root logger to output to stdout and appLog appenders.
root {
error 'stdout'
//,'appLog'
additivity = true
}
error 'grails.app'
break
}
}
For your grails version (2.3.4 http://grails.github.io/grails-doc/2.3.4/guide/conf.html#logging) it seems the problem is you inherit the configuration level from the root.
To avoid this you need to specify additivity: false
log4j = {
...
debug additivity: false, stdout: ['grails.app.services', 'grails.app.services.edu', 'grails.app.controllers', 'grails.app.controllers.edu']
...
}

Grails service logging does not initialize

The only way I can get the logging to work in my service is to add this to my service:
class MyService {
def log = LogFactory.getLog(getClass())
...
My log4j settings in Config.groovy:
log4j = {
PatternLayout patternLayout = new PatternLayout("%d [%t] %-5p %c %x - %m%n")
debug 'grails.app.controllers',
'grails.app.controller',
'grails.app.domain',
'grails.app.service',
'grails.app.filters',
'com.mycompany'
// 'org.springframework.security'
'org.hibernate.SQL'
error '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'
appenders {
appender new org.apache.log4j.ConsoleAppender(name: "console",
threshold: org.apache.log4j.Level.DEBUG,
layout: patternLayout
)
}
root {
error 'stdout'
additivity = true
}
}
I would have thought the logging would work in a service without having to add def log... at the top.
grails.app.service should be grails.app.services. This changed in version 2.0.
You can easily find out the logger name in an artifact by adding
println log.name
to a test method and calling it.

Prevent specific exceptions loggin in Grails

In grails I want to stop logging some specific exceptions occouring in my controllers.
I have managed this exception with urlmapping to render a custome warning page
Es my url mapping
"500"(controller:'error', action:'excOne', exception: MyExceptionOne)
"500"(controller:'error', action:'excTwo', exception: MyExceptionTwo)
But this exceptions continued to be logged by log4j. How I can exclude them from logging?
This is my log4j config:
log4j = {
error '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.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',
'grails.app.services.org.grails.plugin.resource',
'grails.app.taglib.org.grails.plugin.resource',
'grails.app.resourceMappers.org.grails.plugin.resource',
'grails.app.services.NavigationService'
warn 'org.mortbay.log'
debug "com.myproject.*"
debug "grails.app"
debug "com.myproject.*"
appenders {
console name:'stdout', layout:pattern(conversionPattern: '[%r] %c{2} %m%n')
}
root {
error 'stdout'
warn 'stdout'
additivity = true
}
}
I have not managed to remove all mentions of the exception in the log, but what I have done is I prevented the stack trace from cluttering up the logs:
Create a StackTracePrinter implementation that behaves the way you want.
package com.myStuff
import org.codehaus.groovy.grails.exceptions.DefaultStackTracePrinter
class MyStackTracePrinter extends DefaultStackTracePrinter {
String prettyPrint(Throwable throwable) {
if (throwable instanceof MyException) return "<stack trace suppressed>"
return super.prettyPrint(throwable)
}
}
Then, in Config.groovy:
grails.logging.stackTracePrinterClass = 'com.myStuff.MyStackTracePrinter'
Try:
off "your.class.file"
After the line of code:
debug "com.myproject.*"
Just make sure you provide correct path of your class, let me know the class file path if this doesn't work?

Grails not printing messages to log file using custom appender

My Grails application is going to mirgate an existing database to a new database. I got some unformatted email addresses from the existing database which do not pass validation with my Grails application because of a constraint (email:true), so I get a field error.
I want write these field errors in a log file. How can I do that? I tried a Appender in log4J. It will somehow create a log file so-call "migration.log", but it does not write any field error into this log file.
log4j = {
// Example of changing the log pattern for the default console
// appender:
//
appenders {
// console name:'stdout', layout:pattern(conversionPattern: '%c{2} %m%n')
appender new FileAppender(
name: "migrationAppender",file : "migration.log", layout: pattern(conversionPattern: "%c{2} %m%n")
)
}
This is configration. I define a FileAppender.
In my service. I just call the following:
def foundation = new Foundation(name: name, foundationName: foundationName).addToAddresses(address).addToCommunicationMedia(email)
foundation.validate()
if (!foundation.hasErrors()) {
foundation.save(flush: true)
}
else {
log.error "${foundation.errors}"
}
In the console, the errors occur and I saw a "migration.log" has been created, but somehow the file in empty.
Error 2011-09-26 09:00:29,543 [main] ERROR service.MasterDataMigrationService - org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'de.rvgmbh.nemesis.migration.domain.partner.participant.IndividualPerson' on field 'communicationMedia[0].address': rejected value [erbelrechtsanwalt-eberl.de];
log4j = {
appenders {
rollingFile name:"file", maxFileSize:(1024*1024), file:"migration.log", maxBackupIndex:10
environments {
development {
console name:'stdout'
}
}
}
error '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'
warn 'org.mortbay.log'
environments {
development {
root {
info 'file', 'stdout'
}
debug 'grails.app'
}//development
test {
root {
info 'file'
}
info 'grails.app'
}
production {
root {
info 'file'
}
info 'grails.app'
}
}
}
dev: logs to console and file from debug level
test: logs to file from info level
prod: logs to file from info level

Resources