# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#

$ModLoad immark.so # provides --MARK-- message capability
$ModLoad imuxsock.so # provides support for local system logging (e.g. via logger command)
$ModLoad imklog.so # kernel logging (formerly provided by rklogd)

$PrivDropToUser syslog
$PrivDropToGroup syslog

# Include PID in log messages
$SystemLogUsePIDFromSystem on

# Don't include hostname in log messages.
$template LogWithoutHostname,"%TIMESTAMP:::date-rfc3339% %syslogseverity-text:::uppercase% %syslogtag%%msg:::sp-if-no-1st-sp%%msg::drop-last-lf%\n"
$ActionFileDefaultTemplate LogWithoutHostname

$SystemLogRateLimitInterval 0
$RepeatedMsgReduction on

# Merge and include all *.conf files.
# This should come after any settings that are meant to be inherited by the
# *.conf files that are to be included.
$IncludeConfig /etc/rsyslog.d/*.conf

# Allow messages from upstart, which logs through /dev/klog.
$KLogPermitNonKernelFacility on

# Keep network stuff in /var/log/net.log
if (($programname == 'shill') or \
    ($programname == 'dhcpcd') or \
    ($programname == 'wpa_supplicant') or \
    ($programname == 'cromo') or \
    ($programname == 'ModemManager') or \
    ($programname == 'mist') or \
    ($programname == 'nss-get-cert') or \
    ($programname == 'openvpn') or \
    ($programname == 'openvpn-script') or \
    ($programname == 'l2tpipsec_vpn') or \
    ($programname == 'pppd') or \
    ($programname == 'wimax-manager') or \
    ($programname == 'pseudomodem') or \
    ($programname == 'arc-networkd') or \
    ($programname == 'charon')) then -/var/log/net.log

# Log important (EMERG..ERR) network stuff in /var/log/messages too,
# but discard anything less severe
if (($programname == 'shill') or \
    ($programname == 'dhcpcd') or \
    ($programname == 'wpa_supplicant') or \
    ($programname == 'cromo') or \
    ($programname == 'ModemManager') or \
    ($programname == 'mist') or \
    ($programname == 'nss-get-cert') or \
    ($programname == 'openvpn') or \
    ($programname == 'openvpn-script') or \
    ($programname == 'l2tpipsec_vpn') or \
    ($programname == 'pppd') or \
    ($programname == 'wimax-manager') or \
    ($programname == 'pseudomodem') or \
    ($programname == 'arc-networkd') or \
    ($programname == 'charon')) and $syslogseverity >= '4' then ~

# Keep tlsdate stuff in /var/log/tlsdate.log
if ($programname startswith 'tlsdate') then -/var/log/tlsdate.log
& ~  # Don't log tlsdate messages anywhere else.

# For authpolicyd and authpolicy_parser:
# - Log all messages to /var/log/authpolicy.log.
# - Log important stuff (EMERG..ERR) to /var/log/messages.
if ($programname startswith 'authpolicy') then -/var/log/authpolicy.log
if ($programname startswith 'authpolicy') and $syslogseverity >= '4' then ~

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.*;mail.none;authpriv.none;local5.none                 -/var/log/messages

# Copy these messages to tty8 to help with troubleshooting.
# Don't log authentication messages, mail, or wpa_supplicant(local6).
*.*;mail.none;authpriv.none;local6.none                 /dev/tty8

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log
