#
# For a description of the syntax of this configuration file,
# see scripts/kbuild/config-language.txt.
#

menu "System Logging Utilities"

INSERT

config SYSLOGD
	bool "syslogd"
	default y
	help
	  The syslogd utility is used to record logs of all the
	  significant events that occur on a system. Every
	  message that is logged records the date and time of the
	  event, and will generally also record the name of the
	  application that generated the message. When used in
	  conjunction with klogd, messages from the Linux kernel
	  can also be recorded. This is terribly useful,
	  especially for finding what happened when something goes
	  wrong. And something almost always will go wrong if
	  you wait long enough....

config FEATURE_ROTATE_LOGFILE
	bool "Rotate message files"
	default y
	depends on SYSLOGD
	help
	  This enables syslogd to rotate the message files
	  on his own. No need to use an external rotatescript.

config FEATURE_REMOTE_LOG
	bool "Remote Log support"
	default y
	depends on SYSLOGD
	help
	  When you enable this feature, the syslogd utility can
	  be used to send system log messages to another system
	  connected via a network. This allows the remote
	  machine to log all the system messages, which can be
	  terribly useful for reducing the number of serial
	  cables you use. It can also be a very good security
	  measure to prevent system logs from being tampered with
	  by an intruder.

config FEATURE_SYSLOGD_DUP
	bool "Support -D (drop dups) option"
	default y
	depends on SYSLOGD
	help
	  Option -D instructs syslogd to drop consecutive messages
	  which are totally the same.

config FEATURE_SYSLOGD_CFG
	bool "Support syslog.conf"
	default y
	depends on SYSLOGD
	help
	  Supports restricted syslogd config. See docs/syslog.conf.txt

config FEATURE_SYSLOGD_READ_BUFFER_SIZE
	int "Read buffer size in bytes"
	default 256
	range 256 20000
	depends on SYSLOGD
	help
	  This option sets the size of the syslog read buffer.
	  Actual memory usage increases around five times the
	  change done here.

config FEATURE_IPC_SYSLOG
	bool "Circular Buffer support"
	default y
	depends on SYSLOGD
	help
	  When you enable this feature, the syslogd utility will
	  use a circular buffer to record system log messages.
	  When the buffer is filled it will continue to overwrite
	  the oldest messages. This can be very useful for
	  systems with little or no permanent storage, since
	  otherwise system logs can eventually fill up your
	  entire filesystem, which may cause your system to
	  break badly.

config FEATURE_IPC_SYSLOG_BUFFER_SIZE
	int "Circular buffer size in Kbytes (minimum 4KB)"
	default 16
	range 4 2147483647
	depends on FEATURE_IPC_SYSLOG
	help
	  This option sets the size of the circular buffer
	  used to record system log messages.

config LOGREAD
	bool "logread"
	default y
	depends on FEATURE_IPC_SYSLOG
	help
	  If you enabled Circular Buffer support, you almost
	  certainly want to enable this feature as well. This
	  utility will allow you to read the messages that are
	  stored in the syslogd circular buffer.

config FEATURE_LOGREAD_REDUCED_LOCKING
	bool "Double buffering"
	default y
	depends on LOGREAD
	help
	  'logread' ouput to slow serial terminals can have
	  side effects on syslog because of the semaphore.
	  This option make logread to double buffer copy
	  from circular buffer, minimizing semaphore
	  contention at some minor memory expense.

config FEATURE_KMSG_SYSLOG
	bool "Linux kernel printk buffer support"
	default y
	depends on SYSLOGD
	select PLATFORM_LINUX
	help
	  When you enable this feature, the syslogd utility will
	  write system log message to the Linux kernel's printk buffer.
	  This can be used as a smaller alternative to the syslogd IPC
	  support, as klogd and logread aren't needed.

	  NOTICE: Syslog facilities in log entries needs kernel 3.5+.

config KLOGD
	bool "klogd"
	default y
	help
	  klogd is a utility which intercepts and logs all
	  messages from the Linux kernel and sends the messages
	  out to the 'syslogd' utility so they can be logged. If
	  you wish to record the messages produced by the kernel,
	  you should enable this option.

comment "klogd should not be used together with syslog to kernel printk buffer"
	depends on KLOGD && FEATURE_KMSG_SYSLOG

config FEATURE_KLOGD_KLOGCTL
	bool "Use the klogctl() interface"
	default y
	depends on KLOGD
	select PLATFORM_LINUX
	help
	  The klogd applet supports two interfaces for reading
	  kernel messages. Linux provides the klogctl() interface
	  which allows reading messages from the kernel ring buffer
	  independently from the file system.

	  If you answer 'N' here, klogd will use the more portable
	  approach of reading them from /proc or a device node.
	  However, this method requires the file to be available.

	  If in doubt, say 'Y'.

config LOGGER
	bool "logger"
	default y
	select FEATURE_SYSLOG
	help
	    The logger utility allows you to send arbitrary text
	    messages to the system log (i.e. the 'syslogd' utility) so
	    they can be logged. This is generally used to help locate
	    problems that occur within programs and scripts.

endmenu
