如何在MySQL上将查询记录到stdout?

sof*_*sof 5 mysql

MySQL 5.6.26

尝试将查询记录到标准输出在下面不起作用,

$ mysqld --general_log=1 --general_log_file=/dev/stdout
Run Code Online (Sandbox Code Playgroud)

use*_*679 7

我很惊讶在 MySQL 和 PostgreSQL 中做到这一点是多么困难。

下面的配置允许我将所有 MySQL 日志发送到 Docker 容器的标准输出。

内容docker-compose.yml

---
version: "3.9"
services:
  your_db:
    image: mysql:5.7-debian
    command:
      - /usr/local/bin/mysqld.sh
    environment:
      MYSQL_DATABASE: "$your_db"
      MYSQL_PASSWORD: "$your_pass"
      MYSQL_ROOT_PASSWORD: "$root_pass"
      MYSQL_USER: "$your_user"
    volumes:
      - ./my.cnf:/etc/mysql/conf.d/my.cnf:ro
      - ./mysqld.sh:/usr/local/bin/mysqld.sh:ro
    networks:
      - your_net
Run Code Online (Sandbox Code Playgroud)

内容my.cnf

[mysqld]
# Log General
general_log = 1
general_log_file = /var/log/mysql_general.log

# Log Error
log_error = /var/log/mysql_error.log

# Log Slow
slow_query_log = 1
slow_query_log_file = /var/log/mysql_slow_query.log
long_query_time = 0  # 0 has the effect of logging all queries
log_queries_not_using_indexes = 1
Run Code Online (Sandbox Code Playgroud)

内容mysqld.sh

#!/usr/bin/env bash
set -euo pipefail

##
# This script exists to work-around the fact that
# mysql does not support logging to stdout
#
# This will tail the file logs configured in ./my.cnf
##

LOG_PATHS=(
  '/var/log/mysql_general.log'
  '/var/log/mysql_error.log'
  '/var/log/mysql_slow_query.log'
)
for LOG_PATH in "${LOG_PATHS[@]}"; do
  # https://serverfault.com/a/599209
  ( umask 0 && truncate -s0 "$LOG_PATH" )
  tail --pid $$ -n0 -F "$LOG_PATH" &
done

docker-entrypoint.sh mysqld
Run Code Online (Sandbox Code Playgroud)


Sch*_*ern 2

你不能,不能直接。查询日志仅到达文件、表或无处他们似乎不参加/dev/stdout也不遵守大会-。别担心,还有更好的方法。

如果您只想查看查询日志,则可以使用各种 Unix 实用程序流式传输日志文件。tail -f是一种选择。

tail -f /path/to/query.log
Run Code Online (Sandbox Code Playgroud)

less我更喜欢使用命令打开日志并F在添加文件时继续阅读。就像tail -f,但您也可以滚动并搜索文件。

$ less /path/to/query.log
~
~
/opt/local/lib/mysql56/bin/mysqld, Version: 5.6.27-log (Source distribution). started with:
Tcp port: 0  Unix socket: (null)
Time                 Id Command    Argument
151004 16:10:51     1 Connect   schwern@localhost as  on 
                    1 Query     select @@version_comment limit 1
151004 16:10:53     1 Query     select 1
151004 16:10:54     1 Quit      
Waiting for data... (interrupt to abort)
Run Code Online (Sandbox Code Playgroud)

  • @sof 当谈到 MySQL 时,我倾向于将其归因于意外而不是设计。需要经过深思熟虑的代码才能写入文件句柄,并且有人可能认为作为一般做法避免写入特殊文件(例如“/dev/stdout”)是一个好主意。尽管我倾向于说在 STDOUT 上显示查询是一个安全问题,但它可能比将它们放入文件中“更”安全;STDOUT 的优点是短暂。 (4认同)