How to use org.perf4j.log4j.AsyncCoalescingStatisticsAppender in log4j2? - log4j2

Below is the sample used in log4j 1.x. I am not getting any example to convert the same in log4j2.
<appender name="CoalescingStatisticsAppender"
class="org.perf4j.log4j.AsyncCoalescingStatisticsAppender">
<!--
The TimeSlice option is used to determine the time window for which
all received StopWatch logs are aggregated to create a single
GroupedTimingStatistics log. Here we set it to 10 seconds, overriding
the default of 30000 ms
-->
<param name="TimeSlice" value="30000" />
<appender-ref ref="perf4jFileAppender" />
</appender>

The Appender won't work as is in Log4j 2. It would have to be rewritten.

You may be interested to know that Log4j 2 supports nanoTime timestamps in PatternLayout. This, in combination with the low overhead Async Loggers, allow you to use Log4j as a rough profiling tool.

Related

Using log4j2 2.19.0 in xml with strict mode, missing attributes

I'm trying to migrate from log4j 1.2.13 to log4j2 2.19.0.
I'm using strict mode, but it looks like log4j2 have some problems with strict mode,
this is Log4j-config.xsd file from 2.19.0 : https://github.com/apache/logging-log4j2/tree/rel/2.19.0/log4j-core/src/main/resources it says last update was 5 years ago
and this is Log4j-config.xsd from master branch : https://github.com/apache/logging-log4j2/tree/master/log4j-core/src/main/resources
if you look both of them, it looks like config.xsd from 2.19.0 is not fully complete. But maven says latest version for log4j2 is 2.19.0
My problem is I have lots of appender on my old log4j configuration xml and trying to convert to logj2 configuration, but for example log4j2 appender only have three attributes which are, type, name and filename, and as you know in log4j there is attributes like
<param name="Append" value="true" />
<param name="MaxFileSize" value="500KB" />
<param name="MaxBackupIndex" value="2" />
...
I couldn't find how to give parameter to in log4j2, and there is no description in config.xsd (ver 2.19.0) too. Somehow should I use xsd and dtd's from master branch?
And also for what should my xsi:schemaLocation ?
https://raw.githubusercontent.com/apache/logging-log4j2/log4j-2.19.0/log4j-core/src/main/resources/Log4j-config.xsd
returns 404, I can get xsd for 2.12.x, but later versions there is no xsd on this link.
There is a similar question here: Log4j2 Appender attributes with strict xml config but it asked 9 years before.

Using the start timestamp in a RollingFile

I have the following RollingFileAppender setup:
<RollingFile name="RollingFile">
<FileName>${LOG_DIR}system.log</FileName>
<FilePattern>${LOG_DIR}system%d{yyyy-MM-dd HH.mm.ss}.log.zip</FilePattern>
<JsonLayout compact="true" eventEol="true" />
<Policies>
<OnStartupTriggeringPolicy />
<CronTriggeringPolicy schedule="0 0 0 * * ?"/>
</Policies>
<!-- roll over strategy, with unlimited files created -->
<DefaultRolloverStrategy fileIndex="nomax" />
</RollingFile>
It does nearly exactly what i want (new log file at midnight or on startup/restart), but unfortunately the timestamps that get assigned to the rolled over log files are sometimes simply incorrect. So for example:
system.log // current log, started at 2022-08-10 at midnight
system2022-08-09 00.00.00.log.zip // started at 2022-08-09 at midnight, so this is fine
system2022-08-08 00.00.00.log.zip // started at 2022-08-08 10.09 am, so this is not fine
system2022-08-08 10.04.57.log.zip // started at 2022-08-08 at 8.55 am, so this is not fine
As you can see system2022-08-08 00.00.00.log.zip is using a completely wrong timestamp and system2022-08-08 10.04.57.log.zip is using the timestamp when the log ended.
I'm not sure what i'm doing wrong here. Appreciate any suggestions on how to properly combine OnStartupTriggeringPolicy and CronTriggeringPolicy to achieve my goal here.
Seems like this behavior is unfortunately a bug in log4j2, and an old one. See my comment here: https://issues.apache.org/jira/browse/LOG4J2-2148
I also posted a solution for log4j2 2.18.0 in there, which will atleast does what i desire - there are still several things wrong in log4j2 itself though.

multiple access to the debug.log file creating unordered files

I am using log4j2.xml for logging. 3 instances of my application are simultaneously writing to the debug.log file (with Rollingfile appender and CronTriggeringPolicy). But debug.log files are not getting generated sequentially and some sequences and logs are missing during multiple access. If I test with single access, it is working as expected.
<Appenders>
<RollingFile name="application" fileName="${log-path}/debug.log"
filePattern="${log-path}/debug.log.%i">
<PatternLayout>
<pattern>[%d{yyyy-MM-dd HH:mm:ss,SSS}]%5p [%t] (%F:%M:%L) - %m%n</pattern>
</PatternLayout>
<Policies>
<CronTriggeringPolicy schedule="0 0/2 * 1/1 * ? *" />
</Policies>
<DefaultRolloverStrategy fileindex="min" min="1" max="5" />
</RollingFile>
That's expected behavior. You could (artificially) get serialized lines, if you separate your log file by thread (the %t you are printing in your pattern).
The lines written with the same %t value, will be in the correct order.
On the other hand, if you are serious about logging properly, you might want to consider using LOG4J's MDC.
When 3 instances of your application are running simultaneously and logging in the same file, you can not expect sequential logs.
Reason is when 3 instances are running, it means 3 separate processes are running and these 3 separate processes are trying to write to a single file.
Writing to a file involves locking the file resource, write and then release the lock. So, sometimes, 1 process will get the lock and write it. Meanwhile, other 2 process will keep waiting and if there buffer will get filled, some logs will get missed and this cycle will keep on going for other processes of the application.
For such situations, you should use some log daemon like rsyslog using log4j2 SyslogAppender or easy solution is to log in separate files by each parallel instance of the application.

Extended Schedule Task in Sitecore not working

I have created an extended scheduled task with some parameters and has also added Schedule "20160201T235900|20190201T235900|127|00:10:00" to run every 10 minutes.
Frequncy in web.config is also set to 5 minutes. 00:05:00
But It is not at all executing somehow. Can anyone help me out with some possible reasons for this.
Extended Schedule
|||||Task Info
This Extended Schedule template ships with Active Commerce, and is helpful for specifying parameters that are commonly needed when executing Active Commerce tasks, including a site/shop context, database context, and other parameters.
Out of the box however, the Sitecore DatabaseAgent will not execute schedules for items which don't explicitly use Sitecore's Schedule template (even if the template inherits from it, as Extended Schedule does).
To work around this, Active Commerce ships with its own extended DatabaseAgent. You can enable it by enabling the xActiveCommerce.Scheduling.config.example config patch that ships with Active Commerce. In case this example config is missing, I've included its contents below.
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<scheduling>
<agent type="Sitecore.Tasks.DatabaseAgent">
<patch:delete />
</agent>
<agent type="Sitecore.Tasks.DatabaseAgent">
<patch:delete />
</agent>
<agent type="ActiveCommerce.Tasks.DatabaseAgent" method="Run" interval="00:10:00" instance="master">
<param desc="database">master</param>
<param desc="schedule root">/sitecore/system/tasks/schedules</param>
<LogActivity>true</LogActivity>
</agent>
<agent type="ActiveCommerce.Tasks.DatabaseAgent" method="Run" interval="00:10:00" instance="core">
<param desc="database">core</param>
<param desc="schedule root">/sitecore/system/tasks/schedules</param>
<LogActivity>true</LogActivity>
</agent>
</scheduling>
</sitecore>
</configuration>
Are you using InitializeSpeedBooster.config? then you have to delete the following lines:
<processor type="Sitecore.Pipelines.Loader.InitializeScheduler, Sitecore.Kernel">
<patch:delete />
</processor>

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