Log4j2.xml configuration doesn't work but log4j2.properties does - java

Hello I have this problem were if i use a log4j2.xml file as a configuration file the logger won't log to console, whereas if i am using a .properties file instead i will have the logs in file.
This is the .xml file
<?xml version="1.0" encoding="UTF-8"?>
<!-- Extra logging related to initialization of Log4j.
Set to debug or trace if log4j initialization is failing. -->
<Configuration status="warn">
<Appenders>
<!-- Console appender configuration -->
<Console name="console" target="SYSTEM_OUT">
<PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
</Console>
</Appenders>
<Loggers>
<!-- Root logger referring to console appender -->
<Root level="info" additivity="false">
<AppenderRef ref="console" />
</Root>
</Loggers>
</Configuration>
.properties file:
# Set to debug or trace if log4j initialization is failing
status = warn
# Name of the configuration
name = ConsoleLogConfigDemo
# Console appender configuration
appender.console.type = Console
appender.console.name = consoleLogger
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
# Root logger level
rootLogger.level = debug
# Root logger referring to console appender
rootLogger.appenderRef.stdout.ref = consoleLogger
(I am trying to do this for a migration from log4j to log4j2 and if i am using the .properties file everything seems to work)

I had the properties file and xml file both in resources folder.

Related

How to convert the log4j.properties file to log4j2.properties file [duplicate]

I have a Java application which is using log4j configured as below.
log4j.properties:
log4j.rootLogger=INFO, R
log4j.appender.R = org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File = /trace.log
log4j.appender.R.Append = true
log4j.appender.R.DatePattern = '.'yyyy-MM-dd
log4j.appender.R.layout = org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern = %d{HH:mm:ss} %c{1} [%p] %m%n
I would like to migrate to log4j2 with the same configuration as above. Haven't found anything related to log4j2 properties configuration file as this support recently included.
How would be my log4j2.properties file with the same configuration above ?
Here is what I constructed after going through the documentation and worked.
rootLogger.level = INFO
property.filename = trace.log
appenders = R, console
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d %5p [%t] (%F:%L) - %m%n
appender.R.type = RollingFile
appender.R.name = File
appender.R.fileName = ${filename}
appender.R.filePattern = ${filename}.%d{yyyy-MM-dd}
appender.R.layout.type = PatternLayout
appender.R.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %c{1} [%p] %m%n
appender.R.policies.type = Policies
appender.R.policies.time.type = TimeBasedTriggeringPolicy
appender.R.policies.time.interval = 1
rootLogger.appenderRefs = R, console
rootLogger.appenderRef.console.ref = STDOUT
rootLogger.appenderRef.R.ref = File
You can use this to convert from Log4J.properties (v1.2) to log4j2.xml as below:
1) Convert from v1.2 properties to v1.2XML using this converter: https://log4j-props2xml.appspot.com/
2) Convert from v1.2 XML to v2.0 XML (i.e. Log4j2.xml) using the procedure provided on this link: https://logging.apache.org/log4j/2.x/manual/migration.html
Log4j2 supports .properties files but they have changed property syntax. You can check their manual here it covers all you need to create new configuration.
I know it's an old issue but for the sake of history:
Since Log4j2 2.13.0 there is an experimental feature for Log4j 1 configuration files:
http://logging.apache.org/log4j/2.x/manual/compatibility.html
Related JIRA issue:
https://issues.apache.org/jira/browse/LOG4J2-63
You can use this wonderful frontend web to convert you properties to a XML
http://log4j-props2xml.appspot.com/
Resulting:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="R" class="org.apache.log4j.DailyRollingFileAppender">
<param name="Append" value="true"/>
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<param name="File" value="/trace.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{HH:mm:ss} %c{1} [%p] %m%n"/>
</layout>
</appender>
<root>
<level value="INFO"/>
<appender-ref ref="R"/>
</root>
</log4j:configuration>

why is my log file empty when I use log4j2?

please help me debug something-- I am getting an empty log file when I use log4j2.
Here is my log4j2.properties file:
# Root logger option
name=PropertiesConfig
property.filename = logs
appenders = stdout, file
# stdout will print logs on console
appender.stdout.name = consoleLogger
appender.stdout.type = Console
appender.stdout.target = System.out
appender.stdout.layout.type = PatternLayout
appender.stdout.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
# file will print logs in file
appender.file.name = fileLogger
appender.file.type = File
appender.file.fileName=ProtScannerLog.log
appender.file.layout.type = PatternLayout
appender.file.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
loggers=file
logger.file.name = log4j2.properties
logger.file.level = info
logger.file.appenderRefs = file
logger.file.appenderRef.file.ref = fileLogger
rootLogger.level = info
rootLogger.appenderRefs = stdout, file
rootLogger.appenderRef.stdout.ref = consoleLogger
rootLogger.appenderRef.file.ref = fileLogger
# added for debugging
# logs the SQL statements
log4j.logger.org.hibernate.SQL=DEBUG
# Logs the JDBC parameters passed to a query
log4j.logger.org.hibernate.type=TRACE
log4j.appender.hb=org.apache.log4j.ConsoleAppender
log4j.appender.hb.layout=org.apache.log4j.PatternLayout
And my log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<File name="File" fileName="ProtScannerLog.log" append="true">
<PatternLayout pattern="%d %t %-5p %c{2} - %m%n"/>
</File>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="Console" level="info" />
<AppenderRef ref="File" level="error" />
</Root>
</Loggers>
</Configuration>
When I run I get the log file in the directory I am running my code from, but it is blank. I see the correct messages in the console. I also would like to have this log file placed in C:\Users\username, but I am having trouble specifying that location. Any help would be much appreciated. Thanks in advance.
It supposed to be comment, but I don't have a reputation so have to post it this way :)
I've just copy pasted your config and it generated the ProtScannerLog.log file with several lines in.
So it definitely not log4j2.properties config issue.
Regarding the location of the file I can suggest to replace:
property.filename = logs
by
property.filename = C:\\Users\\username
And then refer to the property in "appender.file.fileName" definition:
appender.file.fileName=${filename}\\ProtScannerLog.log
It would create the file under any folder you specify.

Log4j is not logging into file or console

I am trying to learn log4j version 2.x. The log4j properties are done using xml. The code given below is in a maven project in eclipse STS. It does not print any logging messages into the console or file.
I don't know how to debug this. Googling did not give me any answers for eclipse. Please suggest how I can debug this myself and fix it. I don't need full answer right away, unless most/all of my code is wrong.
Code:
package com.api.log4j;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class LoggingExample {
static Logger logger = LogManager.getLogger(LoggingExample.class);
private void loggerLevel(String message) {
if (logger.isDebugEnabled()) {
logger.debug("This is set to debug: " + message);
}
if (logger.isInfoEnabled()) {
logger.info("This is set to info: " + message);
}
logger.warn("This is set to warn: " + message);
logger.error("This is set to error: " + message);
logger.fatal("This is set to fatal: " + message);
}
public static void main(String[] args) {
System.out.println("Running main...");
LoggingExample loggingExample = new LoggingExample();
loggingExample.loggerLevel("calling the loggerLevel method...");
}
}
Log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="Console" target="System.out">
<PatternLayout>
[%-5level]<!-- Use 5 chars to show the level text. If level text < 5
chars, then append spaces to make it 5 chars. -->
%d{yyyy-MM-dd HH:mm:ss.SSS}<!-- The date. -->
[%t]<!-- Which thread is running. -->
%c{1}<!-- Class being logged. -->
- %msg%n
</PatternLayout>
</Console>
<File name="File" filename="/src/main/resources/log4j-file.txt">
<PatternLayout>
[%-5level]<!-- Use 5 chars to show the level text. If level text < 5
chars, then append spaces to make it 5 chars. -->
%d{yyyy-MM-dd HH:mm:ss.SSS}<!-- The date. -->
[%t]<!-- Which thread is running. -->
%c{1}<!-- Class being logged. -->
- %msg%n
</PatternLayout>
</File>
</Appenders>
<Loggers>
<Root>
<AppenderRef ref="Console" /> <!-- Appends only to console appender -->
</Root>
<Logger name="com.api.log4j.LoggingExample" level="debug"
additivity="false">
<AppenderRef ref="File" /> <!-- Appends only to file appender -->
</Logger>
</Loggers>
</Configuration>
1.If you are using MAVEN build tools make sure log4j.jar is added to your lib folder.
2.Write your configuration parameter in log4j.properties file and your log will work !!
# Root logger option
log4j.rootLogger=DEBUG,stdout, file
# Redirect log messages to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p
%c{1}:%L - %m%n
# Redirect log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=your File path
log4j.appender.file.MaxFileSize=5MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout

How configure SLF4J underlying configuration file location [duplicate]

I have the followed imports:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
and the following instantiation:
private static Logger logger = LoggerFactory.getLogger(Test.class);
and the following in my Main method:
logger.info("SOME MESSAGE: ");
However, I'm not able to find the output anywhere. All I see is that in my console there is:
21:21:24.235 [main] INFO some_folder.Test - SOME MESSAGE:
How do I locate the log file?
Note that the following are on my build path:
slf4j-api-1.7.5.jar
slf4j-log4j12-1.6.4.jar
I read the answer to similar questions but nobody actually says how to fix the problem.
slf4j is only an API. You should have a concrete implementation (for example log4j). This concrete implementation has a config file which tells you where to store the logs.
When slf4j catches a log messages with a logger, it is given to an appender which decides what to do with the message. By default, the ConsoleAppender displays the message in the console.
The default configuration file is :
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<!-- By default => console -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
If you put a configuration file available in the classpath, then your concrete implementation (in your case, log4j) will find and use it. See Log4J documentation.
Example of file appender :
<Appenders>
<File name="File" fileName="${filename}">
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
</File>
...
</Appenders>
Complete example with a file appender :
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<File name="File" fileName="${filename}">
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
</File>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="File"/>
</Root>
</Loggers>
</Configuration>
As already mentioned its just a facade and it helps to switch between different logger implementation easily. For example if you want to use log4j implementation.
A sample code would looks like below.
If you use maven get the dependencies
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
Have the below in log4j.properties in location src/main/resources/log4j.properties
log4j.rootLogger=DEBUG, STDOUT, file
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=mylogs.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{dd-MM-yyyy HH:mm:ss} %-5p %c{1}:%L - %m%n
Hello world code below would prints in console and to a log file as per above configuration.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello World");
}
}
It does not write to a file by default. You would need to configure something like the RollingFileAppender and have the root logger write to it (possibly in addition to the default ConsoleAppender).
The log file is not visible because the slf4j configuration file location needs to passed to the java run command using the following arguments .(e.g.)
-Dlogging.config={file_location}\log4j2.xml
or this:
-Dlog4j.configurationFile={file_location}\log4j2.xml

org.slf4j.Logger logs to console, how do I log to file?

I am using the org.slf4j.Logger to log output. Output is going to console. How do I get logging logged to a log file?
private static final Logger LOG = LoggerFactory.getLogger(ClassName.class );
LOG.info("Logging output to console");
I am not using a log4j.properties file. I am assuming I will need one.
I added the following log4j.properties file and placed it in different parts of my eclipse project.
# Define the file appender
log4j.appender.FileAppender=org.apache.log4j.RollingFileAppender
log4j.appender.FileAppender.File=logger.log
log4j.appender.FileAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.FileAppender.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
# Direct all messages there
log4j.rootLogger = INFO, FileAppender
I even used
PropertyConfigurator.configure("log4j.properties");
But no logging file appears. log4j.properties doesn't seem to have an effect.
The simplest way, I think, is to define a FileAppender in a log4j.properties file:
# Define the file appender
log4j.appender.FileAppender=org.apache.log4j.RollingFileAppender
log4j.appender.FileAppender.File=[log filename].log
log4j.appender.FileAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.FileAppender.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
# Direct all messages there
log4j.rootLogger = INFO, FileAppender
Just replace [log filename] with some relevant filename. I think Log4j is able to automatically locate the file when you run the project from Eclipse if the file is in your project directory, but I'm not 100% sure. You can use PropertyConfigurator at the start of your application to tell Log4j where to find the properties file, e.g.:
PropertyConfigurator.configure("log4j.properties");
You can create a log4j.xml in the resource folder.
Import log4j package in the class.
Inside the class, instantiate a logger object using Logger.getLogger( ) static method.
Instantiate layouts (readymade or user-defined) to be assigned to appenders.
Instantiate appenders and assign desired layout to them by passing the layout object as parameter to their constructors.
Assign the instatiated appenders to the Logger object by invoking its addAppender( ) method with desired appender as parameter.
Invoke appropriate printing methods on Logger object to perform logging.
.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%p [%t] %c{1}.%M(%L) | %m%n" />
</layout>
</appender>
<appender name="FILE" class="org.apache.log4j.rolling.RollingFileAppender">
<rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
<param name="fileNamePattern" value="/yourfolder/debug_%d{dd-MM-yy}.log" />
</rollingPolicy>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%p [%t] %c{1}.%M(%L) | %m%n" />
</layout>
</appender>
<root>
<level value="WARN" />
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</log4j:configuration>

Categories

Resources