1

I tried with all the possibilities. My log4j2.properties configuration not resulting properly.

I'm trying to create different files for info, error and debug. At last the files are created. But, no log is logged in to it. I spent whole day for this. Please help.

name=PropertiesConfig
property.filename = c:\\logs
appenders = console, file, debug

appender.console.type = Console
appender.console.name = consoleLogger
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n

appender.file.type = RollingFile
appender.file.name = RollingFile
appender.file.level = info
appender.file.fileName = ${filename}/info.log
appender.file.filePattern = ${filename}.%d{yyyy-MM-dd}
appender.file.layout.type = PatternLayout
appender.file.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %c{1} [%p] %m%n
appender.file.policies.type = Policies
appender.file.policies.time.type = TimeBasedTriggeringPolicy
appender.file.policies.time.interval = 1

appender.debug.type = RollingFile
appender.debug.name = RollingFile
appender.debug.level = debug
appender.debug.fileName = ${filename}/debug.log
appender.debug.filePattern = ${filename}.%d{yyyy-MM-dd}
appender.debug.layout.type = PatternLayout
appender.debug.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %c{1} [%p] %m%n
appender.debug.policies.type = Policies
appender.debug.policies.time.type = TimeBasedTriggeringPolicy
appender.debug.policies.time.interval = 1

loggers = file,debug

logger.file.name = infoLogger
logger.file.level = info
logger.file.appenderRefs = RollingFile
logger.file.additivity = true
logger.file.appenderRef.rolling.ref = RollingFile

logger.debug.name = debugLogger
logger.debug.level = debug
logger.debug.appenderRefs = RollingFile
logger.debug.additivity = false
logger.debug.appenderRef.rolling.ref = RollingFile

rootLogger.level = INFO
rootLogger.appenderRefs = console, file, debug
rootLogger.appenderRef.stdout.ref = INFO
Raedwald
  • 46,613
  • 43
  • 151
  • 237
Shakthi
  • 826
  • 3
  • 15
  • 33
  • Possible duplicate of https://stackoverflow.com/questions/728295/creating-multiple-log-files-of-different-content-with-log4j – Raedwald Feb 14 '18 at 06:26

2 Answers2

1

Finally I got it worked. The below example will create individual file for error, debug and all the log will be printed in the log file under d:\logs directory

pom.xml

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.9.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.9.1</version>
</dependency>
<dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
    <version>3.3.6</version>
</dependency>

and the property file configuration is...

log4j2.properties

name=PropertiesConfig
#output folder
property.filename = d:\\logs
appenders = console, debugLoggerAppender, commonLoggerAppender, errorLoggerAppender

appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

#common appender
appender.commonLoggerAppender.type = File
appender.commonLoggerAppender.name = RollingFile
appender.commonLoggerAppender.fileName=${filename}/log.log
appender.commonLoggerAppender.layout.type=PatternLayout
appender.commonLoggerAppender.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

#error appender
appender.errorLoggerAppender.type = RandomAccessFile
appender.errorLoggerAppender.name = RandomAccessFile
appender.errorLoggerAppender.fileName=${filename}/error.log
appender.errorLoggerAppender.layout.type=PatternLayout
appender.errorLoggerAppender.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
#using LevelRangeFilter to only log error levels.
appender.errorLoggerAppender.filter.threshold.type = LevelRangeFilter
appender.errorLoggerAppender.filter.threshold.minLevel = error
appender.errorLoggerAppender.filter.threshold.maxLevel = error

#debug appender
appender.debugLoggerAppender.type = File
appender.debugLoggerAppender.name = LOGFILE
appender.debugLoggerAppender.fileName=${filename}/debug.log
appender.debugLoggerAppender.layout.type=PatternLayout
appender.debugLoggerAppender.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
#using LevelRangeFilter to only log debug levels.
appender.debugLoggerAppender.filter.threshold.type = LevelRangeFilter
appender.debugLoggerAppender.filter.threshold.minLevel = debug
appender.debugLoggerAppender.filter.threshold.maxLevel = debug



# creating only one logger, we can use this with multiple appenders.
loggers=fileLogger
# this is package name. This package and all of it's child packages will use this logger
logger.fileLogger.name=com.fis.bsa
# logger base level
logger.fileLogger.level = debug
logger.fileLogger.appenderRefs = debugLoggerAppender,commonLoggerAppender, errorLoggerAppender
logger.fileLogger.appenderRef.debugLoggerAppender.ref = LOGFILE
logger.fileLogger.appenderRef.commonLoggerAppender.ref = RollingFile
logger.fileLogger.appenderRef.errorLoggerAppender.ref = RandomAccessFile

rootLogger.level = info
#rootLogger.appenderRefs = stdout
rootLogger.appenderRef.stdout.ref = STDOUT

Below property should be set to use AsyncLogger

System.setProperty("-DLog4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
Shakthi
  • 826
  • 3
  • 15
  • 33
0

If I understand You correctly, You want to create a log file for only one log level. This can be little tricky to achieve(but can be done as explained below), because log levels are defined as minimum levels.

For example; when you set a log level for debug, this logger can log debug and above levels(info, warn, error,fatal). So we should somehow disable logging for other levels. To log only debug level I used LevelRangeFilter. With this property we can define level range for the appender. The configuration can be done like below. (I only add info and debug levels but you can add others levels if you want to)

https://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/filter/LevelRangeFilter.html

name=PropertiesConfig
#output folder
property.filename = c:\\Testlogs
appenders = console, debugLoggerAppender, infoLoggerAppender

appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n

#debug appender
appender.debugLoggerAppender.type = File
appender.debugLoggerAppender.name = DEBUGLOGFILE
appender.debugLoggerAppender.fileName=${filename}/debug.log
appender.debugLoggerAppender.layout.type=PatternLayout
appender.debugLoggerAppender.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
#using LevelRangeFilter to only log debug levels.
appender.debugLoggerAppender.filter.threshold.type = LevelRangeFilter
appender.debugLoggerAppender.filter.threshold.minLevel = debug
appender.debugLoggerAppender.filter.threshold.maxLevel = debug

#info appender
appender.infoLoggerAppender.type = File
appender.infoLoggerAppender.name = INFOLOGFILE
appender.infoLoggerAppender.fileName=${filename}/info.log
appender.infoLoggerAppender.layout.type=PatternLayout
appender.infoLoggerAppender.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
#using LevelRangeFilter to only log info levels.
appender.infoLoggerAppender.filter.threshold.type = LevelRangeFilter
appender.infoLoggerAppender.filter.threshold.minLevel = info
appender.infoLoggerAppender.filter.threshold.maxLevel = info

# creating only one logger, we can use this with multiple appenders.
loggers=fileLogger
# this is package name. This package and all of it's child packages will use this logger
logger.fileLogger.name=log.test
# logger base level
logger.fileLogger.level = debug
logger.fileLogger.appenderRefs = debugLoggerAppender,infoLoggerAppender
logger.fileLogger.appenderRef.debugLoggerAppender.ref = DEBUGLOGFILE
logger.fileLogger.appenderRef.infoLoggerAppender.ref = INFOLOGFILE

rootLogger.level = debug
rootLogger.appenderRefs = stdout
rootLogger.appenderRef.stdout.ref = STDOUT

With this configuration

logger.debug("This is debug"); // this will be logged to console and debug file
logger.info("This is info"); // this will be logged to console and info file
logger.error("This is error"); // this will be only logged to console

Also check this thread, it shows how can this be done with xml configuration. how to log only one level with log4j2?

miskender
  • 7,460
  • 1
  • 19
  • 23
  • Dear Miroh, Above snippet creates the file for info and debug. But no log is printing in to it. But the log is displayed in the console. – Shakthi Feb 11 '18 at 04:11
  • @Shakthi did you add your package name at `logger.fileLogger.name=packagename`. (package name is where you use the logger.) – miskender Feb 11 '18 at 09:29
  • Yes Dude. I did it. – Shakthi Feb 13 '18 at 17:52
  • @Shakthi I copied this properties file from my working project. My dependency is ` org.apache.logging.log4j log4j-core 2.10.0 `. Maybe it is a version issue – miskender Feb 13 '18 at 18:25
  • Dear Miroh. I had a look at log4j2 documentation from apache. I came to know that Log4j2 requires additional third party jar dependancy. ` org.apache.logging.log4j log4j-api 2.9.1 org.apache.logging.log4j log4j-core 2.9.1 com.lmax disruptor 3.3.6 ` – Shakthi Feb 14 '18 at 05:28
  • I copied working copy of my code dude. Thanks for the help. I got the sample to filter the threasold from your snippet only. Thank you so much. I created individual `appender.debugLoggerAppender.name` and `appender.debugLoggerAppender.type` for individual file. Can you suggest how to use same `RollingFile` for all type of file? I've tried and only one file is getting created. – Shakthi Feb 14 '18 at 06:04