Rails6 のちょい足しな新機能を試す13（rails server --log-to-stdout 編）

# はじめに

Rails 6 に追加されそうな新機能を試す第13段。 今回のちょい足し機能は、 `rails server --log-to-stdout` 編です。
`rails s (rails server)` コマンドに `--log-to-stdout`, `--no-log-to-stdout` オプションが追加されて、ログを標準出力する、しないを切り替えられるようになりました。

記載時点では、Rails は 6.0.0.rc1 です。　`gem install rails --prerelease` でインストールできます。

```shell
$  rails --version
Rails 6.0.0.rc1
```

# プロジェクトを作成する

rails プロジェクトを作成します。

```shell
$ rails new sandbox6_0_0rc1
$ cd sandbox6_0_0rc1
```

# 必要に応じて config/database.yml を書き換えたり環境変数を追加する

今回は、production 環境も使いますので、DBの環境に合わせて必要に応じて config/database.yml を書き換えるか環境変数を追加するなどしてください。

```ruby:config/database.yml
production:
  <<: *default
  database: sandbox6_0_0rc1_production
  username: sandbox6_0_0rc1 # ここを書き換えるかDBにsandbox6_0_0rc1 ユーザーを追加する
  password: <%= ENV['SANDBOX6_0_0RC1_DATABASE_PASSWORD'] %> # ここを書き替えるか、SANDBOX6_0_0RC1_DATABASE_PASSWORD 環境変数を追加する
```

# db:create を実行する

bin/rails db:create を実行します。(sqlite3を使っている場合は実行しなくても大丈夫かも知れません。)

```shell
$ bin/rails db:create
$ bin/rails db:create RAILS_ENV=production
```


# `bin/rails s --help` でオプションが追加されていることを確認

`bin/rails s --help` を実行すると一番最後に、 `--log-to-stdout`, `--no-log-to-stdout` が出力されていることがわかります。

```shell-session
# rails s --help
Usage:
  rails server -u [thin/puma/webrick] [options]

Options:
  -e, [--environment=ENVIRONMENT]              # Specifies the environment to run this server under (test/development/production).
  -p, [--port=port]                            # Runs Rails on the specified port - defaults to 3000.
  -b, [--binding=IP]                           # Binds Rails to the specified IP - defaults to 'localhost' in development and '0.0.0.0' in other environments'.
  -c, [--config=file]                          # Uses a custom rackup configuration.
                                               # Default: config.ru
  -d, [--daemon], [--no-daemon]                # Runs server as a Daemon.
  -u, [--using=name]                           # Specifies the Rack server used to run the application (thin/puma/webrick).
  -P, [--pid=PID]                              # Specifies the PID file.
                                               # Default: tmp/pids/server.pid
  -C, [--dev-caching], [--no-dev-caching]      # Specifies whether to perform caching in development.
      [--early-hints], [--no-early-hints]      # Enables HTTP/2 early hints.
      [--log-to-stdout], [--no-log-to-stdout]  # Whether to log to stdout. Enabled by default in development when not daemonized.
```

# `bin/rails s` を実行する

まずは、development 環境で `rails s` を実行します。

```shell-session
$ bin/rails s -b 0.0.0.0
=> Booting Puma
=> Rails 6.0.0.rc1 application starting in development
=> Run `rails server --help` for more startup options
Puma starting in single mode...
* Version 3.12.1 (ruby 2.6.3-p62), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
```

ブラウザで `http://localhost:3000` にアクセスしてみます。
標準出力に以下が表示されます。

```shell-session
Started GET "/" for 172.19.0.1 at 2019-05-08 12:15:53 +0000
Processing by Rails::WelcomeController#index as HTML
  Rendering /usr/local/bundle/gems/railties-6.0.0.rc1/lib/rails/templates/rails/welcome/index.html.erb
  Rendered /usr/local/bundle/gems/railties-6.0.0.rc1/lib/rails/templates/rails/welcome/index.html.erb (Duration: 6.2ms | Allocations: 310)
Completed 200 OK in 14ms (Views: 7.2ms | ActiveRecord: 0.0ms | Allocations: 5963)
```

# `rails -s --no-log-to-stdout` でログの標準出力を抑制

development 環境で、 --no-log-to-stdout を実行します。

```shell-session
$ bin/rails s -b 0.0.0.0
=> Booting Puma
=> Rails 6.0.0.rc1 application starting in development
=> Run `rails server --help` for more startup options
Puma starting in single mode...
* Version 3.12.1 (ruby 2.6.3-p62), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
```

ブラウザで `http://localhost:3000` にアクセスしてみます。
標準出力には以降、何も表示されません。

# `rails -s -e production` を実行

production 環境で立ち上げます。

```shell-session
$ bin/rails s -b 0.0.0.0 -e production
=> Booting Puma
=> Rails 6.0.0.rc1 application starting in production
=> Run `rails server --help` for more startup options
Puma starting in single mode...
* Version 3.12.1 (ruby 2.6.3-p62), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: production
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
```

ブラウザで `http://localhost:3000` にアクセスしてみます。
ブラウザには、


> The page you were looking for doesn't exist.


と表示されますが、コンソールには何も表示されません。

# `rails -s -e production --log-to-stdout` を実行

production 環境で `--log-to-stdout` オプションつきで実行します。

```shell-session
$ bin/rails s -b 0.0.0.0 -e production --log-to-stdout
=> Booting Puma
=> Rails 6.0.0.rc1 application starting in production
=> Run `rails server --help` for more startup options
Puma starting in single mode...
* Version 3.12.1 (ruby 2.6.3-p62), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: production
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
```

ブラウザで `http://localhost:3000` にアクセスしてみます。
ブラウザには、


> The page you were looking for doesn't exist.


と表示され、コンソールにもエラーが表示されます。

```shell-session
I, [2019-05-08T12:29:44.005167 #1535]  INFO -- : [ebc6915e-973c-4769-ab02-88e4f8d8e0cf] Started GET "/" for 172.19.0.1 at 2019-05-08 12:29:44 +0000
F, [2019-05-08T12:29:44.008346 #1535] FATAL -- : [ebc6915e-973c-4769-ab02-88e4f8d8e0cf]
[ebc6915e-973c-4769-ab02-88e4f8d8e0cf] ActionController::RoutingError (No route matches [GET] "/"):
[ebc6915e-973c-4769-ab02-88e4f8d8e0cf]
[ebc6915e-973c-4769-ab02-88e4f8d8e0cf] actionpack (6.0.0.rc1) lib/action_dispatch/middleware/debug_exceptions.rb:36:in `call'
... (以下略)
```

# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [rails server: Allow to explicitly specify whether to output Rails's log to stdout'](https://github.com/rails/rails/pull/28266)