List:Commits« Previous MessageNext Message »
From:tim Date:July 26 2007 11:33pm
Subject:bk commit into 5.1 tree (tsmith:1.2577) BUG#29992
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of tsmith. When tsmith does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2007-07-26 17:33:21-06:00, tsmith@stripped +1 -0
  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.

  scripts/mysqld_safe.sh@stripped, 2007-07-26 17:33:20-06:00, tsmith@stripped +95 -24
    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.

diff -Nrup a/scripts/mysqld_safe.sh b/scripts/mysqld_safe.sh
--- a/scripts/mysqld_safe.sh	2007-07-09 16:09:19 -06:00
+++ b/scripts/mysqld_safe.sh	2007-07-26 17:33:20 -06:00
@@ -14,12 +14,17 @@
 KILL_MYSQLD=1;
 MYSQLD=
 niceness=0
-# Default on, unless --log-error is specified (and before options are parsed)
-syslog=2
+# Initial logging status: error log is not open, and not using syslog
+logging=init
+want_syslog=0
+syslog_tag=
 user=@MYSQLD_USER@
 pid_file=
 err_log=
 
+syslog_tag_mysqld=mysqld
+syslog_tag_mysqld_safe=mysqld_safe
+
 trap '' 1 2 3 15			# we shouldn't let anyone kill us
 
 umask 007
@@ -47,6 +52,7 @@ Usage: $0 [OPTIONS]
   --skip-kill-mysqld         Don't try to kill stray mysqld processes
   --syslog                   Log messages to syslog with 'logger'
   --skip-syslog              Log messages to error log
+  --syslog-tag=TAG           Pass -t "mysqld-TAG" to 'logger'
 
 All other options are passed to the mysqld program.
 
@@ -54,18 +60,47 @@ EOF
         exit 1
 }
 
+my_which ()
+{
+  save_ifs="${IFS-UNSET}"
+  IFS=:
+  for file
+  do
+    for dir in $PATH
+    do
+      if test -f $dir/$file
+      then
+        echo "$dir/$file"
+        continue 2
+      fi
+    done
+    echo "my_which: no $file in ($PATH)" >&2
+    return 1
+  done
+  if [ "$save_ifs" = UNSET ]
+  then
+    unset IFS
+  else
+    IFS="$save_ifs"
+  fi
+  return 0
+}
+
 log_generic () {
   priority="$1"
   shift
 
   msg="`date +'%y%m%d %H:%M:%S'` mysqld_safe $*"
   echo "$msg"
-  if [ $syslog -eq 0 ]
-  then
-    echo "$msg" >> "$err_log"
-  else
-    logger -i -t mysqld_safe -p "$priority" "$*"
-  fi
+  case $logging in
+    init) ;;  # Just echo the message, don't save it anywhere
+    file) echo "$msg" >> "$err_log" ;;
+    syslog) logger -t "$syslog_tag_mysqld_safe" -p "$priority" "$*" ;;
+    *)
+      echo "Internal program error (non-fatal):" \
+           " unknown logging method '$logging'" >&2
+      ;;
+  esac
 }
 
 log_error () {
@@ -78,15 +113,27 @@ log_notice () {
 
 eval_log_error () {
   cmd="$1"
-  if [ $syslog -eq 0 ]
-  then
-    cmd="$cmd >> "`shell_quote_string "$err_log"`" 2>&1"
-  else
-    # mysqld often (not always) prefixes messages on stdout with a
-    # timestamp in the form of '%y%m%d %H:%M:%S '; this is redundant
-    # when logging via syslog, so strip it
-    cmd="$cmd 2>&1 | sed -e 's/^[0-9]\{6\} [0-9:]\{8\}  *//' | logger -i -t mysqld -p daemon.error"
-  fi
+  case $logging in
+    file) cmd="$cmd >> "`shell_quote_string "$err_log"`" 2>&1" ;;
+    syslog)
+      cmd="$cmd 2>&1"
+
+      # mysqld often (not always) prefixes messages on stdout with a
+      # timestamp in the form of '%y%m%d %H:%M:%S '; this is redundant
+      # when logging via syslog, so strip it.  However, don't strip it if
+      # sed does not have a -u (unbuffered) option
+      if sed -u -e s/a/b/ < /dev/null 2>&1 > /dev/null
+      then
+        cmd="$cmd | sed -u -e 's/^[0-9]\{6\} [0-9:]\{8\}  *//'"
+      fi
+      cmd="$cmd | logger -t '$syslog_tag_mysqld' -p daemon.error"
+      ;;
+    *)
+      echo "Internal program error (non-fatal):" \
+           " unknown logging method '$logging'" >&2
+      ;;
+  esac
+
   #echo "Running mysqld: [$cmd]"
   eval "$cmd"
 }
@@ -138,8 +185,9 @@ parse_arguments() {
       --nice=*) niceness="$val" ;;
       --open-files-limit=*) open_files="$val" ;;
       --skip-kill-mysqld*) KILL_MYSQLD=0 ;;
-      --syslog) syslog=1 ;;
-      --skip-syslog) syslog=0 ;;
+      --syslog) want_syslog=1 ;;
+      --skip-syslog) want_syslog=0 ;;
+      --syslog-tag=*) syslog_tag="$val" ;;
       --timezone=*) TZ="$val"; export TZ; ;;
 
       --help) usage ;;
@@ -252,7 +300,19 @@ parse_arguments `$print_defaults $defaul
 parse_arguments PICK-ARGS-FROM-ARGV "$@"
 
 # 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 2>&1 > /dev/null
+  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
   if [ -n "$err_log" ]
   then
@@ -279,14 +339,25 @@ then
 
   append_arg_to_args "--log-error=$err_log"
 
-  if [ $syslog -eq 1 ]
+  if [ $want_syslog -eq 1 ]
   then
     # 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
 
-  # Don't use syslog since syslog and error log don't mix well
-  syslog=0
+  # Log to err_log file
+  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
 
 USER_OPTION=""
Thread
bk commit into 5.1 tree (tsmith:1.2577) BUG#29992tim27 Jul
  • Re: bk commit into 5.1 tree (tsmith:1.2577) BUG#29992Kent Boortz28 Jul