log4j2 level inheritance not working - log4j2

<Loggers>
<Logger name="X.Y.Z">
<AppenderRef ref="Console" />
</Logger>
<Logger name="X.Y">
<AppenderRef ref="Console" />
</Logger>
<Logger name="X">
<AppenderRef ref="Console" />
</Logger>
<Root level="trace" additivity="false">
<AppenderRef ref="Console" />
</Root>
</Loggers>
This is my log4j.xml file.
The below details are what I am getting if I use Configuration object in Java code.
X.Y.Z --- ERROR ----Parent : X.Y
X.Y --- ERROR ----Parent : X
X --- ERROR ----Parent : root
root --- TRACE ----Parent : null
The above details tell us the proper Parent name but it's not inheriting levels from parent logger "root".

It is more common to use the additivity="false" attribute on the named Loggers, instead of on the Root logger.
The final part of your question is unclear to me. What do you mean exactly by "... if I use Configuration object..."? Are you configuring log4j2 with Java source code in addition to the log4j2.xml configuration file? Or are you simply calling Logger.trace? Can you show the source code?
Also, can you show your complete log4j2.xml configuration?
When you say "The below details are what I am getting...", do you mean that this is the output generated by Log4j on the console?

In the docs it says that you can't put the additivity attribute on the Root logger because it doesn't make sense. There is no logger above it to add to.
Additivity basically means "pass on log entries to the parent logger in the hierarchy"
It doesn't inherit levels from the parent. A log entry has a level. Whether it is printed depends on whether there is a logger to catch such an entry (one that accepts that level).
So X.Y.Z will pass logs to X.Y unless additivity=false is set on the X.Y.Z logger config. And so on

Related

pass file name from logger to appender

i want to log out to different files because there are too many and hard to fallow. For example i have hospital application and i want separate log file for every different action like appointment, reports and patient
public org.apache.logging.log4j.Logger logManager = LogManager.getLogger("appointment-log");
public org.apache.logging.log4j.Logger logManager = LogManager.getLogger("reports-log");
public org.apache.logging.log4j.Logger logManager = LogManager.getLogger("patient-log");
i can do reports log like below
<appender name="FILE-REPORTS" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOGS_HOME}${REPORTS_LOG}</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss};%msg%n
</Pattern>
</encoder>
<param name="Append" value="False" />
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>${LOGS_HOME}REPORTS.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<logger name="reports-log" level="info" additivity="false">
<appender-ref ref="FILE-REPORTS"/>
<appender-ref ref="STDOUT"/>
</logger>
Everything is ok till here but i dont want to write appender for appointment and patient and many more, i want to use only 1 appender then i will pass file name from , psudo like below
<logger name="patient-log" level="info" additivity="false">
<appender-ref ref="PATIENT-AUDIT" **fileName="patient.log"**/>
<appender-ref ref="STDOUT"/>
</logger>

log4j2 to configure logging level to all for particular class and restrict the rest of the classes to "error" level

I have a requirement to write all logs from specific package (com.kat.util) and restrict the rest of the classes should only log "error". how can i achieve that ?
I tried the below snippet, but its not working
<Loggers>
<Logger name="com.kat.util">
<AppenderRef ref="writer" level="all"/>
</Logger>
<Root level="error">
<AppenderRef ref="writer"/>
</Root>
</Loggers>
I have managed to solve, by adding the below
<Loggers>
<Logger name="com.kat.util" level="debug">
<AppenderRef ref="writer" />
</Logger>
<Root level="error">
<AppenderRef ref="writer"/>
</Root>
</Loggers>

Translating prometheus LOG4j conf from XML to properties file

I have used LOG4j many times on quite common basics, and mainly through a properties file. I am though very unfamiliar with the XML form and with uncommon features (such as third party lib custom logging).
The prometheus log4j2 configuration is written for xml conf files, and I actually don't understand it. Although I could use it as such, I would like to understand it by translating in a form I am confortable with : as a properties file .
<?xml version="1.0" encoding="UTF-8"?>
<Configuration packages="io.prometheus.client.log4j2">
<Appenders>
<Prometheus name="METRICS"/>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="METRICS"/>
</Root>
</Loggers>
</Configuration>
properties file :
name=PropertiesConfig
property.filename = /var/logs
appenders = console, METRICS?
appenders.METRICS?.
...?
rootLogger.appenderRefs = METRICS, console
...?
Can anyone help me on this one?
like this:
log4j.rootLogger=CONSOLE,METRICS
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%-5p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c] \:%m%n
log4j.appender.METRICS=io.prometheus.client.log4j.InstrumentedAppender
after see log4j_appender_total flag in prometheus
converstion refer: https://www.journaldev.com/10698/log4j-properties-file-example

log4j2 - duplicating logs in Console & RollingFile

hey I was wondering if it possible to have the same output in Console as in the file output.
Here is my XML config.
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" name="log4j2 Logs">
<Properties>
<Property name="basePath">./logs</Property>
</Properties>
<Appenders>
<RollingFile name="file" fileName="${basePath}/ActivateMaintenancePage.logs"
filePattern="${basePath}/ActivateMaintenancePage-%d{yyyy-MM-dd}">
<PatternLayout header="LOGGING START%n%n" footer="%n%nLOGGING END"
pattern="%3sn %30d{DEFAULT} [%M] %-7level %c{30} - %m%n" />
<Policies>
<OnStartupTriggeringPolicy minSize="0"/>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="500 MB"/>
</Policies>
</RollingFile>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout header="LOGGING START%n%n" footer="%n%nLOGGING END"
pattern="%3sn %30d{DEFAULT} [%M] %-7level %c{30} - %m%n" />
</Console>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="console" level="error"/>
<AppenderRef ref="file" level="trace"/>
</Root>
</Loggers>
</Configuration>
Output in RollingFile
1 2017-07-25 11:16:36,762 [initializeChrome] INFO class testNG.SimSettings - Web Chrome driver is now initilized.
2 2017-07-25 11:16:36,762 [lambda$0] INFO class testNG.SimSettings - Opening... http://msrvaq11vm.technomedia.ca/sigal_60/2017sp1/sp_polymont/_sim/PROD Sp2 2016 Sim...
3 2017-07-25 11:16:47,926 [initilizeAllElements] INFO class testNG.SimSettings - All #FindBy elements have been initilized.
4 2017-07-25 11:16:48,006 [change1stLevelFrame] INFO class testNG.SimSettings - Changing target to 1st level frame.
5 2017-07-25 11:16:49,719 [enterCredentials] INFO class testNG.SimSettings - UserName & Password: Success!
and empty in Console. But now if I change
<AppenderRef ref="console" level="error"/>
to "trace"
It will be 2,4,6....in console and in my file it will be 1,3,5,7... which is easily understandable.
But my question is how can we have both the same log-level (trace) output in Console and File?
(adding tag with package name and level did not work)
Related to this question: log4j2 xml configuration - Log to file and console (with different levels)
I'm not sure if I read your question correctly but it seems that you want to render some unique value in the log output, such that the same log event has the same unique value in the Console log and the File log output.
The sequence number pattern converter will increment every time a log event is rendered. The same log event is rendered separately for each Appender, so different Appenders will never have the same sequence number.
There are a number of alternatives. One idea is to include %nano nanotime in the pattern layout. This value is captured when the application makes the logging call and will be the same for all appenders. An alternative is to create a custom Log4j2 pattern converter or lookup.

Disable freemarker logs from logs4j

Similar question but i'm using log4j2.
I need a way to disable All logs from freemarker, in their documentation they say we can do it by calling Logger.selectLoggerLibrary(Logger.LIBRARY_NONE) but they say
selectLoggerLibrary must be called early, before FreeMarker could log anything, or else it will not have (consistent) effect.
Where do I call this in a struts2 application? (I tried calling it in prepare() method in my action class but its not working.) or is there any other way to disable the logs?
Question is, why do you need to disable it like that?
You shouldn't need that, so I guess that's where the real problem lies. Is there some kind of malfunction? Because if there isn't, why not just set the freemarker logger category to be ignored in your logger configuration? That's the normal way of doing this, FreeMarker or not.
Anyway, in 2.3.22 (release expected in early 2015) you can use the -Dorg.freemarker.loggerLibrary=none where you start the JVM (that is, you set the org.freemarker.loggerLibrary system property). Otherwise, if you could call that method in a ServletContextListener that's certainly early enough.
Update:
Reacting to the comments... in most applications you will have 3rd party libraries that use various logging "frameworks", like SLF4J, commons-logging, JUL, Log4j, Log4j2. Thus you have to ensure that all these get redirected into the same logger library, which is certainly Log4j2 in your case. I suspect that wasn't properly done in your case, so now multiple logger libraries log to the console, each with its own configuration settings.
FreeMarker 2.3.x uses Log4j 1.x if it detects that org.apache.log4j.Logger is present. Other logger libraries that it also can detect and use (Log4j2 is not amongst them) have lower priority. (FreeMarker 2.4.x will always use SLF4J if it's present.) Thus, if you add org.apache.logging.log4j:log4j-1.2-api to your dependencies, then FM will use org.apache.log4j.Logger, and so log4j-1.2.-api will redirect the FM log messages to Log4j2. That worked for me, with this Log4j2 configuration:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n" />
</Console>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="Console" />
</Root>
<Logger name="freemarker" level="off">
<AppenderRef ref="Console" />
</Logger>
</Loggers>
</Configuration>
This came up as the first search result for "disable freemarker logging" which I searched for because I got double error logs for template errors, one from within the Freemarker library and one from my own code catching the same exception and logging it. The solution to this is simple and different from the answers already given: call setLogTemplateExceptions(false) on the Freemarker Configuration. In full:
Configuration configuration = new Configuration(Configuration.VERSION_2_3_31);
configuration.setLogTemplateExceptions(false);
The default behavior of logging the exception even though it propagates out of the Freemarker library is mentioned as a quirk on the Freemarker Logging documentation.
Use this statement:
freemarker.log.Logger.selectLoggerLibrary(freemarker.log.Logger.LIBRARY_NONE);

Resources