blob: 3a9a2ebfee8650a806ca130133e65eb5f98d2202 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<title>Apache Jena - ARQ - Logging</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="/css/bootstrap.min.css" rel="stylesheet" media="screen">
<link href="/css/bootstrap-extension.css" rel="stylesheet" type="text/css">
<link href="/css/jena.css" rel="stylesheet" type="text/css">
<link rel="shortcut icon" href="/images/favicon.ico" />
<script src="https://code.jquery.com/jquery-2.2.4.min.js"
integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44="
crossorigin="anonymous"></script>
<script src="/js/jena-navigation.js" type="text/javascript"></script>
<script src="/js/bootstrap.min.js" type="text/javascript"></script>
<script src="/js/improve.js" type="text/javascript"></script>
</head>
<body>
<nav class="navbar navbar-default" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/index.html">
<img class="logo-menu" src="/images/jena-logo/jena-logo-notext-small.png" alt="jena logo">Apache Jena</a>
</div>
<div class="collapse navbar-collapse navbar-ex1-collapse">
<ul class="nav navbar-nav">
<li id="homepage"><a href="/index.html"><span class="glyphicon glyphicon-home"></span> Home</a></li>
<li id="download"><a href="/download/index.cgi"><span class="glyphicon glyphicon-download-alt"></span> Download</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="glyphicon glyphicon-book"></span> Learn <b class="caret"></b></a>
<ul class="dropdown-menu">
<li class="dropdown-header">Tutorials</li>
<li><a href="/tutorials/index.html">Overview</a></li>
<li><a href="/documentation/fuseki2/index.html">Fuseki Triplestore</a></li>
<li><a href="/documentation/notes/index.html">How-To's</a></li>
<li><a href="/documentation/query/manipulating_sparql_using_arq.html">Manipulating SPARQL using ARQ</a></li>
<li><a href="/tutorials/rdf_api.html">RDF core API tutorial</a></li>
<li><a href="/tutorials/sparql.html">SPARQL tutorial</a></li>
<li><a href="/tutorials/using_jena_with_eclipse.html">Using Jena with Eclipse</a></li>
<li class="divider"></li>
<li class="dropdown-header">References</li>
<li><a href="/documentation/index.html">Overview</a></li>
<li><a href="/documentation/query/index.html">ARQ (SPARQL)</a></li>
<li><a href="/documentation/assembler/index.html">Assembler</a></li>
<li><a href="/documentation/tools/index.html">Command-line tools</a></li>
<li><a href="/documentation/rdfs/">Data with RDFS Inferencing</a></li>
<li><a href="/documentation/geosparql/index.html">GeoSPARQL</a></li>
<li><a href="/documentation/inference/index.html">Inference API</a></li>
<li><a href="/documentation/javadoc.html">Javadoc</a></li>
<li><a href="/documentation/ontology/">Ontology API</a></li>
<li><a href="/documentation/permissions/index.html">Permissions</a></li>
<li><a href="/documentation/extras/querybuilder/index.html">Query Builder</a></li>
<li><a href="/documentation/rdf/index.html">RDF API</a></li>
<li><a href="/documentation/rdfconnection/">RDF Connection - SPARQL API</a></li>
<li><a href="/documentation/io/">RDF I/O</a></li>
<li><a href="/documentation/rdfstar/index.html">RDF-star</a></li>
<li><a href="/documentation/shacl/index.html">SHACL</a></li>
<li><a href="/documentation/shex/index.html">ShEx</a></li>
<li><a href="/documentation/jdbc/index.html">SPARQL over JDBC</a></li>
<li><a href="/documentation/tdb/index.html">TDB</a></li>
<li><a href="/documentation/tdb2/index.html">TDB2</a></li>
<li><a href="/documentation/query/text-query.html">Text Search</a></li>
</ul>
</li>
<li class="drop down">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="glyphicon glyphicon-book"></span> Javadoc <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="/documentation/javadoc.html">All Javadoc</a></li>
<li><a href="/documentation/javadoc/arq/">ARQ</a></li>
<li><a href="/documentation/javadoc_elephas.html">Elephas</a></li>
<li><a href="/documentation/javadoc/fuseki2/">Fuseki</a></li>
<li><a href="/documentation/javadoc/geosparql/">GeoSPARQL</a></li>
<li><a href="/documentation/javadoc/jdbc/">JDBC</a></li>
<li><a href="/documentation/javadoc/jena/">Jena Core</a></li>
<li><a href="/documentation/javadoc/permissions/">Permissions</a></li>
<li><a href="/documentation/javadoc/extras/querybuilder/">Query Builder</a></li>
<li><a href="/documentation/javadoc/shacl/">SHACL</a></li>
<li><a href="/documentation/javadoc/tdb/">TDB</a></li>
<li><a href="/documentation/javadoc/text/">Text Search</a></li>
</ul>
</li>
<li id="ask"><a href="/help_and_support/index.html"><span class="glyphicon glyphicon-question-sign"></span> Ask</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="glyphicon glyphicon-bullhorn"></span> Get involved <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="/getting_involved/index.html">Contribute</a></li>
<li><a href="/help_and_support/bugs_and_suggestions.html">Report a bug</a></li>
<li class="divider"></li>
<li class="dropdown-header">Project</li>
<li><a href="/about_jena/about.html">About Jena</a></li>
<li><a href="/about_jena/architecture.html">Architecture</a></li>
<li><a href="/about_jena/citing.html">Citing</a></li>
<li><a href="/about_jena/team.html">Project team</a></li>
<li><a href="/about_jena/contributions.html">Related projects</a></li>
<li><a href="/about_jena/roadmap.html">Roadmap</a></li>
<li class="divider"></li>
<li class="dropdown-header">ASF</li>
<li><a href="http://www.apache.org/">Apache Software Foundation</a></li>
<li><a href="http://www.apache.org/foundation/sponsorship.html">Become a Sponsor</a></li>
<li><a href="http://www.apache.org/licenses/LICENSE-2.0">License</a></li>
<li><a href="http://www.apache.org/security/">Security</a></li>
<li><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li>
</ul>
</li>
<li id="edit"><a href="https://github.com/apache/jena-site/edit/main/source/documentation/query/logging.md" title="Edit this page on GitHub"><span class="glyphicon glyphicon-pencil"></span> Edit this page</a></li>
</ul>
</div>
</div>
</nav>
<div class="container">
<div class="row">
<div class="col-md-12">
<div id="breadcrumbs">
<ol class="breadcrumb">
<li><a href='/documentation'>DOCUMENTATION</a></li>
<li><a href='/documentation/query'>QUERY</a></li>
<li class="active">LOGGING</li>
</ol>
</div>
<h1 class="title">ARQ - Logging</h1>
<p>ARQ uses
<a href="http://slf4j.org/">SLF4j</a>
as the logging API and the query and RIOT commands use
<a href="http://logging.apache.org/log4j/2.x/">Log4J2</a> as a deployment
system.  You can use Java 1.4 logging instead.</p>
<p>ARQ does not output any logging messages at level INFO in normal
operation. The code uses level TRACE and DEBUG.  Running with
logging set to an application at INFO will cause no output in
normal operation. Output below INFO can be very verbose and is
intended mainly to help debug ARQ. WARN and FATAL messages are only
used when something is wrong.</p>
<p>The root of all the loggers is <code>org.apache.jena</code>.
<code>org.apache.jena.query</code> is the application API. 
<code>org.apache.jena.sparql</code> is the implementation and extensions
points.</p>
<p>If using in Tomcat, or other system that provides complex class
loading arrangements, be careful about loading from jars in both
the web application and the system directories as this can cause
separate logging systems to be created (this may not matter).</p>
<p>The ARQ and RIOT command line utilities look for a file
&ldquo;log4j2.properties&rdquo; in the current directory to control logging during
command execution. There is also a built-in configuration so no
configuration work is required.</p>
<table>
<thead>
<tr>
<th>Logger Names</th>
<th>Name</th>
<th>Constant</th>
<th>Logger</th>
<th>Use</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>org.apache.jena.arq.info</code></td>
<td><code>ARQ.logInfoName</code></td>
<td><code>ARQ.getLoggerInfo()</code></td>
<td>General information</td>
<td></td>
</tr>
<tr>
<td><code>org.apache.jena.arq.exec</code></td>
<td><code>ARQ.logExecName</code></td>
<td><code>ARQ.getLoggerExec()</code></td>
<td>Execution information</td>
<td></td>
</tr>
</tbody>
</table>
<p>The reading of <code>log4j.properties</code> from the current directory is achieved
by a call to <code>org.apache.jena.atlas.logging.Log.setlog4j2()</code>.</p>
<p>Example <code>log4j2.properties</code> file:</p>
<pre><code>status = error
name = PropertiesConfig
filters = threshold
filter.threshold.type = ThresholdFilter
filter.threshold.level = INFO
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{HH:mm:ss} %-5p %-15c{1} :: %m%n
rootLogger.level = INFO
rootLogger.appenderRef.stdout.ref = STDOUT
logger.jena.name = org.apache.jena
logger.jena.level = INFO
logger.arq-exec.name = org.apache.jena.arq.exec
logger.arq-exec.level = INFO
logger.arq-info.name = org.apache.jena.arq.exec
logger.arq-info.level = INFO
logger.riot.name = org.apache.jena.riot
logger.riot.level = INFO
</code></pre><p>A <a href="../serving/data/index.html">Fuseki</a>
server output can include <a href="explain.html" title="ARQ/Explain">ARQ execution logging</a>.</p>
<h2 id="execution-logging">Execution Logging</h2>
<p>ARQ can log query and update execution details globally or for an
individual operations. This adds another level of control on top of the
logger level controls.</p>
<p>Explanatory messages are controlled by the <code>Explain.InfoLevel</code> level in
the execution context.</p>
<p>The logger used is called <code>org.apache.jena.arq.exec</code>. Message are sent
at level &ldquo;info&rdquo;. So for log4j2, the following can be set in the
log4j2.properties file:</p>
<pre><code>logger.arq-exec.name = org.apache.jena.arq.exec
logger.arq-exec.level = INFO
</code></pre>
<p>The context setting is for key (Java constant) <code>ARQ.symLogExec</code>. To set
globally:</p>
<pre><code>ARQ.setExecutionLogging(Explain.InfoLevel.ALL) ;
</code></pre>
<p>and it may also be set on an individual query execution using its local
context.</p>
<pre><code> try(QueryExecution qExec = QueryExecution.create()... .set(ARQ.symLogExec, Explain.InfoLevel.ALL).build) {
...
}
</code></pre>
<p>On the command line:</p>
<pre><code> arq.query --explain --data data file --query=queryfile
</code></pre>
<p>The command <code>tdbquery</code> takes the same <code>--explain</code> argument.</p>
<p><strong>Information levels</strong></p>
<table>
<thead>
<tr>
<th>Level</th>
<th>Effect</th>
</tr>
</thead>
<tbody>
<tr>
<td>INFO</td>
<td>Log each query</td>
</tr>
<tr>
<td>FINE</td>
<td>Log each query and its algebra form after optimization</td>
</tr>
<tr>
<td>ALL</td>
<td>Log query, algebra and every dataset access (can be expensive)</td>
</tr>
<tr>
<td>NONE</td>
<td>No information logged</td>
</tr>
</tbody>
</table>
<p>These can be specified as string, to the command line tools, or using
the constants in <code>Explain.InfoLevel</code>.</p>
<pre><code> qExec.getContext().set(ARQ.symLogExec, Explain.InfoLevel.FINE) ;
arq.query --set arq:logExec=FINE --data data file --query=queryfile
</code></pre>
<p><a href="index.html">ARQ documentation index</a></p>
</div>
</div>
</div>
<footer class="footer">
<div class="container" style="font-size:80%" >
<p>
Copyright &copy; 2011&ndash;2022 The Apache Software Foundation, Licensed under the
<a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.
</p>
<p>
Apache Jena, Jena, the Apache Jena project logo, Apache and the Apache feather logos are trademarks of
The Apache Software Foundation.
<br/>
<a href="https://privacy.apache.org/policies/privacy-policy-public.html"
>Apache Software Foundation Privacy Policy</a>.
</p>
</div>
</footer>
<script type="text/javascript">
var link = $('a[href="' + this.location.pathname + '"]');
if (link != undefined)
link.parents('li,ul').addClass('active');
</script>
</body>
</html>