Chapter 9. Logging
Logging enables you to diagnose error and performance issues with AMQ Interconnect.
AMQ Interconnect consists of internal modules that provide important information about the router. For each module, you can specify logging levels, the format of the log file, and the location to which the logs should be written.
9.1. Logging Modules
AMQ Interconnect logs are broken into different categories called logging modules. Each module provides important information about a particular aspect of AMQ Interconnect.
9.1.1. The DEFAULT
Logging Module
The default module. This module applies defaults to all of the other logging modules.
9.1.2. The ROUTER
Logging Module
This module provides information and statistics about the local router. This includes how the router connects to other routers in the network, and information about the remote destinations that are directly reachable from the router (link routes, waypoints, autolinks, and so on).
In this example, on Router.A
, the ROUTER
log shows that Router.B
is the next hop. It also shows the cost for Router.A
to reach the other routers on the network:
Tue Jun 7 13:28:27 2016 ROUTER (trace) Node Router.C next hop set: Router.B Tue Jun 7 13:28:27 2016 ROUTER (trace) Node Router.C valid origins: [] Tue Jun 7 13:28:27 2016 ROUTER (trace) Node Router.C cost: 2 Tue Jun 7 13:28:27 2016 ROUTER (trace) Node Router.B valid origins: [] Tue Jun 7 13:28:27 2016 ROUTER (trace) Node Router.B cost: 1
On Router.B
, the ROUTER
log provides more information about valid origins:
Tue Jun 7 13:28:25 2016 ROUTER (trace) Node Router.C cost: 1 Tue Jun 7 13:28:26 2016 ROUTER (trace) Node Router.A created: maskbit=2 Tue Jun 7 13:28:26 2016 ROUTER (trace) Node Router.A link set: link_id=1 Tue Jun 7 13:28:26 2016 ROUTER (trace) Node Router.A valid origins: ['Router.C'] Tue Jun 7 13:28:26 2016 ROUTER (trace) Node Router.A cost: 1 Tue Jun 7 13:28:27 2016 ROUTER (trace) Node Router.C valid origins: ['Router.A']
9.1.3. The ROUTER_CORE
Logging Module
This module provides information about the local router’s operations on active connections and links. This includes operations related to opened and closed connections, messages sent, deliveries, and flow control.
Tue Jun 7 13:42:07 2016 ROUTER_CORE (trace) Core action 'link_flow' Tue Jun 7 13:42:08 2016 ROUTER_CORE (trace) Core action 'link_deliver' Tue Jun 7 13:42:08 2016 ROUTER_CORE (trace) Core action 'send_to' Tue Jun 7 13:42:08 2016 ROUTER_CORE (trace) Core action 'link_flow'
9.1.4. The ROUTER_HELLO
Logging Module
This module provides information about the Hello protocol used by interior routers to exchange Hello messages, which include information about the router’s ID and a list of its reachable neighbors (the other routers with which this router has bidirectional connectivity).
The logs for this module are helpful for monitoring or resolving issues in the network topology, and for determining to which other routers a router is connected, and the hop-cost for each of those connections.
In this example, on Router.A
, the ROUTER_HELLO
log shows that it is connected to Router.B
, and that Router.B
is connected to Router.A
and Router.C
:
Tue Jun 7 13:50:21 2016 ROUTER_HELLO (trace) RCVD: HELLO(id=Router.B area=0 inst=1465307413 seen=['Router.A', 'Router.C']) 1 Tue Jun 7 13:50:21 2016 ROUTER_HELLO (trace) SENT: HELLO(id=Router.A area=0 inst=1465307416 seen=['Router.B']) 2 Tue Jun 7 13:50:22 2016 ROUTER_HELLO (trace) RCVD: HELLO(id=Router.B area=0 inst=1465307413 seen=['Router.A', 'Router.C']) Tue Jun 7 13:50:22 2016 ROUTER_HELLO (trace) SENT: HELLO(id=Router.A area=0 inst=1465307416 seen=['Router.B'])
On Router.B
, the ROUTER_HELLO
log shows the same router topology from a different perspective:
Tue Jun 7 13:50:18 2016 ROUTER_HELLO (trace) SENT: HELLO(id=Router.B area=0 inst=1465307413 seen=['Router.A', 'Router.C']) 1 Tue Jun 7 13:50:18 2016 ROUTER_HELLO (trace) RCVD: HELLO(id=Router.A area=0 inst=1465307416 seen=['Router.B']) 2 Tue Jun 7 13:50:19 2016 ROUTER_HELLO (trace) RCVD: HELLO(id=Router.C area=0 inst=1465307411 seen=['Router.B']) 3
9.1.5. The ROUTER_LS
Logging Module
This module provides information about link-state data between routers, including Router Advertisement (RA), Link State Request (LSR), and Link State Update (LSU) messages.
Periodically, each router sends an LSR to the other routers and receives an LSU with the requested information. Exchanging the above information, each router can compute the next hops in the topology, and the related costs.
This example shows the RA, LSR, and LSU messages sent between three routers:
Tue Jun 7 14:10:02 2016 ROUTER_LS (trace) SENT: LSR(id=Router.A area=0) to: Router.C // Tue Jun 7 14:10:02 2016 ROUTER_LS (trace) SENT: LSR(id=Router.A area=0) to: Router.B // Tue Jun 7 14:10:02 2016 ROUTER_LS (trace) SENT: RA(id=Router.A area=0 inst=1465308600 ls_seq=1 mobile_seq=1) 1 Tue Jun 7 14:10:02 2016 ROUTER_LS (trace) RCVD: LSU(id=Router.B area=0 inst=1465308595 ls_seq=2 ls=LS(id=Router.B area=0 ls_seq=2 peers={'Router.A': 1L, 'Router.C': 1L})) 2 Tue Jun 7 14:10:02 2016 ROUTER_LS (trace) RCVD: LSR(id=Router.B area=0) Tue Jun 7 14:10:02 2016 ROUTER_LS (trace) SENT: LSU(id=Router.A area=0 inst=1465308600 ls_seq=1 ls=LS(id=Router.A area=0 ls_seq=1 peers={'Router.B': 1})) Tue Jun 7 14:10:02 2016 ROUTER_LS (trace) RCVD: RA(id=Router.C area=0 inst=1465308592 ls_seq=1 mobile_seq=0) Tue Jun 7 14:10:02 2016 ROUTER_LS (trace) SENT: LSR(id=Router.A area=0) to: Router.C Tue Jun 7 14:10:02 2016 ROUTER_LS (trace) RCVD: LSR(id=Router.C area=0) 3 Tue Jun 7 14:10:02 2016 ROUTER_LS (trace) SENT: LSU(id=Router.A area=0 // inst=1465308600 ls_seq=1 ls=LS(id=Router.A area=0 ls_seq=1 peers={'Router.B': 1})) Tue Jun 7 14:10:02 2016 ROUTER_LS (trace) RCVD: LSU(id=Router.C area=0 inst=1465308592 ls_seq=1 ls=LS(id=Router.C area=0 ls_seq=1 peers={'Router.B': 1L})) 4 Tue Jun 7 14:10:03 2016 ROUTER_LS (trace) Computed next hops: {'Router.C': 'Router.B', 'Router.B': 'Router.B'} 5 Tue Jun 7 14:10:03 2016 ROUTER_LS (trace) Computed costs: {'Router.C': 2L, 'Router.B': 1} Tue Jun 7 14:10:03 2016 ROUTER_LS (trace) Computed valid origins: {'Router.C': [], 'Router.B': []}
- 1
Router.A
sent LSR requests and an RA advertisement to the other routers on the network.- 2
Router.A
received an LSU fromRouter.B
, which has two peers:Router.A
, andRouter.C
(with a cost of1
).- 3
Router.A
received an LSR from bothRouter.B
andRouter.C
, and replied with an LSU.- 4
Router.A
received an LSU fromRouter.C
, which only has one peer:Router.B
(with a cost of1
).- 5
- After the LSR and LSU messages are exchanged,
Router.A
computed the router topology with the related costs.
9.1.6. The ROUTER_MA
Logging Module
This module provides information about the exchange of mobile address information between routers, including Mobile Address Request (MAR) and Mobile Address Update (MAU) messages exchanged between routers. You can use this log to monitor the state of mobile addresses attached to each router.
This example shows the MAR and MAU messages sent between three routers:
Tue Jun 7 14:27:20 2016 ROUTER_MA (trace) SENT: MAU(id=Router.A area=0 mobile_seq=1 add=['Cmy_queue', 'Dmy_queue', 'M0my_queue_wp'] del=[]) 1 Tue Jun 7 14:27:21 2016 ROUTER_MA (trace) RCVD: MAR(id=Router.C area=0 have_seq=0) 2 Tue Jun 7 14:27:21 2016 ROUTER_MA (trace) SENT: MAU(id=Router.A area=0 mobile_seq=1 add=['Cmy_queue', 'Dmy_queue', 'M0my_queue_wp'] del=[]) Tue Jun 7 14:27:22 2016 ROUTER_MA (trace) RCVD: MAR(id=Router.B area=0 have_seq=0) 3 Tue Jun 7 14:27:22 2016 ROUTER_MA (trace) SENT: MAU(id=Router.A area=0 mobile_seq=1 add=['Cmy_queue', 'Dmy_queue', 'M0my_queue_wp'] del=[]) Tue Jun 7 14:27:39 2016 ROUTER_MA (trace) RCVD: MAU(id=Router.C area=0 mobile_seq=1 add=['M0my_test'] del=[]) 4 Tue Jun 7 14:27:51 2016 ROUTER_MA (trace) RCVD: MAU(id=Router.C area=0 mobile_seq=2 add=[] del=['M0my_test']) 5
- 1
Router.A
sent MAU messages to the other routers in the network to notify them about the addresses added formy_queue
andmy_queue_wp
.- 2
Router.A
received a MAR message in response fromRouter.C
.- 3
Router.A
received another MAR message in response fromRouter.B
.- 4
Router.C
sent a MAU message to notify the other routers that it added and address formy_test
.- 5
Router.C
sent another MAU message to notify the other routers that it deleted the address formy_test
(because the receiver is detached).
9.1.7. The MESSAGE
Logging Module
This module provides information about AMQP messages sent and received by the router, including information about the address, body, and link. You can use this log to find high-level information about messages on a particular router.
In this example, Router.A
has sent and received some messages related to the Hello protocol, and sent and received some other messages on a link for a mobile address:
Tue Jun 7 14:36:54 2016 MESSAGE (trace) Sending Message{to='amqp:/_topo/0/Router.B/qdrouter' body='\d1\00\00\00\1b\00\00\00\04\a1\02id\a1\08R'} on link qdlink.p9XmBm19uDqx50R Tue Jun 7 14:36:54 2016 MESSAGE (trace) Received Message{to='amqp:/_topo/0/Router.A/qdrouter' body='\d1\00\00\00\8e\00\00\00 \a1\06ls_se'} on link qdlink.phMsJOq7YaFsGAG Tue Jun 7 14:36:54 2016 MESSAGE (trace) Received Message{ body='\d1\00\00\00\10\00\00\00\02\a1\08seque'} on link qdlink.FYHqBX+TtwXZHfV Tue Jun 7 14:36:54 2016 MESSAGE (trace) Sending Message{ body='\d1\00\00\00\10\00\00\00\02\a1\08seque'} on link qdlink.yU1tnPs5KbMlieM Tue Jun 7 14:36:54 2016 MESSAGE (trace) Sending Message{to='amqp:/_local/qdhello' body='\d1\00\00\00G\00\00\00\08\a1\04seen\d0'} on link qdlink.p9XmBm19uDqx50R Tue Jun 7 14:36:54 2016 MESSAGE (trace) Sending Message{to='amqp:/_topo/0/Router.C/qdrouter' body='\d1\00\00\00\1b\00\00\00\04\a1\02id\a1\08R'} on link qdlink.p9XmBm19uDqx50R
9.1.8. The SERVER
Logging Module
This module provides information about how the router is listening for and connecting to other containers in the network (such as clients, routers, and brokers). This includes the state of AMQP messages sent and received by the broker (open, begin, attach, transfer, flow, and so on), and the related content of those messages.
For example, this log shows details about how the router handled a link attachment:
Tue Jun 7 14:39:52 2016 SERVER (trace) [2]: <- AMQP Tue Jun 7 14:39:52 2016 SERVER (trace) [1]: <- AMQP Tue Jun 7 14:39:52 2016 SERVER (trace) [1]:0 <- @open(16) [container-id="Router.B", max-frame-size=16384, channel-max=32767, idle-time-out=8000, offered-capabilities=:"ANONYMOUS-RELAY", properties={:product="qpid-dispatch-router", :version="0.6.0"}] Tue Jun 7 14:39:52 2016 SERVER (trace) [1]:0 -> @begin(17) [next-outgoing-id=0, incoming-window=15, outgoing-window=2147483647] Tue Jun 7 14:39:52 2016 SERVER (trace) [1]:RAW: "\x00\x00\x00\x1e\x02\x00\x00\x00\x00S\x11\xd0\x00\x00\x00\x0e\x00\x00\x00\x04@R\x00R\x0fp\x7f\xff\xff\xff" Tue Jun 7 14:39:52 2016 SERVER (trace) [1]:1 -> @begin(17) [next-outgoing-id=0, incoming-window=15, outgoing-window=2147483647] Tue Jun 7 14:39:52 2016 SERVER (trace) [1]:RAW: "\x00\x00\x00\x1e\x02\x00\x00\x01\x00S\x11\xd0\x00\x00\x00\x0e\x00\x00\x00\x04@R\x00R\x0fp\x7f\xff\xff\xff" Tue Jun 7 14:39:52 2016 SERVER (trace) [1]:0 -> @attach(18) [name="qdlink.uSSeXPSfTHhxo8d", handle=0, role=true, snd-settle-mode=2, rcv-settle-mode=0, source=@source(40) [durable=0, expiry-policy=:"link-detach", timeout=0, dynamic=false, capabilities=:"qd.router"], target=@target(41) [durable=0, expiry-policy=:"link-detach", timeout=0, dynamic=false, capabilities=:"qd.router"], initial-delivery-count=0] Tue Jun 7 14:39:52 2016 SERVER (trace) [1]:RAW: "\x00\x00\x00\x91\x02\x00\x00\x00\x00S\x12\xd0\x00\x00\x00\x81\x00\x00\x00\x0a\xa1\x16qdlink.uSSeXPSfTHhxo8dR\x00AP\x02P\x00\x00S(\xd0\x00\x00\x00'\x00\x00\x00\x0b@R\x00\xa3\x0blink-detachR\x00B@@@@@\xa3\x09qd.router\x00S)\xd0\x00\x00\x00#\x00\x00\x00\x07@R\x00\xa3\x0blink-detachR\x00B@\xa3\x09qd.router@@R\x00"
9.1.9. The AGENT
Logging Module
This module provides information about configuration changes made to the router from either editing the router’s configuration file or using qdmanage
.
In this example, on Router.A
, address
, linkRoute
, and autoLink
entities were added to the router’s configuration file. When the router was started, the AGENT
module applied these changes, and they are now viewable in the log:
Tue Jun 7 15:07:32 2016 AGENT (debug) Add entity: ConnectorEntity(addr=127.0.0.1, allowRedirect=True, cost=1, host=127.0.0.1, identity=connector/127.0.0.1:5672:BROKER, idleTimeoutSeconds=16, maxFrameSize=65536, name=BROKER, port=5672, role=route-container, stripAnnotations=both, type=org.apache.qpid.dispatch.connector, verifyHostName=True) Tue Jun 7 15:07:32 2016 AGENT (debug) Add entity: RouterConfigAddressEntity(distribution=closest, identity=router.config.address/0, name=router.config.address/0, prefix=my_address, type=org.apache.qpid.dispatch.router.config.address, waypoint=False) Tue Jun 7 15:07:32 2016 AGENT (debug) Add entity: RouterConfigAddressEntity(distribution=balanced, identity=router.config.address/1, name=router.config.address/1, prefix=my_queue_wp, type=org.apache.qpid.dispatch.router.config.address, waypoint=True) Tue Jun 7 15:07:32 2016 AGENT (debug) Add entity: RouterConfigLinkrouteEntity(connection=BROKER, dir=in, distribution=linkBalanced, identity=router.config.linkRoute/0, name=router.config.linkRoute/0, prefix=my_queue, type=org.apache.qpid.dispatch.router.config.linkRoute) Tue Jun 7 15:07:32 2016 AGENT (debug) Add entity: RouterConfigLinkrouteEntity(connection=BROKER, dir=out, distribution=linkBalanced, identity=router.config.linkRoute/1, name=router.config.linkRoute/1, prefix=my_queue, type=org.apache.qpid.dispatch.router.config.linkRoute) Tue Jun 7 15:07:32 2016 AGENT (debug) Add entity: RouterConfigAutolinkEntity(addr=my_queue_wp, connection=BROKER, dir=in, identity=router.config.autoLink/0, name=router.config.autoLink/0, type=org.apache.qpid.dispatch.router.config.autoLink) Tue Jun 7 15:07:32 2016 AGENT (debug) Add entity: RouterConfigAutolinkEntity(addr=my_queue_wp, connection=BROKER, dir=out, identity=router.config.autoLink/1, name=router.config.autoLink/1, type=org.apache.qpid.dispatch.router.config.autoLink)
9.1.10. The CONTAINER
Logging Module
This module provides information about the nodes related to the router. This includes only the AMQP relay node.
Tue Jun 7 14:46:18 2016 CONTAINER (trace) Container Initialized Tue Jun 7 14:46:18 2016 CONTAINER (trace) Node Type Registered - router Tue Jun 7 14:46:18 2016 CONTAINER (trace) Node of type 'router' installed as default node
9.1.11. The ERROR
Logging Module
This module provides detailed information about error conditions encountered during execution.
In this example, Router.A
failed to start when an incorrect path was specified for the router’s configuration file:
$ sudo qdrouterd --conf xxx Wed Jun 15 09:53:28 2016 ERROR (error) Python: Exception: Cannot load configuration file xxx: [Errno 2] No such file or directory: 'xxx' Wed Jun 15 09:53:28 2016 ERROR (error) Traceback (most recent call last): File "/usr/lib/qpid-dispatch/python/qpid_dispatch_internal/management/config.py", line 155, in configure_dispatch config = Config(filename) File "/usr/lib/qpid-dispatch/python/qpid_dispatch_internal/management/config.py", line 41, in __init__ self.load(filename, raw_json) File "/usr/lib/qpid-dispatch/python/qpid_dispatch_internal/management/config.py", line 123, in load with open(source) as f: Exception: Cannot load configuration file xxx: [Errno 2] No such file or directory: 'xxx' Wed Jun 15 09:53:28 2016 MAIN (critical) Router start-up failed: Python: Exception: Cannot load configuration file xxx: [Errno 2] No such file or directory: 'xxx' qdrouterd: Python: Exception: Cannot load configuration file xxx: [Errno 2] No such file or directory: 'xxx'
9.1.12. The POLICY
Logging Module
This module provides information about policies that have been configured for the router.
In this example, Router.A
has no limits on maximum connections, and the default application policy is disabled:
Tue Jun 7 15:07:32 2016 POLICY (info) Policy configured maximumConnections: 0, policyFolder: '', access rules enabled: 'false' Tue Jun 7 15:07:32 2016 POLICY (info) Policy fallback defaultApplication is disabled
9.2. Configuring Logging
You can specify the types of events that should be logged, the format of the log entries, and where those entries should be sent.
Procedure
In the router’s configuration file, add a
log
section to set the default logging properties:log { module: DEFAULT enable: LOGGING_LEVEL timestamp: yes ... }
module
-
Specify
DEFAULT
. enable
The logging level. You can specify any of the following levels (from lowest to highest):
-
trace
- provides the most information, but significantly affects system performance -
debug
- useful for debugging, but affects system performance -
info
- provides general information without affecting system performance -
notice
- provides general information, but is less verbose thaninfo
-
warning
- provides information about issues you should be aware of, but which are not errors -
error
- error conditions that you should address -
critical
- critical system issues that you must address immediately
To specify multiple levels, use a comma-separated list. You can also use
+
to specify a level and all levels above it. For example,trace,debug,warning+
enables trace, debug, warning, error, and critical levels. For default logging, you should typically use theinfo+
ornotice+
level. These levels will provide general information, warnings, and errors for all modules without affecting the performance of AMQ Interconnect.-
timestamp
-
Set this to
yes
to include the timestamp in all logs.
For information about additional log attributes, see log in the
qdrouterd.conf
man page.Add an additional
log
section for each logging module that should not follow the default logging configuration:log { module: MODULE_NAME enable: LOGGING_LEVEL ... }
module
- The name of the module for which you are configuring logging. For a list of valid modules, see Section 9.1, “Logging Modules”.
enable
The logging level. You can specify any of the following levels (from lowest to highest):
-
trace
- provides the most information, but significantly affects system performance -
debug
- useful for debugging, but affects system performance -
info
- provides general information without affecting system performance -
notice
- provides general information, but is less verbose thaninfo
-
warning
- provides information about issues you should be aware of, but which are not errors -
error
- error conditions that you should address -
critical
- critical system issues that you must address immediately
To specify multiple levels, use a comma-separated list. You can also use
+
to specify a level and all levels above it. For example,trace,debug,warning+
enables trace, debug, warning, error, and critical levels. For default logging, you should typically use theinfo+
ornotice+
level. These levels will provide general information, warnings, and errors for all modules without affecting the performance of AMQ Interconnect.-
For information about additional log attributes, see log in the
qdrouterd.conf
man page.
9.3. Viewing Log Entries
You may need to view log entries to diagnose errors, performance problems, and other important issues. A log entry consists of an optional timestamp, the logging module, the logging level, and the log message.
9.3.1. Viewing Log Entries on the Console
By default, log entries are logged to the console, and you can view them there. However, if the output
attribute is set for a particular logging module, then you can find those log entries in the specified location (stderr
, syslog
, or a file).
9.3.2. Viewing Log Entries on the CLI
You can use the qdstat
tool to view a list of recent log entries.
Procedure
Use the
qdstat --log
command to view recent log entries.You can use the
--limit
parameter to limit the number of log entries that are displayed. For more information aboutqdstat
, see qdstat man page.This example displays the last three log entries for
Router.A
:$ qdstat --log --limit=3 -r ROUTER.A Wed Jun 7 17:49:32 2017 ROUTER_CORE (none) Core action 'link_deliver' Wed Jun 7 17:49:32 2017 ROUTER_CORE (none) Core action 'send_to' Wed Jun 7 17:49:32 2017 SERVER (none) [2]:0 -> @flow(19) [next-incoming-id=1, incoming-window=61, next-outgoing-id=0, outgoing-window=2147483647, handle=0, delivery-count=1, link-credit=250, drain=false]