Bilal Ahmed Yaseen
Bilal Ahmed Yaseen

Reputation: 2654

Avoiding Multiple Logging of Same Message Due to Default behaviour in Log4j

I am working in Grails application and want to log messages in different files. I want to log exceptions, normal and API logs in different files. But according to Log4j general roles, If we set logger level to 'Info' then warn and error messages will also start logging in this file while I want to log error messages in different file. So, thus my error messages will be logged twicely in error file and in info file too. While I want that 'info' logger log just 'info' level messages not 'error' level messages too. And 'error' logger just log error messages.

Below is my Log4j Configuration:

log4j = {
def layoutPattern = new PatternLayout("[%d{ISO8601}] %m \r\n")
def dailyRollingInfoFile = new DailyRollingFileAppender(
        name:"rollingInfoFileAppender",
        layout: layoutPattern,
        //Path of the Log File
        fileName:"C:\\MS-Logs\\Application\\MSLogs.log",
        datePattern: "'.'dd-MM-yyyy")

def dailyRollingExceptionFile = new DailyRollingFileAppender(
        name:"rollingExceptionFileAppender",
        layout: layoutPattern,
        //Path of the Log File
        fileName:"C:\\MS-Logs\\Exceptions\\ExceptionLogs.log",
        datePattern: "'.'dd-MM-yyyy")

def dailyRollingExceptionAPIFile = new DailyRollingFileAppender(
        name:"rollingAPIFileAppender",
        layout: layoutPattern,
        //Path of the Log File
        fileName:"C:\\MS-Logs\\API\\MS-NotificationsLogs.log",
        datePattern: "'.'dd-MM-yyyy")

 //For logging exceptions stack trace
appenders {
    appender dailyRollingInfoFile
    appender dailyRollingExceptionFile
    appender dailyRollingExceptionAPIFile
   }

root {
    info  'rollingInfoFileAppender', additivity: false
    debug 'rollingAPIFileAppender', additivity: false
    error 'rollingExceptionFileAppender'
}
}

And Now, this is how I add filters:

dailyRollingExceptionFile.addFilter(new org.apache.log4j.varia.LevelMatchFilter(levelToMatch:'ERROR', acceptOnMatch: true))
dailyRollingExceptionFile.addFilter(new org.apache.log4j.varia.DenyAllFilter())

//To make it sure that It will just Log, Messages by Info Logger
dailyRollingInfoFile.addFilter(new org.apache.log4j.varia.LevelMatchFilter(levelToMatch:'INFO', acceptOnMatch: true))
dailyRollingInfoFile.addFilter(new org.apache.log4j.varia.DenyAllFilter())

//To make it sure that It will just Log, Messages by API Logger
dailyRollingAPIFile.addFilter(new org.apache.log4j.varia.LevelMatchFilter(levelToMatch:'DEBUG', acceptOnMatch: true))
dailyRollingAPIFile.addFilter(new org.apache.log4j.varia.DenyAllFilter())

How, It may be possible to avoid same message being logged twicely in different files ? How can we log messages in different files without being repeating it in other file ?

Thanks for your Time :)

Upvotes: 0

Views: 1108

Answers (1)

Andrew
Andrew

Reputation: 2249

I believe Log4j's LevelMatchFilter allows you to do what you're after:

def dailyRollingInfoFile = new DailyRollingFileAppender(...)
dailyRollingInfoFile.addFilter(new org.apache.log4j.varia.LevelMatchFilter(levelToMatch:'INFO', acceptOnMatch: true))
dailyRollingInfoFile.addFilter(new org.apache.log4j.varia.DenyAllFilter())

The DenyAllFilter drops the messages that the LevelMatchFilter does not match (ie. everything other than level INFO)

Upvotes: 1

Related Questions