Bug #29992: syslog error logging does not flush

Don't use syslog by default; user will have to request it explicitly with the --syslog option.

Use "sed -u" to get unbuffered output from sed, if it's supported.

Otherwise, don't use sed at all - don't strip the timestamp from mysqld messages.

Also, add new --syslog-tag=FOO option, which adds "-FOO" to the tag used when logging messages to syslog (i.e., mysqld-FOO or mysqld_safe-FOO)

Also, explicitly mention where log messages are going, so user can more easily find them.

Also, check if 'logger' is in the PATH, and log to the error log file if it can't be found.
parent 8e22343c
...@@ -14,12 +14,17 @@ ...@@ -14,12 +14,17 @@
KILL_MYSQLD=1; KILL_MYSQLD=1;
MYSQLD= MYSQLD=
niceness=0 niceness=0
# Default on, unless --log-error is specified (and before options are parsed) # Initial logging status: error log is not open, and not using syslog
syslog=2 logging=init
want_syslog=0
syslog_tag=
user=@MYSQLD_USER@ user=@MYSQLD_USER@
pid_file= pid_file=
err_log= err_log=
syslog_tag_mysqld=mysqld
syslog_tag_mysqld_safe=mysqld_safe
trap '' 1 2 3 15 # we shouldn't let anyone kill us trap '' 1 2 3 15 # we shouldn't let anyone kill us
umask 007 umask 007
...@@ -46,7 +51,8 @@ Usage: $0 [OPTIONS] ...@@ -46,7 +51,8 @@ Usage: $0 [OPTIONS]
--nice=NICE Set the scheduling priority of mysqld --nice=NICE Set the scheduling priority of mysqld
--skip-kill-mysqld Don't try to kill stray mysqld processes --skip-kill-mysqld Don't try to kill stray mysqld processes
--syslog Log messages to syslog with 'logger' --syslog Log messages to syslog with 'logger'
--skip-syslog Log messages to error log --skip-syslog Log messages to error log (default)
--syslog-tag=TAG Pass -t "mysqld-TAG" to 'logger'
All other options are passed to the mysqld program. All other options are passed to the mysqld program.
...@@ -54,18 +60,46 @@ EOF ...@@ -54,18 +60,46 @@ EOF
exit 1 exit 1
} }
my_which ()
{
save_ifs="${IFS-UNSET}"
IFS=:
for file
do
for dir in $PATH
do
if [ -f "$dir/$file" ]
then
echo "$dir/$file"
continue 2
fi
done
return 1 # Failure, didn't find file in path
done
if [ "$save_ifs" = UNSET ]
then
unset IFS
else
IFS="$save_ifs"
fi
return 0 # Success
}
log_generic () { log_generic () {
priority="$1" priority="$1"
shift shift
msg="`date +'%y%m%d %H:%M:%S'` mysqld_safe $*" msg="`date +'%y%m%d %H:%M:%S'` mysqld_safe $*"
echo "$msg" echo "$msg"
if [ $syslog -eq 0 ] case $logging in
then init) ;; # Just echo the message, don't save it anywhere
echo "$msg" >> "$err_log" file) echo "$msg" >> "$err_log" ;;
else syslog) logger -t "$syslog_tag_mysqld_safe" -p "$priority" "$*" ;;
logger -i -t mysqld_safe -p "$priority" "$*" *)
fi echo "Internal program error (non-fatal):" \
" unknown logging method '$logging'" >&2
;;
esac
} }
log_error () { log_error () {
...@@ -78,15 +112,23 @@ log_notice () { ...@@ -78,15 +112,23 @@ log_notice () {
eval_log_error () { eval_log_error () {
cmd="$1" cmd="$1"
if [ $syslog -eq 0 ] case $logging in
then file) cmd="$cmd >> "`shell_quote_string "$err_log"`" 2>&1" ;;
cmd="$cmd >> "`shell_quote_string "$err_log"`" 2>&1" syslog)
else # mysqld often prefixes its messages with a timestamp, which is
# mysqld often (not always) prefixes messages on stdout with a # redundant when logging to syslog (which adds its own timestamp)
# timestamp in the form of '%y%m%d %H:%M:%S '; this is redundant # However, we don't strip the timestamp with sed here, because
# when logging via syslog, so strip it # sed buffers output (only GNU sed supports a -u (unbuffered) option)
cmd="$cmd 2>&1 | sed -e 's/^[0-9]\{6\} [0-9:]\{8\} *//' | logger -i -t mysqld -p daemon.error" # which means that messages may not get sent to syslog until the
fi # mysqld process quits.
cmd="$cmd 2>&1 | logger -t '$syslog_tag_mysqld' -p daemon.error"
;;
*)
echo "Internal program error (non-fatal):" \
" unknown logging method '$logging'" >&2
;;
esac
#echo "Running mysqld: [$cmd]" #echo "Running mysqld: [$cmd]"
eval "$cmd" eval "$cmd"
} }
...@@ -138,8 +180,9 @@ parse_arguments() { ...@@ -138,8 +180,9 @@ parse_arguments() {
--nice=*) niceness="$val" ;; --nice=*) niceness="$val" ;;
--open-files-limit=*) open_files="$val" ;; --open-files-limit=*) open_files="$val" ;;
--skip-kill-mysqld*) KILL_MYSQLD=0 ;; --skip-kill-mysqld*) KILL_MYSQLD=0 ;;
--syslog) syslog=1 ;; --syslog) want_syslog=1 ;;
--skip-syslog) syslog=0 ;; --skip-syslog) want_syslog=0 ;;
--syslog-tag=*) syslog_tag="$val" ;;
--timezone=*) TZ="$val"; export TZ; ;; --timezone=*) TZ="$val"; export TZ; ;;
--help) usage ;; --help) usage ;;
...@@ -252,7 +295,19 @@ parse_arguments `$print_defaults $defaults --loose-verbose mysqld_safe safe_mysq ...@@ -252,7 +295,19 @@ parse_arguments `$print_defaults $defaults --loose-verbose mysqld_safe safe_mysq
parse_arguments PICK-ARGS-FROM-ARGV "$@" parse_arguments PICK-ARGS-FROM-ARGV "$@"
# Determine what logging facility to use # Determine what logging facility to use
if [ -n "$err_log" -o $syslog -eq 0 ]
# Ensure that 'logger' exists, if it's requested
if [ $want_syslog -eq 1 ]
then
my_which logger > /dev/null 2>&1
if [ $? -ne 0 ]
then
log_error "--syslog requested, but no 'logger' program found."
want_syslog=0
fi
fi
if [ -n "$err_log" -o $want_syslog -eq 0 ]
then then
if [ -n "$err_log" ] if [ -n "$err_log" ]
then then
...@@ -279,14 +334,25 @@ then ...@@ -279,14 +334,25 @@ then
append_arg_to_args "--log-error=$err_log" append_arg_to_args "--log-error=$err_log"
if [ $syslog -eq 1 ] if [ $want_syslog -eq 1 ]
then then
# User explicitly asked for syslog, so warn that it isn't used # User explicitly asked for syslog, so warn that it isn't used
log_error "Can't log to error log and syslog at the same time. Remove all --log-error configuration options for --syslog to take effect. Logging to '$err_log'." log_error "Can't log to error log and syslog at the same time. Remove all --log-error configuration options for --syslog to take effect."
fi fi
# Don't use syslog since syslog and error log don't mix well # Log to err_log file
syslog=0 log_notice "Logging to '$err_log'."
logging=file
else
if [ -n "$syslog_tag" ]
then
# Sanitize the syslog tag
syslog_tag=`echo "$syslog_tag" | sed -e 's/[^a-zA-Z0-9_-]/_/g'`
syslog_tag_mysqld_safe="${syslog_tag_mysqld_safe}-$syslog_tag"
syslog_tag_mysqld="${syslog_tag_mysqld}-$syslog_tag"
fi
log_notice "Logging to syslog."
logging=syslog
fi fi
USER_OPTION="" USER_OPTION=""
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment