Embedded Syslog Manager (ESM)
The Embedded Syslog Manager (ESM) feature provides a programmable framework that allows you to filter, escalate, correlate, route, and customize system logging messages prior to delivery by the Cisco IOS XE system message logger.
Finding Feature Information
Your software release may not support all the features documented in this module. For the latest feature information and caveats, see the release notes for your platform and software release. To find information about the features documented in this module, and to see a list of the releases in which each feature is supported, see the Feature Information Table at the end of this document.
Use Cisco Feature Navigator to find information about platform support and Cisco software image support. To access Cisco Feature Navigator, go to www.cisco.com/go/cfn. An account on Cisco.com is not required.
Restrictions for Embedded Syslog Manager
Embedded Syslog Manager (ESM) depends on the Tcl 8.3.4 Cisco IOS XE subsystem, as ESM filters are written in Tcl. ESM is only available in images that support Tcl version 8.3.4 or later.
ESM filters are written in Tcl. This document assumes the reader is familiar with Tcl programming.
ESM filtering cannot be applied to SNMP "history" logging. In other words, ESM filtering will not be applied to messages logged using the logging history and snmp-server enable traps syslog commands.
Information About the Embedded Syslog Manager
- Cisco IOS XE System Message Logging
- System Logging Message Formatting
- Embedded Syslog Manager
- Syslog Filter Modules
Cisco IOS XE System Message Logging
The Cisco IOS XE system message logging (syslog) process allows the system to report and save important error and notification messages, either locally or to a remote logging server. These syslog messages include messages in a standardized format (called system logging messages, system error messages, or simply system messages) and output from debug commands. These messages are generated during network operation to assist users and Cisco TAC engineers with identifying the type and severity of a problem, or to aid users in monitoring router activity. System logging messages can be sent to console connections, monitor (TTY) connections, the system buffer, or to remote hosts.
With the introduction of the Embedded Syslog Manager, system messages can be logged independently as standard messages, XML-formatted messages, or ESM filtered messages. These outputs can be sent to any of the traditional syslog targets. For example, you could enable standard logging to the console connection, XML-formatted message logging to the buffer, and ESM filtered message logging to the monitor. Similarly, each type of output could be sent to different remote hosts. A benefit of separate logging processes is that if, for example, there is some problem with the ESM filter modules, standard logging will not be affected.
System Logging Message Formatting
System logging messages take the following format:
%<facility>-<severity>-<mnemonic>: <message-text>
For example:
%LINK-5-CHANGED: Interface Serial3/3, changed state to administratively down
Usually, these messages are proceeded by additional text, such as the timestamp and error sequence number:
<sequence-number>: <timestamp>:%<facility>-<severity>-<mnemonic>: <message-text>
For example:
000013: Mar 18 14:52:10.039:%LINK-5-CHANGED: Interface Serial3/3, changed state to administratively down
Note |
The timestamp format used in system logging messages is determined by the service timestamps global configuration mode command. The service sequence-numbers global configuration command enables or disables the leading sequence number. An asterisk (*) before the time indicates that the time may be incorrect because the system clock has not synchronized to a reliable time source. |
Embedded Syslog Manager
The Embedded Syslog Manager (ESM) is a feature integrated in Cisco IOS XE software that allows complete control over system message logging at the source. ESM provides a programmatic interface to allow you to write custom filters that meet your specific needs in dealing with system logging. Benefits of this feature include:
- Customization--Fully customizable processing of system logging messages, with support for multiple, interfacing syslog collectors.
- Severity escalation for key messages--The ability to configure your own severity levels for syslog messages instead of using the system-defined severity levels.
- Specific message targeting--The ability to route specific messages or message types, based on type of facility or type of severity, to different syslog collectors.
- SMTP-base e-mail alerts--Capability for notifications using TCP to external servers, such as TCP-based syslog collectors or Simple Mail Transfer Protocol (SMTP) servers.
- Message Limiting--The ability to limit and manage syslog "message storms" by correlating device-level events.
The ESM is not a replacement for the current UDP-based syslog mechanism; instead, it is an optional subsystem that can operate in parallel with the current system logging process. For example, you can continue to have the original syslog message stream collected by server A, while the filtered, correlated, or otherwise customized ESM logging stream is sent to server B. All of the current targets for syslog messages (console, monitor, buffer, and syslog host list) can be configured to receive either the original syslog stream or the ESM stream. The ESM stream can be further divided into user-defined streams and routed to collectors accordingly.
Syslog Filter Modules
To process system logging messages, the ESM uses syslog filter modules. Syslog filter modules are merely scripts written in the Tcl script language stored in local system memory or on a remote file server. The ESM is customizable because you can write and reference your own scripts.
Syslog filter modules can be written and stored as plain-text files or as precompiled files. Tcl script pre-compiling can be done with tools such as TclPro. Precompiled scripts allow a measure of security and managed consistency because they cannot be edited.
Note |
As Tcl script modules contain executable commands, you should manage the security of these files in the same way you manage configuration files. |
How to Use the Embedded Syslog Manager
Writing ESM Syslog Filter Modules
Before referencing syslog filter modules in the ESM configuration, you must write or obtain the modules you wish to apply to system logging messages. Syslog filter modules can be stored in local system memory, or on a remote file server. To write syslog filter modules, you should understand the following concepts:
- The ESM Filter Process
- Syslog Filter Module Input
- Normal ESM Filter Processing
- Background ESM Filter Processing
- What to Do Next
The ESM Filter Process
When ESM is enabled, all system logging messages are processed through the referenced syslog filter modules. Syslog filter modules are processed in their order in the filter chain. The position of a syslog filter module in the filter chain is determined by the position tag applied in the logging filter global configuration mode command. If a position is not specified, the modules are processed in the order in which they were added to the configuration.
The output of each filter module is used as the input for the next filter module in the chain. In other words, the Tcl global variable containing the original syslog message (::orig_msg) is set to the return value of each filter before calling the next filter in the chain. Thus, if a filter returns NULL, no message will be sent out to the ESM stream. Once all filters have processed the message, the message is enqueued for distribution by the logger.
The console, buffer, monitor, and syslog hosts can be configured to receive a particular message stream (normal, XML, or ESM). The syslog hosts can be further restricted to receive user-defined numbered streams. Each target examines each message and accepts or rejects the message based on its stream tag. ESM filters can change the destination stream by altering the messages' stream tag by changing the Tcl global variable "::stream".
Syslog Filter Module Input
When ESM is enabled, system logging messages are sent to the logging process. Each of the data elements in the system logging message, as well as the formatted syslog message as a whole, are recorded as Tcl global variables. The data elements for the syslog message are as follows:
<sequence-number>: <timestamp>:%<facility>-<severity>-<mnemonic>: <message-text>
The message-text will often contain message-arguments.
When messages are received on a syslog host a "syslog-count" number is also added:
<syslog-count>: <sequence-number>: <timestamp>:%<facility>-<severity>-<mnemonic>: <message-text>
For example:
000415: .Jan 15 21:56:00: %SYS-5-CONFIG_I: Configured from console by console
The table below lists the Tcl script input variables used in syslog filter modules. The syslog message data that the filter must operate on are passed as Tcl global namespace variables. Therefore, variables should be prefixed by a double-colon within the script module.
Table 1 | Valid Variables for Syslog Filter Modules |
Normal ESM Filter Processing
Each time a system logging message is generated, the syslog filter modules are called in a series. This series is determined by the ::module_position variable, which in turn is typically the order in which the modules are referenced in the system configuration (the order in which they are configured).
The output of one filter module becomes the input to the next. Because the input to the filters are the Tcl global namespace variables (as listed in the table above), each filter can change any or all of these variables depending upon the purpose of the filter.
The only Tcl global variables that are automatically updated by the ESM framework between subsequent filter executions are the ::orig_msg and ::cli_args variables. The framework automatically sets the value of ::orig_msg to the return value of the filter module. Thus a filter that is designed to alter or filter the original message must not manually set the value for the ::orig_msg variable; the filter only needs to return the desired value. For example, the following one-line ESM filter
return "This is my new syslog message."
would ignore any message passed to it, and always change the output to the constant string "This is my new syslog message." If the module was the last filter in the chain, all ESM targets would receive this string as the final syslog message.
The one-line ESM filter
return ""
would block all syslog messages to the ESM stream. For example, the line
return $::orig_msg
would do nothing but pass the message along to the next filter in the chain. Thus, an ESM filter designed to suppress unwanted messages would look something like this:
if { [my_procedure_to_check_this_message] == 1 } { return $::orig_msg } else { return "" }
Depending upon their design, some filters may not use the ::orig_msg variable at all, but rather reconstruct a syslog message from its data elements (using ::format, ::msg_args, ::timestamp, and so on). For example, an XML tagging filter will tag the individual data elements, and disregard the original formatted message. It is important for such modules to check the ::orig_msg variable at the beginning of the Tcl script, so that if previous filter indicated that the message should not be sent out (::orig_msg is NULL), it would not bother to process the message, but simply return NULL also.
Cisco IOS XE commands can also be added to syslog filter modules using the exec and config Tcl commands. For example, if you wanted to add the source IP address to the syslog messages, and syslog messages were configured to be sent from the Ethernet 2/0 interface (using the logging source-interface command) you could issue the show interface Ethernet 2/0 command during the module initialization by using the exec Tcl command within the script:
set source_ip_string [exec show ip int E2/0 | inc Internet] puts $source_ip_string " Internet address is 10.4.2.63/24"
The script should then pass the output of that command to the syslog message.
Background ESM Filter Processing
In Tcl it is possible to queue commands for processing in the future by using the after Tcl command. The most common use of this command is to correlate (gather and summarize) events over a fixed interval of time, called the "correlation window". Once the window of interest expires, the filter will need to "wake up", and calculate or summarize the events that occurred during the window, and often send out a new syslog message to report the events. This background process is handled by the ESM Event Loop process, which allows the Tcl interpreter to execute queued commands after a certain amount of time has passed.
If your syslog filter module needs to take advantage of correlation windows, it must use the after Tcl command to call a summary procedure once the correlation window expires (see examples in Appendix A). Since there is no normal filter chain processing when background processes are run, in order to produce output these filters must make use of one of two ESM Tcl extensions: errmsg or esm_errmsg.
During background processing, the commands that have been enqueued by the after command are not run in the context of the filter chain (as in normal processing), but rather are autonomous procedures that are executed in series by the Tcl interpreter. Thus, these background procedures should not operate on the normal Tcl global namespace variables (except for setting the global namespace variables for the next filter when using esm_errmsg), but should operate on variables stored in their own namespace. If these variables are declared outside of a procedure definition, they will be persistent from call to call.
The purpose of the errmsg Tcl command is to create a new message and send it out for distribution, bypassing any other syslog filter modules. The syntax of the errmsg command is:
errmsg <severity> <stream> <message_string>
The purpose of the esm_errmsg Tcl command is to create a new message, process it with any syslog filter modules below it in the filter chain, and then send it out for distribution. The syntax of the esm_errmsg command is:
esm_errmsg <module_position>
The key difference between the errmsg() Tcl function and the esm_errmsg() Tcl function is that errmsg ignores the filters and directly queues a message for distribution, while esm_errmsgwill send a syslog message down the chain of filters.
In the following example, a new syslog message is created and sent out tagged as Alert severity 1 to the configured ESM logging targets (stream 2). One can assume the purpose of this filter would be to suppress the individual SYS-5-CONFIG messages over a thirty minute correlation window, and send out a summary message at the end of the window.
errmsg 1 2 "*Jan 24 09:34:02.539: %SYS-1-CONFIG_I: There have been 12
configuration changes to the router between Jan 24 09:04:02.539 and Jan 24
09:34:01.324"
In order to use esm_errmsg, since the remaining filters below this one will be called, this background process must populate the needed TCL global namespace variables prior to calling esm_errmsg. Passing the ::module_position tells the ESM framework which filter to start with. Thus, filters using the esm_errmsg command should store their ::module_position (passed in the global namespace variables during normal processing) in their own namespace variable for use in background processing. Here is an example:
proc ::my_filter_namespace::my_summary_procedure{} { set ::orig_msg "*Jan 24 09:34:02.539: %SYS-1-CONFIG_I: There have been 12 configuration changes to the router between Jan 24 09:04:02.539 and Jan 24 09:34:01.324" set ::timestamp "*Jan 24 09:34:02.539" set ::severity 1 set ::stream 2 set ::traceback "" set ::pid "" set ::process "" set ::format "There have been %d configuration changes to the router between %s and %s" set ::msg_args {12 "Jan 24 09:04:01.539" "Jan 24 09:34:01.324"} esm_errmsg $::my_filter_namespace::my_module_position }
The benefit of setting all the global namespace variables for the esm_errmsg command is that your filters will be modular, and it will not matter what order they are used in the ESM framework. For example, if you wish all of the messages destined for the ESM targets to suffixed with the message originator's hostname, you could write a one-line "hostname" filter and place it at the bottom of the filter chain:
return "$::orig_msg -- $::hostname"
In this example, if any of your filters generate new messages during background processing and they use esm_errmsg instead of errmsg, these messages will be clearly suffixed with the hostname.
What to Do Next
After creating your syslog filter module, you should store the file in a location accessible to the router. You can copy the file to local system memory, or store it on a network file server.
Configuring the Embedded Syslog Manager
To configure the ESM, specify one or more filters to be applied to generated syslog messages, and specify the syslog message target.
One or more syslog filter modules must be available to the router.
- logging [console | buffered | monitor] filtered [level]
- or
- logging host {ip-address | host-name} filtered [stream stream-id]
DETAILED STEPS
Configuration Examples for the Embedded Syslog Manager
Configuring the Embedded Syslog Manager Example
In the following example, ESM filter logging is enabled for the console connection, standard logging is enabled for the monitor connection and for the buffer, and XML-formatted logging is enabled for the host at 209.165.200.225:
R outer(config)# logging filter tftp://209.165.200.225/ESM/escalate.tc l Router(config)# logging filter slot0:/email.tcl user@example.com Router(config)# logging filter slot0:/email_guts.tcl Router(config)# logging console filtered Router(config)# logging monitor 4 Router(config)# logging buffered debugging Router(config)# logging host 209.165.200.225 xml Router(config)# end Router# show logging Syslog logging: enabled (0 messages dropped, 8 messages rate-limited, 0 flushes, 0 overruns, xml disabled, filtering enabled) Console logging: level debugging, 21 messages logged, xml disabled, filtering enabled Monitor logging: level warnings , 0 messages logged, xml disabled, filtering disabled Buffer logging: level debugging, 30 messages logged, xml disabled, filtering disabled Logging Exception size (8192 bytes) Count and timestamp logging messages: disabled Filter modules: tftp://209.165.200.225/ESM/escalate.tcl slot0:/email.tcl user@example.com Trap logging: level informational, 0 message lines logged Logging to 209.165.200.225, 0 message lines logged, xml enabled, filtering disabled Log Buffer (8192 bytes): *Jan 24 09:34:28.431: %SYS-5-CONFIG_I: Configured from console by console *Jan 24 09:34:51.555: %SYS-5-CONFIG_I: Configured from console by console *Jan 24 09:49:44.295: %SYS-5-CONFIG_I: Configured from console by console Router#
Syslog Filter Module Example
Syslog Script Modules are Tcl scripts. The following examples are provided to assist you in developing your own Syslog Script Modules.
Note |
These script modules are provided as examples only, and are not supported by Cisco Systems, Inc. No guarantees, expressed or implied, are provided for the functionality or impact of these scripts. |
This appendix contains the following syslog filter module examples:
- Severity Escalation Example
- Message Counting Example
- XML Tagging Example
- SMTP-based E-mail Alert Example
- Stream Example
- Source IP Tagging Example
Severity Escalation Example
This ESM syslog filter module example watches for a single mnemonic (supplied via the first CLI argument) and escalates the severity of the message to that specified by the second CLI argument.
# =================================================================== # Embedded Syslog Manager || || # || || # Severity Escalation Filter |||| |||| # ..:||||||:..:||||||:.. # ------------------------ # C i s c o S y s t e m s # ==================================================================== # # Usage: Set CLI Args to "mnemonic new_severity" # # Namespace: global # Check for null message if { [string length $::orig_msg] == 0} { return "" } if { [info exists ::cli_args] } { set args [split $::cli_args] if { [ string compare -nocase [lindex $args 0] $::mnemonic ] == 0 } { set ::severity [lindex $args 1] set sev_index [ string first [lindex $args 0] $::orig_msg ] if { $sev_index >= 2 } { incr sev_index -2 return [string replace $::orig_msg $sev_index $sev_index \ [lindex $args 1]] } } } return $::orig_msg
Message Counting Example
This ESM syslog filter module example is divided into two files for readability. The first file allows the user to configure those messages that they wish to count and how often to summarize (correlation window) by populating the msg_to_watch array. The actual procedures are in the counting_guts.tcl file. Note the use of the separate namespace "counting" to avoid conflict with other ESM filters that may also perform background processing.
# =================================================================== # Embedded Syslog Manager || || # || || # Message Counting Filter |||| |||| # ..:||||||:..:||||||:.. # ------------------------ # C i s c o S y s t e m s
# ====================================================================
# # Usage: # 1) Define the location for the counting_guts.tcl script # # 2) Define message categories to count and how often to dump them (sec) # by populating the "msg_to_watch" array below. # Here we define category as facility-severity-mnemonic # Change dump time to 0 to disable counting for that category # # Namespace: counting namespace eval ::counting { set sub_script_url tftp://123.123.123.123/ESM/counting_guts.tcl array set msg_to_watch { SYS-5-CONFIG_I 5 } # ======================= End User Setup ============================== # Initialize processes for counting if { [info exists init] == 0 } { source $sub_script_url set position $module_position } # Process the message process_category } ;# end namespace counting
Message Counting Support Module (counting_guts.tcl)
# =================================================================== # Embedded Syslog Manager || || # || || # Message Counting Support Module |||| |||| # ..:||||||:..:||||||:.. # (No User Modification) ------------------------ # C i s c o S y s t e m s
# ====================================================================
namespace eval ::counting { # namespace variables array set cat_msg_sev {} array set cat_msg_traceback {} array set cat_msg_pid {} array set cat_msg_proc {} array set cat_msg_ts {} array set cat_msg_buginfseq {} array set cat_msg_name {} array set cat_msg_fac {} array set cat_msg_format {} array set cat_msg_args {} array set cat_msg_count {} array set cat_msg_dump_ts {} # Should I count this message ? proc query_category {cat} { variable msg_to_watch if { [info exists msg_to_watch($cat)] } { return $msg_to_watch($cat) } else { return 0 } } proc clear_category {index} { variable cat_msg_sev variable cat_msg_traceback variable cat_msg_pid variable cat_msg_proc variable cat_msg_ts variable cat_msg_buginfseq variable cat_msg_name variable cat_msg_fac variable cat_msg_format variable cat_msg_args variable cat_msg_count variable cat_msg_dump_ts unset cat_msg_sev($index) cat_msg_traceback($index) cat_msg_pid($index)\ cat_msg_proc($index) cat_msg_ts($index) \ cat_msg_buginfseq($index) cat_msg_name($index) \ cat_msg_fac($index) cat_msg_format($index) cat_msg_args($index)\ cat_msg_count($index) cat_msg_dump_ts($index) } # send out the counted messages proc dump_category {category} { variable cat_msg_sev variable cat_msg_traceback variable cat_msg_pid variable cat_msg_proc variable cat_msg_ts variable cat_msg_buginfseq variable cat_msg_name variable cat_msg_fac variable cat_msg_format variable cat_msg_args variable cat_msg_count variable cat_msg_dump_ts variable poll_interval set dump_timestamp [cisco_service_timestamp] foreach index [array names cat_msg_count $category] { set fsm "$cat_msg_fac($index)-$cat_msg_sev($index)-$cat_msg_name($index)" set ::orig_msg \ [format "%s%s: %%%s: %s %s %s %s - (%d occurence(s) between %s and %s)"\ $cat_msg_buginfseq($index)\ $dump_timestamp\ $fsm \ [uplevel 1 [linsert $cat_msg_args($index) 0 ::format \ $cat_msg_format($index) ]] \ $cat_msg_pid($index) \ $cat_msg_proc($index) \ $cat_msg_traceback($index) \ $cat_msg_count($index) \ $cat_msg_ts($index) \ $dump_timestamp] # Prepare for remaining ESM filters set ::severity $cat_msg_sev($index) set ::traceback $cat_msg_traceback($index) set ::pid $cat_msg_pid($index) set ::process $cat_msg_proc($index) set ::timestamp $cat_msg_ts($index) set ::buginfseq $cat_msg_buginfseq($index) set ::mnemonic $cat_msg_name($index) set ::facility $cat_msg_fac($index) set ::format $cat_msg_format($index) set ::msg_args [split $cat_msg_args($index)] esm_errmsg $counting::position clear_category $index } } # See if this message already has come through since the last dump. # If so, increment the count, otherwise store it. proc process_category {} { variable cat_msg_sev variable cat_msg_traceback variable cat_msg_pid variable cat_msg_proc variable cat_msg_ts variable cat_msg_buginfseq variable cat_msg_name variable cat_msg_fac variable cat_msg_format variable cat_msg_args variable cat_msg_count variable cat_msg_dump_ts if { [string length $::orig_msg] == 0} { return "" } set category "$::facility-$::severity-$::mnemonic" set correlation_window [expr [ query_category $category ] * 1000] if { $correlation_window == 0 } { return $::orig_msg } set message_args [join $::msg_args] set index "$category,[lindex $::msg_args 0]" if { [info exists cat_msg_count($index)] } { incr cat_msg_count($index) } else { set cat_msg_sev($index) $::severity set cat_msg_traceback($index) $::traceback set cat_msg_pid($index) $::pid set cat_msg_proc($index) $::process set cat_msg_ts($index) $::timestamp set cat_msg_buginfseq($index) $::buginfseq set cat_msg_name($index) $::mnemonic set cat_msg_fac($index) $::facility set cat_msg_format($index) $::format set cat_msg_args($index) $message_args set cat_msg_count($index) 1 set cat_msg_dump_ts($index) [clock seconds] catch [after $correlation_window counting::dump_category $index] } return "" } # Initialized set init 1 } ;#end namespace counting
XML Tagging Example
This ESM syslog filter module applies user defined XML tags to syslog messages.
# =================================================================== # Embedded Syslog Manager || || # || || # XML Tagging Filter |||| |||| # ..:||||||:..:||||||:.. # ------------------------ # C i s c o S y s t e m s # =================================================================== # # Usage: Define desired tags below. # # Namespace: xml # Check for null message if { [string length $::orig_msg] == 0} { return "" } namespace eval xml { #### define tags #### set MSG_OPEN "<ios-log-msg>" set MSG_CLOSE "</ios-log-msg>" set FAC_OPEN "<facility>" set FAC_CLOSE "</facility>" set SEV_OPEN "<severity>" set SEV_CLOSE "</severity>" set MNE_OPEN "<msg-id>" set MNE_CLOSE "</msg-id>" set SEQ_OPEN "<seq>" set SEQ_CLOSE "</seq>" set TIME_OPEN "<time>" set TIME_CLOSE "</time>" set ARGS_OPEN "<args>" set ARGS_CLOSE "</args>" set ARG_ID_OPEN "<arg id=" set ARG_ID_CLOSE "</arg>" set PROC_OPEN "<proc>" set PROC_CLOSE "</proc>" set PID_OPEN "<pid>" set PID_CLOSE "</pid>" set TRACE_OPEN "<trace>" set TRACE_CLOSE "</trace>" # ======================= End User Setup ============================== #### clear result #### set result "" #### message opening, facility, severity, and name #### append result $MSG_OPEN $FAC_OPEN $::facility $FAC_CLOSE $SEV_OPEN $::severity $SEV_CLOSE $MNE_OPEN $::mnemonic $MNE_CLOSE #### buginf sequence numbers #### if { [string length $::buginfseq ] > 0 } { append result $SEQ_OPEN $::buginfseq $SEQ_CLOSE } #### timestamps #### if { [string length $::timestamp ] > 0 } { append result $TIME_OPEN $::timestamp $TIME_CLOSE } #### message args #### if { [info exists ::msg_args] } { if { [llength ::msg_args] > 0 } { set i 0 append result $ARGS_OPEN foreach arg $::msg_args { append result $ARG_ID_OPEN $i ">" $arg $ARG_ID_CLOSE incr i } append result $ARGS_CLOSE } } #### traceback #### if { [string length $::traceback ] > 0 } { append result $TRACE_OPEN $::traceback $TRACE_CLOSE } #### process #### if { [string length $::process ] > 0 } { append result $PROC_OPEN $::process $PROC_CLOSE } #### pid #### if { [string length $::pid ] > 0 } { append result $PID_OPEN $::pid $PID_CLOSE } #### message close #### append result $MSG_CLOSE return "$result" } ;# end namespace xml
SMTP-based E-mail Alert Example
This ESM syslog filter module example watches for configuration messages and sends them to the e-mail address supplied as a CLI argument. This filter is divided into two files. The first file implements the filter, and the second file implements the SMTP client.
# =================================================================== # Embedded Syslog Manager || || # || || # Email Filter |||| |||| # (Configuration Change Warning) ..:||||||:..:||||||:.. # ------------------------ # C i s c o S y s t e m s # =================================================================== # Usage: Provide email address as CLI argument. Set email server IP in # email_guts.tcl # # Namespace: email if { [info exists email::init] == 0 } { source tftp://123.123.123.123/ESM/email_guts.tcl } # Check for null message if { [string length $::orig_msg] == 0} { return "" } if { [info exists ::msg_args] } { if { [string compare -nocase CONFIG_I $::mnemonic ] == 0 } { email::sendmessage $::cli_args $::mnemonic \ [string trim $::orig_msg] } } return $::orig_msg
E-mail Support Module (email_guts.tcl)
# =================================================================== # Embedded Syslog Manager || || # || || # Email Support Module |||| |||| # ..:||||||:..:||||||:.. # ------------------------ # C i s c o S y s t e m s # =================================================================== # # Usage: Set email host IP, from, and friendly strings below. # namespace eval email { set sendmail(smtphost) 64.102.17.214 set sendmail(from) $::hostname set sendmail(friendly) $::hostname proc sendmessage {toList subject body} { variable sendmail set smtphost $sendmail(smtphost) set from $sendmail(from) set friendly $sendmail(friendly) set sockid [socket $smtphost 25] ## DEBUG set status [catch { puts $sockid "HELO $smtphost" flush $sockid set result [gets $sockid] puts $sockid "MAIL From:<$from>" flush $sockid set result [gets $sockid] foreach to $toList { puts $sockid "RCPT To:<$to>" flush $sockid } set result [gets $sockid] puts $sockid "DATA " flush $sockid set result [gets $sockid] puts $sockid "From: $friendly <$from>" foreach to $toList { puts $sockid "To:<$to>" } puts $sockid "Subject: $subject" puts $sockid "\n" foreach line [split $body "\n"] { puts $sockid " $line" } puts $sockid "." puts $sockid "QUIT" flush $sockid set result [gets $sockid] } result] catch {close $sockid } if {$status} then { return -code error $result } } } ;# end namespace email set email::init 1
Stream Example
This ESM syslog filter module example watches for a given facility (first CLI argument) and routes these messages to a given stream (second CLI argument).
# =================================================================== # Embedded Syslog Manager || || # || || # Stream Filter (Facility) |||| |||| # ..:||||||:..:||||||:.. # ------------------------ # C i s c o S y s t e m s # =================================================================== # Usage: Provide facility and stream as CLI arguments. # # Namespace: global # Check for null message # ======================= End User Setup ============================== set args [split $::cli_args] if { [info exists ::msg_args] } { if { $::facility == [lindex $args 0] } { set ::stream [lindex $args 1] } } return $::orig_msg}
Source IP Tagging Example
The logging source-interface CLI command can be used to specify a source IP address in all syslog packets sent from the router. The following syslog filter module example demonstrates the use of show CLI commands (show running-config and show ip interface in this case) within a filter module to add the source IP address to syslog messages. The scriptlooks for the local namespace variable "source_ip::init" first. If the variable is not defined in the first syslog message processed, the filter will run the show commands and use regular expressions to get the source-interface and then its IP address.
Note that in this script, the show commands are only run once. If the source-interface or its IP address were to be changed, the filter would have to be re-initialized to pick up the new information. (You could have the show commands run on every syslog message, but this would not scale very well.)
# =================================================================== # Embedded Syslog Manager || || # || || # Source IP Module |||| |||| # ..:||||||:..:||||||:.. # ------------------------ # C i s c o S y s t e m s # =================================================================== # Usage: Adds Logging Source Interface IP address to all messages. # # Namespace:source_ip # # ======================= End User Setup ============================== namespace eval ::source_ip { if { [info exists init] == 0 } { if { [catch {regexp {^logging source-interface (.*$)} [exec show run | inc logging source-interface] match source_int}]} { set suffix "No source interface specified" } elseif { [catch {regexp {Internet address is (.*)/.*$} [exec show ip int $source_int | inc Internet] match ip_addr}]} { set suffix "No IP address configured for source interface" } else { set suffix $ip_addr } set init 1 } if { [string length $::orig_msg] == 0} { return "" } return "$::orig_msg - $suffix" } ;# end namespace source_ip
Additional References
The following sections provide references related to the Embedded Syslog Manager feature.
Related Documents
Related Topic |
Document Title |
---|---|
Tcl 8.3.4 Support in Cisco IOS XE software |
Cisco IOS Scripting with Tcl module |
Cisco IOS XE commands |
For information about all Cisco IOS XE commands, use the Command Lookup Tool at http://tools.cisco.com/Support/CLILookup or the Cisco IOS Master Command List, All Releases , at http://www.cisco.com/en/US/docs/ios/mcl/allreleasemcl/all_book.html . |
Standards
Standard |
Title |
---|---|
No new or modified standards are supported, and support for existing standards has not been modified. |
-- |
MIBs
MIB |
MIBs Link |
---|---|
No new or modified standards are supported, and support for existing standards has not been modified. |
To locate and download MIBs for selected platforms, Cisco IOS XE software releases, and feature sets, use Cisco MIB Locator found at the following URL: |
RFCs
RFCs1 |
Title |
---|---|
RFC-3164 |
The BSD Syslog Protocol |
Technical Assistance
Description |
Link |
---|---|
The Cisco Support website provides extensive online resources, including documentation and tools for troubleshooting and resolving technical issues with Cisco products and technologies. To receive security and technical information about your products, you can subscribe to various services, such as the Product Alert Tool (accessed from Field Notices), the Cisco Technical Services Newsletter, and Really Simple Syndication (RSS) Feeds. Access to most tools on the Cisco Support website requires a Cisco.com user ID and password. |
Feature Information for Embedded Syslog Manager
The following table provides release information about the feature or features described in this module. This table lists only the software release that introduced support for a given feature in a given software release train. Unless noted otherwise, subsequent releases of that software release train also support that feature.
Use Cisco Feature Navigator to find information about platform support and Cisco software image support. To access Cisco Feature Navigator, go to www.cisco.com/go/cfn. An account on Cisco.com is not required.
Table 2 | Feature Information for Embedded Syslog Manager |
Feature Name |
Releases |
Feature Information |
---|---|---|
Embedded Syslog Manager |
Cisco IOS XE Release 2.1 |
The Embedded Syslog Manager (ESM) feature provides a programmable framework that allows you to filter, escalate, correlate, route, and customize system logging messages prior to delivery by the Cisco IOS system message logger. The following commands were introduced or modified by this feature: logging buffered filtered , logging console filtered, logging filter, logging host, logging monitor filtered, logging origin-id, show logging |
Glossary
console --In the context of this feature, specifies the connection (CTY or console line) to the console port of the router. Typically, this is a terminal attached directly to the console port, or a PC with a terminal emulation program. Corresponds to the show terminal command.
monitor --In the context of this feature, specifies the TTY (TeleTYpe terminal) line connection at a line port. In other words, the "monitor" keyword corresponds to a terminal line connection or a Telnet (terminal emulation) connection. TTY lines (also called ports) communicate with peripheral devices such as terminals, modems, and serial printers. An example of a TTY connection is a PC with a terminal emulation program connected to the device using a dial-up modem.
SEMs --Abbreviation for system error messages. "System error messages" is the term formerly used for messages generated by the system logging (syslog) process. Syslog messages use a standardized format, and come in 8 severity levels, from "emergencies" (level 0) to "debugging" (level 7). The term "system error message" is actually misleading, as these messages can include notifications of router activity beyond "errors" (such as informational notices).
syslog --Abbreviation for the system message logging process in Cisco IOS XE software. Also used to identify the messages generated, as in "syslog messages." Technically, the term "syslog" refers only to the process of logging messages to a remote host or hosts, but is commonly used to refer to all Cisco IOS system logging processes.
trap --A trigger in the system software for sending error messages. In the context of this feature, "trap logging" means logging messages to a remote host. The remote host is actually a syslog host from the perspective of the device sending the trap messages, but because the receiving device typically provides collected syslog data to other devices, the receiving device is also referred to as a "syslog server."
Cisco and the Cisco Logo are trademarks of Cisco Systems, Inc. and/or its affiliates in the U.S. and other countries. A listing of Cisco's trademarks can be found at www.cisco.com/go/trademarks. Third party trademarks mentioned are the property of their respective owners. The use of the word partner does not imply a partnership relationship between Cisco and any other company. (1005R)
Any Internet Protocol (IP) addresses and phone numbers used in this document are not intended to be actual addresses and phone numbers. Any examples, command display output, network topology diagrams, and other figures included in the document are shown for illustrative purposes only. Any use of actual IP addresses or phone numbers in illustrative content is unintentional and coincidental.