Query logging can be enabled by setting query_log
directive in searchd section of the configuration file
searchd {
...
query_log = /var/log/query.log
...
}Queries can also be sent to syslog by setting syslog
instead of a file path.
In this case all search queries will be sent to syslog daemon with
LOG_INFO priority, prefixed with [query]
instead of timestamp. Only plain log format is supported
for syslog.
Two query log formats are supported. Plain text format is still the default one. However, while it might be more convenient for manual monitoring and review, but hard to replay for benchmarks, it only logs search queries but not the other types of requests, does not always contain the complete search query data, etc.
The default text format is also harder (and sometimes impossible) to
replay for benchmarking purposes. The sphinxql format
alleviates that. It aims to be complete and re-playable, even though at
the cost of brevity and readability.
By default, searchd logs all successfully executed
search queries into a query log file. Here’s an example:
[Fri Jun 29 21:17:58 2007] 0.004 sec 0.004 sec [all/0/rel 35254 (0,20)] [lj] test
[Fri Jun 29 21:20:34 2007] 0.024 sec 0.024 sec [all/0/rel 19886 (0,20) @channel_id] [lj] testThis log format is as follows:
[query-date] real-time wall-time [match-mode/filters-count/sort-mode total-matches (offset,limit) @groupby-attr] [index-name] query
Match mode can take one of the following values:
SPH_MATCH_ALL mode;SPH_MATCH_ANY mode;SPH_MATCH_PHRASE mode;SPH_MATCH_BOOLEAN mode;SPH_MATCH_EXTENDED mode;SPH_MATCH_EXTENDED2 mode;SPH_MATCH_FULLSCANSort mode can take one of the following values:
SPH_SORT_RELEVANCE mode;SPH_SORT_ATTR_DESC mode;SPH_SORT_ATTR_ASC mode;SPH_SORT_TIME_SEGMENTS mode;SPH_SORT_EXTENDED mode.Note: the SPH* modes are specific to SphinxAPI legacy interface. SQL and HTTP interface will log in most cases ext2 for matching mode and ext and rel for sorting modes.
If Manticore was started with --iostats (ot it was
enabled via SET GLOBAL iostats=1) the corresponding metrics
will be included in the log. Then a query log entry might take the form
of:
[Fri Jun 29 21:17:58 2021] 0.004 sec [all/0/rel 35254 (0,20)] [lj] [ios=6 kb=111.1 ms=0.5] test
where: * ios - the number of file I/O operations carried out * kb - amount of data in kilobytes read from the index files * ioms - time spent on I/O operations
If Manticore was started with --cpustats (ot it was
enabled via SET GLOBAL cpustats=1) metric
cpums will be included in the log. The query log will then
look like this:
[Fri Jun 29 21:17:58 2021] 0.004 sec [all/0/rel 35254 (0,20)] [lj] [ios=6 kb=111.1 ms=0.5 cpums=0.3] test
where cpums is time in milliseconds spent on CPU
processing the query.
SQL format can be enabled by searchd directive
query_log_format:
searchd {
...
query_log = /var/log/query.log
query_log_format = sphinxql
...
}In this format, the example from the previous section would look as follows. (Wrapped below for readability, but with just one query per line in the actual log.)
/* Fri Jun 29 21:17:58.609 2007 2011 conn 2 real 0.004 wall 0.004 found 35254 */
SELECT * FROM test WHERE MATCH('test') OPTION ranker=proximity;
/* Fri Jun 29 21:20:34 2007.555 conn 3 real 0.024 wall 0.024 found 19886 */
SELECT * FROM test WHERE MATCH('test') GROUP BY channel_id
OPTION ranker=proximity;Note that all requests would be logged in this format, including those sent via SphinxAPI and SphinxSE, not just those sent via SQL. Also note, that this kind of logging works only with plain log files and will not work if you use ‘syslog’ service for logging.
The features of Manticore SQL log format compared to the default text one are as follows.
Use sphinxql:compact_in to shorten your
IN() clauses in log if you have too many values in it.
Every request (including both SphinxAPI and SQL) request must result
in exactly one log line. All request types, including
INSERT, CALL SNIPPETS, etc will eventually get
logged, though as of time of this writing, that is a work in progress).
Every log line must be a valid Manticore SQL statement that reconstructs
the full request, except if the logged request is too big and needs
shortening for performance reasons. Additional messages, counters, etc
can be logged in the comments section after the request.
By default all queries are logged. If it’s desired to log only
queries with execution times that exceed the specified limit, the
query_log_min_msec directive can be used:
searchd {
...
query_log = /var/log/query.log
query_log_min_msec = 1000
...
}The expected unit of measure is milliseconds, but time suffix expressions can be used as well, like
searchd {
...
query_log = /var/log/query.log
query_log_min_msec = 1s
...
}By default the searchd and query log files are created with 600
permission, so only the user under which server runs and root users can
read the log files. query_log_mode allows settings a
different permission. This can be handy to allow other users to be able
to read the log files (for example monitoring solutions running on
non-root users).
searchd {
...
query_log = /var/log/query.log
query_log_mode = 666
...
}