Magnolia 5.3 reached end of life on June 30, 2017. This branch is no longer supported, see End-of-life policy.
Monitoring is a process that detects, diagnoses, remedies and reports an application's performance and availability to ensure that it meets user expectations. Magnolia provides built-in tools for logging and debugging application behavior. It also supports Java Management Extensions (JMX), a Java technology for managing and monitoring. These mechanisms provide developers, administrators and especially the support team detailed context for application failures.
Magnolia uses Apache log4j, a Java-based logging utility. It logs events in Magnolia core code as well as any modules that support logging. Log4j is configured in three places:
/<CATALINA_HOME>/webapps/<contextPath>/WEB-INF/config/default
directory. Any configuration changes you make in this file persist through instance restarts. Conversely, you need to restart Magnolia for any changes to take effect. You should configure long-time, persistent logging here, such as sending an email notification to your own support team when errors occur in a critical component. In the XML file you can also choose whether you wish to log a single Java class or the whole package./server/auditLogging
is for audit logging. Audit logging means tracking user activity in the system such as who signed in and what they did. Here you select the actions you want to audit such as login, create, activate and so on.If you are configuring log4j for the first time, add the debug=true
attribute in the log4j:configuration
element.
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true">
This will print out attributes and their values from the XML configuration file into the console at startup. This makes it easier to catch errors resulting from typos.
Categories (loggers in log4j terminology) define what data is logged and how much detail is provided. Think of categories as the classes and packages you want to log.
Here's an example from the default log4j.xml configuration file.
<category name="info.magnolia.cms.exchange" additivity="true"> <priority value="INFO" /> <appender-ref ref="log-activation" /> </category>
Elements and their attributes are:
category
name
defines the class or package to log. Type the fully-qualified Java class or package name here.additivity
sets appender additivity. If you set its value to true
, output from the category is directed to any appenders referenced in the category itself and any appenders defined in its ancestors following the dot notation in the name
attribute. If you set the value to false
, output is directed only to appenders referenced in the category itself, not to ancestors. In the default configuration, typical ancestors are info.magnolia
(following up the dot notation) and root
at the bottom of the XML file. All categories inherit their settings from root
.priority
value
is the logging priority level such as INFO or DEBUG.appender-ref
ref
is the name of an appender configuration in the same file.The choice between logging a single class or the whole package depends on whether the issue is limited to a single class. An action such as content activation is spread out over a few different classes. Logging only one of them may not provide enough information.
Example: Suppose you have an issue with content activation. Logging the info.magnolia.module.exchangesimple.BaseSyndicatorImpl
class will tell you almost everything that happens when content is activated in the Community Edition since it is responsible for activating content to a subscriber. However, if you want to capture events from all related classes, set the category name to the package info.magnolia.module.exchangesimple
.
To summarize:
Magnolia uses the standard log4j levels.
Level | Description |
---|---|
OFF | The highest possible rank and is intended to turn off logging. |
FATAL | Severe errors that cause premature termination. Visible in console. |
ERROR | Other runtime errors or unexpected conditions. Visible in console. |
WARN | Use of deprecated APIs, poor use of API, "almost" errors, other runtime situations that are undesirable or unexpected, but not necessarily "wrong". Visible in console. |
INFO | Interesting runtime events (startup/shutdown). Visible in console, so be conservative and keep to a minimum. |
DEBUG | Detailed information on the flow through the system. Written to logs only. |
TRACE | More detailed information. Written to logs only. |
Appenders define where the output is directed. The following appenders are configured by default in log4j.xml
. They write messages to the console and to various log files.
Appender | Writes to | Notes |
---|---|---|
| Console | Default output for DEBUG messages |
|
| Default output for DEBUG messages. |
|
| Default output for ERROR messages. |
|
| Content activation process. |
|
| Bootstrap process. |
|
| System access. |
|
| See Audit. |
|
| See Form logging. |
| Sends mail. | Disabled by default. |
Example: The log-activation
appender is used to log events related to content activation.
<appender name="sync-log-activation" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="${magnolia.logs.dir}/magnolia-activation.log" /> <param name="MaxFileSize" value="1MB" /> <param name="MaxBackupIndex" value="5" /> <param name="Append" value="true" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-5p %c %d{dd.MM.yyyy HH:mm:ss} -- %m%n" /> </layout> </appender> <appender name="log-activation" class="org.apache.log4j.AsyncAppender"> <appender-ref ref="sync-log-activation" /> </appender>
It is actually two appenders: log-activation
appender uses the AsyncAppender
class to queue up the messages while the referenced sync-log-activation
appender does the actually writing of the messages to the magnolia-activation.log
file.
All appenders that write to a log file use the RollingFileAppender
class. Rolling means that the system takes a backup of the log file when its size reaches a limit set in the MaxFileSize
parameter, 1 MB by default. The old file is date-stamped and a new file is started in the same directory.
This example shows how to log more detail about content activation action. It is useful when activation fails and the default INFO messages do not provide enough information to pinpoint the root cause.
Content activation is spread out into three different packages:
info.magnolia.cms.exchange
provides some basic support objects for activation.info.magnolia.module.activation
package is the Community Edition simple activation feature.info.magnolia.module.exchangetransactional
is the Enterprise Edition transactional activation feature.Add the categories to Log4j.xml if not already there:
<category name="info.magnolia.cms.exchange" additivity="true"> <priority value="INFO" /> <appender-ref ref="log-activation" /> </category> <category name="info.magnolia.module.activation" additivity="true"> <priority value="INFO" /> <appender-ref ref="log-activation" /> </category> <category name="info.magnolia.module.exchangetransactional" additivity="true"> <priority value="INFO" /> <appender-ref ref="log-activation" /> </category>
Each category references the log-activation
appender which sends output to the magnolia-activation.log
file. Since additivity
is true
, output is also sent to ancestor appenders, in this case the console.
Priority is set at INFO level by default. If more information is needed, this is the detail that needs to be changed.
To change the level to DEBUG:
priority
in the three categories to DEBUG.To test the new configuration, activate some content and view the logged DEBUG messages in the magnolia-activation.log
.
Note that by default there is a temp folder called tmp
configured in magnolia.properties
in the actual webapp. This folder contains various exchange_*.xml.gz
files that are stored when debugging is enabled for activation. The location of the files is specified by the magnolia.upload.tmpdir
.
The Logging Tool allows you to configure logging for all key Magnolia classes, as well as Apache, Ehcache and Jackrabbit classes. This configuration is transient: it only persists until the next instance restart.
This tool does not have its own app in Magnolia 5 yet. You can access it at
http://<domain>[:<port>]/<contextPath>/.magnolia/log4j
.
If you know or suspect that a particular class, group of classes or module is causing your issue, change the logging level on that class to DEBUG.
Set all changed classes back to their original detail level (typically INFO) once you have finished debugging. They will reset anyway the next time you start Magnolia.
View the recorded messages in the log file:
magnolia-debug.log
from the dropdown.Newest entries are at the end of the file. Click >> to go to the end. When the detail level is set to DEBUG, a line starting with the word DEBUG is written each time the class is called.
With the exception of DEBUG and OFF, logged events are also displayed in the console. Console is the terminal window where you issued the Magnolia start command. Keep an eye on the console as you reproduce an error.
To download the log file:
Mail module documentation has an example of error resolution using the logging tool.
Request and response headers are information passed between a browser and a web server. Headers consist of fields that define the operating parameters of the HTTP transaction. Capturing the headers tells you what records are passed and provides a clue for troubleshooting.
The request header contains details of what the browser wants and what it will accept back from the server. It also contains the type, version and capabilities of the browser so that the server returns compatible data.
Example: Request header
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Referer: http://demopublic.magnolia-cms.com/demo-project.html Cache-Control: max-age=0
The response header contains the date, size and type of file that the server is sending back to the client and data about the server itself. The header is attached to the files being sent back to the client.
Example: Response header
Date: Thu, 13 Oct 2011 11:09:41 GMT Content-Encoding: gzip Connection: Keep-Alive Content-Length: 3229 Pragma: no-cache X-Magnolia-Registration: Registered Last-Modified: Thu, 13 Oct 2011 11:01:26 GMT Server: Apache/2.2.14 (Ubuntu) Vary: Accept-Encoding Content-Type: text/html;charset=UTF-8 Cache-Control: no-cache, no-store, must-revalidate, max-age=0 Keep-Alive: timeout=15, max=100 Expires: Thu, 01 Jan 1970 00:00:00 GMT
To capture the headers, you can use a browser extension or plugin that displays headers for the currently open page. A plugin's advantage over a header-sniffing website is that you can also use it for sites that only exist in your local environment or intranet.
To view headers in Developer Tools:
Any Unix-like system likely has these command line tools already installed.
Rich client applications:
A header-sniffing website can report headers for a site that resides on the public Internet. These tools do not work for a site that exists only in your local environment.
You can observe Java Virtual Machine and application server performance through Java Management Extensions (JMX). JMX is Java technology used for managing and monitoring applications and system objects. Objects are represented as management beans (MBean). JMX is supported by many Java application servers such as Apache Tomcat, JBoss AS, IBM WebSphere and Oracle WebLogic.
Java Monitoring and Management Console (JConsole) is a graphical tool that supports JMX monitoring and management on a local or remote machine. It draws graphs for visual representation of performance and resource consumption, which makes it easier to observe changes over time. As a downside, the results are not as easy to export as with Jmxterm.
$ jconsole
org.apache.catalina.startup.Boostrap start
.<hostname>:<port>
or service:jmx:<protocol>:<sap>
.See Using JConsole for instructions on how to view and interpret the charts.
To save data from a JConsole chart in CSV format:
The CSV file can be imported into a spreadsheet to re-create the chart.
JMX is not only used to observe events. You can also invoke operations. In this example the server cache is flushed on the public instance using JConsole:
Jmxterm is a command line JMX tool. Unlike JConsole, it does not have a graphical user interface. However, its big advantage is that Magnolia Support can give you a script that you can paste into your Jmxterm and run it. You can also write the Jmxterm output to a file and attach it to a support ticket. This makes it easier to collect and analyze specific data. Jmxterm is good for point-in-time observation whereas JConsole is better for visualizing events over a longer period.
Start Jmxterm.
$ java -jar jmxterm.jar Welcome to JMX terminal. Type "help" for available commands.
The jvms
command tells you what Java processes are running on the machine.
$>jvms 5622 ( ) - jmxterm.jar 4623 ( ) - sun.tools.jconsole.JConsole 2094 (m) - org.apache.catalina.startup.Bootstrap start
Open the connection to the Catalina JVM using the process ID.
$>open 2094 #Connection to 2094 is opened
The domains
command lists the domains available in the Java process.
$>domains #following domains are available Catalina JMImplementation Magnolia Users com.sun.management java.lang java.util.logging net.sf.ehcache
Set the domain to Magnolia
.
$>domain Magnolia #domain is set to Magnolia
The beans
command provides a list of MBeans in the domain. Here are the beans in the Magnolia domain.
$>beans #domain = Magnolia: Magnolia:domain=magnoliaAuthor,type=CacheMonitor Magnolia:domain=magnoliaAuthor,type=JCRStats Magnolia:domain=magnoliaPublic,type=CacheMonitor Magnolia:domain=magnoliaPublic,type=JCRStats
We need the CacheMonitor
bean for the public instance.
$>bean Magnolia:domain=magnoliaPublic,type=CacheMonitor #bean is set to Magnolia:domain=magnoliaPublic,type=CacheMonitor
info
tells you what a bean does. The CacheMonitor
bean provides several attributes and operations.
$>info #mbean = Magnolia:domain=magnoliaPublic,type=CacheMonitor #class name = info.magnolia.module.cache.mbean.CacheMonitor # attributes %0 - All (java.util.Map, r) %1 - Bypasses (int, r) %2 - CachedKeysCount (int, r) %3 - CachedUUIDsCount (int, r) %4 - DomainAccesses (java.util.Map, r) %5 - Flushes (java.util.Map, r) %6 - Hits (int, r) %7 - Puts (int, r) %8 - StartCalls (int, r) %9 - StopCalls (int, r) # operations %0 - void flushAll() %1 - void flushByUUID(java.lang.String p1,java.lang.String p2) #there's no notifications
Invoke the flushAll
operation to flush the cache.
$>run flushAll #calling operation flushAll of mbean Magnolia:domain=magnoliaPublic,type=CacheMonitor #operation returns: null
This particular operation does not return any value, just null
.
Let's see how many times the cache has been flushed by checking the Flushes
attribute with the get
command.
$>get Flushes #mbean = Magnolia:domain=magnoliaPublic,type=CacheMonitor: Flushes = { uuid-key-mapping = 3; default = 3; };
Three times, it seems.
Jmxterm can read a script file with the -i <input script>
command line option.
Save the following script as script.txt
:
open <JVM process ID> get -d Magnolia -b Magnolia:domain=magnoliaPublic,type=JCRStats SessionCount get -d Magnolia -b Magnolia:domain=magnoliaPublic,type=CacheMonitor All quit
Replace <JVM process ID>
with the ID of the Java Virtual Machine that is executing the Magnolia application. You can find it with ps | grep jvm
.
Execute the script with:
$ java -jar jmxterm.jar -n -i script.txt -o output.txt
where
-n
sets Jmxterm to non-interactive mode.-i <input script>
reads the script.-o <output file>
writes the output to a file.You should get results like this in the output file:
SessionCount = 12; CachedUUIDsCount = 7;